使用Scrapy ItemLoaders爬取整站图片

先看一下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下载

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,165评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,503评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,295评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,589评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,439评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,342评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,749评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,397评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,700评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,740评论 2 313
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,523评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,364评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,755评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,024评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,297评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,721评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,918评论 2 336

推荐阅读更多精彩内容

  • scrapy学习笔记(有示例版) 我的博客 scrapy学习笔记1.使用scrapy1.1创建工程1.2创建爬虫模...
    陈思煜阅读 12,644评论 4 46
  • 序言第1章 Scrapy介绍第2章 理解HTML和XPath第3章 爬虫基础第4章 从Scrapy到移动应用第5章...
    SeanCheney阅读 15,014评论 13 61
  • 有半个月没有更新了,最近确实有点忙。先是华为的比赛,接着实验室又有项目,然后又学习了一些新的知识,所以没有更新...
    qiye阅读 9,825评论 35 87
  • 吃完早饭带着小麦子跟爸爸一起出门了。本来是要去菜场买南瓜做馒头的,结果小麦子在外面逛了一大圈。还跑去卖汾酒的地方玩...
    孙追光阅读 344评论 0 0
  • 非常有幸能够参加此次华北区境外保险培训班,满满一天半的课程下来,收获颇丰。 首先感谢领导的大力支持、老师们的精彩分...
    lily小莉啊阅读 535评论 1 4