Scrapy爬取妹子图

本来呢,一开始想爬取的是这个网站,http://www.mzitu.com/,但是呢?问题发现比较多,所以先爬取了http://www.meizitu.com/这个网站,下一步再去爬取第一个。 GitHub地址:https://github.com/zhangpu1211/scrapy/tree/master/MeiZitu 首先看一下爬取结果

是不是很激动。。。下面开始正式工作

创建项目

这个就很简单啦,scrapy startproject MeiziTu

创建模板

也是我们之前提到了,用genspider创建一个basic模板 scrapy genspider image http://www.meizitu.com/tag/keai_64_1.html

建立main文件方便调试

和自动生成的scrapy.cfg在同一层,写入下面代码

from scrapy.cmdline import execute
import sys,os
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
execute(['scrapy','crawl','image'])

创建item

我们要爬取的内容,就是图集的地址,名称,以及图片的地址

class MeizituItem(scrapy.Item):
    # define the fields for your item here like:
    name = scrapy.Field()
    imgs_url = scrapy.Field()
    url = scrapy.Field()

分析页面,确定爬取逻辑

目标是爬取可爱目录下的所有图集的图片,并把图片按名称归档,方便查看。 剩下的内容就是简单的用css提取名称和地址了

class MeiZituSpider(scrapy.Spider):
    name = 'image'
    allowed_domains = ['meizitu.com']
    start_urls = ['http://www.meizitu.com/tag/keai_64_1.html']

    def parse(self, response):
        nodes = response.css('.wp-list .tit a')
        for node in nodes:
            url = node.css('::attr(href)').extract_first().strip()
            yield Request(url=parse.urljoin(response.url, url), callback=self.parse_detail)

        index = response.css('#wp_page_numbers li a::text').extract()
        if '下一页' in index:
            next_urls = response.css('#wp_page_numbers li a')[-2].css('a::attr(href)').extract_first()
            yield Request(url=parse.urljoin(response.url, next_urls),callback=self.parse)

    def parse_detail(self, response):
        item = MeizituItem()

        name = response.css('.postmeta h2 a::text').extract_first()
        imgs_url = response.css('.postContent p img::attr(src)').extract()
        item['name'] = name
        item['imgs_url'] = imgs_url
        item['url'] = response.url
        yield item

编辑pipeline实现图片归档

本来呢,我们可以用scrapy自己的'scrapy.pipelines.images.ImagesPipeline': 1,实现图片下载,但是这样下载下来乱糟糟的,没有美感,对于轻微的强迫症或者那就接受不了了。必须要按图集名字分个类 下面的代码继承自ImagesPipeline,通过重写file_path方法实现了图片分类,一开始只重写这个方法,发现不行,图片没有下载,后来发现必须要加上get_media_requests这个方法才可以。

class ArticleImagePipeline(ImagesPipeline):
    def file_path(self, request, response=None, info=None):
        item = request.meta['item']
        title = item['name']
        image_guid = request.url.split('/')[-1]
        filename = 'full/{0}/{1}'.format(title, image_guid)
        return filename

    def get_media_requests(self, item, info):
        """
        :param item: spider.py中返回的item
        :param info:
        :return:
        """
        for img_url in item['imgs_url']:
            referer = item['url']
            yield Request(img_url, meta={'item': item,
                                         'referer': referer})

编辑setting文件

  • 设置遵循爬虫协议为False ROBOTSTXT_OBEY = False
  • 设置item图片字段为imgs_url,设置保存路径为同级目录下images
IMAGES_URLS_FIELD = "imgs_url"
project_dir = os.path.abspath(os.path.dirname(__file__))
IMAGES_STORE = os.path.join(project_dir, 'images')
  • 增加浏览器头 USER_AGENT = 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0'
  • 开启pipeline
ITEM_PIPELINES = {
   'MeiZitu.pipelines.ArticleImagePipeline': 1,
   #'scrapy.pipelines.images.ImagesPipeline': 1,
}

至此,爬取结束,下一步就是爬取http://www.mzitu.com/,代码会更新在GitHub上!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏散尽浮华

分布式监控系统Zabbix3.4-针对MongoDB性能监控操作笔记

公司在IDC机房的一台服务器上部署了MongoDB,由于所存储的业务数据比较重要,所以对MongoDB的监控显得尤为重要!Zabbix监控MongoDB性能的原...

3764
来自专栏kangvcar

Cobbler 快速入门指南

1593
来自专栏JackeyGao的博客

五个很实用的Django 项目推荐

很多Django的包都能很大的增加我们的开发效率或者增加我们项目的功能, 比如: django-rest-framework 、wagtail, 它们带来了很棒...

1143
来自专栏杨建荣的学习笔记

Oracle 12c DG新特性Far Sync(r10笔记第67天)

Oracle的Data Guard技术再11g中有了Active Data Guard,就产生了很多的技术解决方案,比如读写分离,多活的技术支撑等。 12c 中...

5047
来自专栏大白虾谈架构

Power Designer逆向工程导入Oracle表,转为模型加注释

1466
来自专栏云霄雨霁

scrapy ---- 命令行工具

1290
来自专栏Coding01

花 2 小时撸一个 RSS 生成器

现在越来越多的网站都不支持 RSS 订阅了,而作为 RSS 的忠实粉丝,还是希望有个工具可以将自己关注的网站内容聚合在一起,然后实时推送到手机上,及时获取最新消...

7052
来自专栏菩提树下的杨过

java学习:Hibernate入门

相对微软的linq-to-sql或EF框架而言,"Hibernate对于eclipse的集成开发“ 新手并不容易掌握,下面是新手上路的步骤: 一、准备工作: 1...

2088
来自专栏编程

【依葫芦画瓢】SSM-CRUD-3

继续上一篇的讲解【依葫芦画瓢】SSM-CRUD --- 2 概要: 服务端返回json数据,构建员工列表 完成员工新增功能 增加表单前后端校验(jQuery+J...

3295
来自专栏运维

Cacti插件安装之NTOP

一,安装ntop 在官网获得最新源码包 wget http://cdnetworks-kr-2.dl.sourceforge.net/project/nt...

2002

扫码关注云+社区

领取腾讯云代金券