根据现有的知识,写了一个下载妹子图(meizitu.com)Scrapy脚本,把全站两万多张照片下载到了本地。

网站的分析

网页的网址分析

打开网站,发现网页的网址都是以

http://www.meizitu.com/a/+某个数+.html组成,
例如:http://www.meizitu.com/a/5585.html
于是,我就想着在 start_urls 中就按照这三部分来组合。

name = 'meizi'
    allowed_domains = ['www.meizitu.com']
    baseURL = 'http://www.meizitu.com/a/'
    offset = 4633
    end    = '.html'
    start_urls = [baseURL+str(offset)+end]

网页的页面分析

打开某一页网址,图片的链接在 id="picture"下的 img 标签下,

获取图片地址:

srcs = response.css("#picture img::attr(src)").extract()

写一个循环,遍历网站所有网址:

       for src in srcs :
            item = MeizituItem()
            item['picLink'] = src
            print(src)
            yield item
        self.offset +=1

写一个打印函数,便于监视程序运行情况:

        print('addr'+str(self.offset))
        if self.offset > 5586:
            return
        time.sleep(1)
        url = self.baseURL + str(self.offset)+self.end
        print ("url:"+url)

交给 Request 进行下载

        yield scrapy.Request(url, callback=self.parse)

Spider 函数全部代码

# -*- coding: utf-8 -*-
import scrapy
from meizitu.items import MeizituItem
import time
class MeiziSpider(scrapy.Spider):
    name = 'meizi'
    allowed_domains = ['www.meizitu.com']
    baseURL = 'http://www.meizitu.com/a/'
    offset = 4633
    end    = '.html'
    start_urls = [baseURL+str(offset)+end]
    def parse(self, response):
        srcs = response.css("#picture img::attr(src)").extract()
        for src in srcs :
            item = MeizituItem()
            item['picLink'] = src
            print(src)
            yield item
        self.offset +=1
        print('addr'+str(self.offset))
        if self.offset > 5586:  #stop at 5400,for 404
            return
        time.sleep(1)
        url = self.baseURL + str(self.offset)+self.end
        print ("url:"+url)
        yield scrapy.Request(url, callback=self.parse)

细心地同学可能看到了,offset = 4633 为什么不是从 1 开始? 这是因为可能是建站时间的原因,之前的网站里的图片都是在 class="postContent"下的 img 标签里的

这部分 CSS 解析为:

srcs = response.css(".postContent img::attr(src)").extract()

所以,想要爬取整个网站的图片,得分为两部分。爬完一半后,把 CSS 解析替换掉就可以了。

修改 Pipelines,下载图片

import scrapy
from scrapy.pipelines.images import ImagesPipeline
class MeizituPipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
        pic_link = item['picLink']
        print('pic_url'+pic_link)
        yield scrapy.Request(pic_link)

修改 items

import scrapy
class MeizituItem(scrapy.Item):
    picLink = scrapy.Field()

设置 settings

BOT_NAME = 'meizitu'
SPIDER_MODULES = ['meizitu.spiders']
NEWSPIDER_MODULE = 'meizitu.spiders'
IMAGES_STORE = "image"
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/58.0'
ROBOTSTXT_OBEY = False
ITEM_PIPELINES = {
   'meizitu.pipelines.MeizituPipeline': 300,
}

写一个 main 函数,在 PyCharm 中执行

import sys
import os
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
execute(["scrapy", "crawl", "meizi"])

通过实时看着程序运行,爬下来接近三万张照片,1.8G。挑了几张不漏的。。。。

http://www.aibbt.com/a/18101.html

Python网络爬虫 | Scrapy爬取妹子图网站全站照片的更多相关文章

  1. python网络爬虫《爬取get请求的页面数据》

    一.urllib库 urllib是python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在python3中的为urllib.request和urllib. ...

  2. python网络爬虫--简单爬取糗事百科

    刚开始学习python爬虫,写了一个简单python程序爬取糗事百科. 具体步骤是这样的:首先查看糗事百科的url:http://www.qiushibaike.com/8hr/page/2/?s=4 ...

  3. Python网络爬虫_爬取Ajax动态加载和翻页时url不变的网页

    1 . 什么是 AJAX ? AJAX = 异步 JavaScript 和 XML. AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新 ...

  4. Python 2.7和3.6爬取妹子图网站单页测试图片

    1.url= http://www.mzitu.com/74100/x,2为1到23的值 2.用到模块 os 创建文件目录; re模块正则匹配目录名 图片下载地址; time模块 限制下载时间;req ...

  5. Python 2.7_爬取妹子图网站单页测试图片_20170114

    1.url= http://www.mzitu.com/74100/x,2为1到23的值 2.用到模块 os 创建文件目录; re模块正则匹配目录名 图片下载地址; time模块 限制下载时间;req ...

  6. 初识python 之 爬虫:爬取某电影网站信息

    注:此代码仅用于个人爱好学习使用,不涉及任何商业行为!  话不多说,直接上代码: 1 #!/user/bin env python 2 # author:Simple-Sir 3 # time:201 ...

  7. Python协程爬取妹子图(内有福利,你懂得~)

    项目说明: 1.项目介绍   本项目使用Python提供的协程+scrapy中的选择器的使用(相当好用)实现爬取妹子图的(福利图)图片,这个学会了,某榴什么的.pow(2, 10)是吧! 2.用到的知 ...

  8. Python3爬虫系列:理论+实验+爬取妹子图实战

    Github: https://github.com/wangy8961/python3-concurrency-pics-02 ,欢迎star 爬虫系列: (1) 理论 Python3爬虫系列01 ...

  9. 第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息

    第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息 crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻rul地址 有多 ...

随机推荐

  1. python学习资料链接

    1.入门与量化:https://www.v2ex.com/t/257297

  2. latex编辑器

    \prod \left ( a b c \right ) http://latex.codecogs.com/eqneditor/editor.php

  3. 开始使用PHPUnit单元测试

    何为单元测试: 指对软件中的基本单元进行测试,如函数.方法等,以检查其返回值或行为是否符合预期:实际中软件是很复杂的,由许多组件构成,执行流程连贯在一起,要进行单元片段的测试,就需要为其提供执行上下文 ...

  4. Head First C 笔记

    嗨翻c语言 1. 入门 为什么字符从零开始编号? 字符的索引数值表示的是一个偏移量,它表示的是当前所引用的字符与第一个字符之间差多少个字符. 单双引号的区别? 单引号 一个字符,双- 字符串 字符串字 ...

  5. 读取Pdm文件内容(含源码)

    Pdm文件,就是PowerDesigner软件生成的文件,用来设计数据库表结构非常适合.其实,它的文件存储格式就是Xml,网上有很多代码,可以读取pdm文件内容.代码可以使用,但一般只能读取简单的pd ...

  6. springboot入门_helloworld

    开始学习springboot,在此做记录,有不正确之处,还望读者指正. springboot框架的设计目的是用来简化新Spring应用的初始环境搭建以及开发过程.主要体现有:1 xml配置文件,使用s ...

  7. git 域名配置

    在Godaddy购买的域名: 查找DNSpod解析域名,没什么难度,就是添加一条记录,保存而已,记得在添加域名到DNSpod之后,复制两个NS地址到godaddy的域名服务器下: Git项目根目录下创 ...

  8. Spring Data与elasticsearch版本对应关系

  9. Spring Boot 2.0(二):Spring Boot 2.0尝鲜-动态 Banner

    Spring Boot 2.0 提供了很多新特性,其中就有一个小彩蛋:动态 Banner,今天我们就先拿这个来尝尝鲜. 配置依赖 使用 Spring Boot 2.0 首先需要将项目依赖包替换为刚刚发 ...

  10. windows 如何编译 Openssl ?

    windows 如何编译 Openssl ? 编译环境 VS2015 Openssl 1.0.2 ActivePerl 5.24.3 x64 编译步骤 安装 ActivePerl 期间,勾选添加至环境 ...