美文网首页python 爬虫每天写500字每天写1000字
使用Scrapy ItemLoaders爬取整站图片

使用Scrapy ItemLoaders爬取整站图片

作者: 向右奔跑 | 来源:发表于2016-06-06 14:40 被阅读3033次

先看一下Item Loaders的说明,官网对ItemLoaders的介绍是,如果想要保存单个数据或者对数据执行额外的处理,那将是 Item Loaders发挥作用的地方。

Item Loaders provide a convenient mechanism for populating scraped Items.

Item Loaders are designed to provide a flexible, efficient and easy mechanism for extending and overriding different field parsing rules, either by spider, or by source format (HTML, XML, etc) without becoming a nightmare to maintain.

一句话,ItemLoader提供了一种简单高效,可扩展的方式来填充字段。

本文重点是在Scrapy中使用ItemLoaders下载图片,先对比一下Item和ItemLoader。

一、Items使用

Item的作用是把非结构性的数据源(网页)提取为结构性的数据。Item
对象是种简单的容器,保存了爬取到得数据。可以理解为对象。

** 1) 声明定义Item:**

from scrapy import Field,Item

class ImageloadItem(Item):
    url = Field()
    name = Field()
    tags = Field()
    image_urls = Field()
    images = Field()

Item中没有不同字段类型(数据类型),字段类型由存入时的数据类型决定。

2) 在Spider中设置字段的值:

 item = ImageloadItem()
 item['url']= response.url
 item['name'] = name     #name在之前已提取
 item['tag'] = tag       #tag在之前已提取
 ... ....

 return item  #提交item

当Item在Spider中被收集之后,它将会被传递到Item Pipeline,一些组件会按照一定的顺序执行对Item的处理。

二、ItemLoader使用

同样需要定义Item,ItemLoader 用在Spider保存数据。

   def parse_item(self, response):

        l = ItemLoader(item=ImagetestItem(), response=response)
        l.add_xpath('name', '//h2/a/text()')
        l.add_xpath('tags', "//div[@id='maincontent']/div[@class='postmeta  clearfix']/div[@class='metaRight']/p")
        l.add_xpath('image_urls', "//div[@id='picture']/p/img/@src", Identity())  

        ## 上面image_urls 提取的是一组图片的src数据

        l.add_value('url', response.url)

        return l.load_item()   #提交数据到pipeline处理

此处使用Itemloader提交了一组数据,如果使用Item这里应该使用循环,提交单个数据。

PipeIine处理数据

class ImageloadPipeline(object):
    def process_item(self, item, spider):

        for image_url in item['image_urls']:
            print image_url
            ##  处理下载图片...
        return item

在这里循环处理图片的下载。

启用Item Pipeline组件,在settings.py配置:

ITEM_PIPELINES = {'imagetest.pipelines.ImageloadPipeline': 1}

分配给每个类的整型值,确定了他们运行的顺序,item按数字从低到高的顺序,通过pipeline,通常将这些数字定义在0-1000范围内。

三、案例 -- 使用Scrapy下载整站图片

案例为使用Scrapy爬虫整站抓取妹子图。http://www.meizitu.com/

下载的图片

1) Scrapy Spider处理流程:

www.meizitu.com 这个站点,页面分为3类:

  • 首页 ,爬虫入口,中部是图片链接,下部有分页信息
  • 列表页,由分页信息进来,爬虫获得后续的url,每个列表页下部有分页
  • 内容页,由首页和列表页url过来处理,获得下载图片的url
Spider处理流程

2) Spider中的方法:

  • parse()

    • 处理首页图片url, 调用parse_item()
    • 处理首页上的分页,获得下一页url,调用parse()
    • 处理列表页url, 获得列表页上图片url,调用parse_item;处理页面上分页url, 获得下一页url,递归调用parse()
  • parse_item()
    获得内容页上的图片url,图片src保存在item loader中。

3) 在pipline中处理图片下载

with open(file_path, 'wb') as handle:
                    response = requests.get(image_url, stream=True)
                    for block in response.iter_content(1024):
                        if not block:
                            break

                        handle.write(block)

另外,防止爬虫过度频度访问网站,在setting.py中设置

DOWNLOAD_DELAY = 0.25    # 250 ms of delay
被限制访问!

之前也写了一篇文章《Python爬虫框架Scrapy快速入门》 讲到图片下载,没有用到ItemLoader。大家可以参考。


参考:

  1. Spider0.25官方文档
  2. 网络代码《Python使用Scrapy爬取妹子图》

github下载

相关文章

  • 使用Scrapy ItemLoaders爬取整站图片

    先看一下Item Loaders的说明,官网对ItemLoaders的介绍是,如果想要保存单个数据或者对数据执行额...

  • scrapy 爬取整站图片

    这是一个练习项目,这里要感谢简书的向右奔跑,从开始学习scrapy开始,跟向右奔跑老师学习了很多,这个项目也是向右...

  • scrapy爬取妹子图

    废话不多说,爬取妹子图片使用scrapy深度爬取,抓取妹子图全站图片 1.首先确认开发环境 使用scrapy框架,...

  • Scrapy爬取图片续集

    上一篇咱们讲解了Scrapy的工作机制和如何使用Scrapy爬取美女图片,而今天接着讲解Scrapy爬取美女图片,...

  • scrapy爬取整个网页时如何避免链接失效

    scrapy爬取整个网页时如何避免链接失效 最近在使用scrapy爬取网页时遇到很多图片不能正常显示、a标签链接失...

  • 2018-07-15

    Scrapy框架学习 - 使用内置的ImagesPipeline下载图片 需求分析 需求:爬取斗鱼主播图片,并下载...

  • 六. 项目实战:下载360图片

    爬取网址:http://image.so.com/爬取信息:爬取图片爬取方式:scrapy框架存储方式:Image...

  • scrapy简书整站爬取

    数据同步及异步存储到MySQL 对于ajax 加载的数据用selenium辅助加载解析 整站爬取提取url规则 j...

  • [scrapy]scrapy爬取京东商品信息——以自营手机为例

    关于scrapy以及使用的代理轮换中间件请参考我的爬取豆瓣文章: 【scrapy】scrapy按分类爬取豆瓣电影基...

  • 【读书笔记】_爬虫

    使用urllib模块爬取图片并下载到本地 python爬虫框架-Scrapy学习自:http://python.j...

网友评论

  • f1f7209cc913:如果要自定义itemloader包括其中的输入输出processor, 这段代码应该放在spider里还是item里啊?
  • xiaoxiaoyu_5be6:Identity()函数是干嘛的
    f1f7209cc913:class scrapy.loader.processors.Identity
    The simplest processor, which doesn’t do anything. It returns the original values unchanged. It doesn’t receive any constructor arguments, nor does it accept Loader contexts.
    来自于官方文档,是内置的输入输出处理器,不作任何处理
  • xcaojianhong:楼主,有什么方法可以去重,我用循环写的递归调用parse 好多页面都重复访问的,导致效率特别低。
    向右奔跑:@xcaojianhong 别啊,你今天就休息下吧,陪陪女朋友吧
  • xcaojianhong:还有用urlretrieve什么图片也下载不了,都是403错误,setting中也增加了USER_AGENT的啊
    xcaojianhong:百度了一下,这个函数还需要在spider 中重新写
    opener=urllib.request.build_opener()
    opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36')]
    urllib.request.install_opener(opener)
  • xcaojianhong:ItemLoaders有什么用,直接用《Python爬虫框架Scrapy快速入门》 里面讲到的方法好像更简单,也容易理解。

本文标题:使用Scrapy ItemLoaders爬取整站图片

本文链接:https://www.haomeiwen.com/subject/bsvrdttx.html