本篇文章我们以360图片为例,介绍scrapy框架的使用以及图片数据的下载。

  目标网站:http://images.so.com/z?ch=photography

  思路:分析目标网站为ajax加载方式,通过构造目标url从而请求数据,将图片数据存储在本地,将图片的属性存储在mongodb中。

  1、首先定义我们需要抓取的字段

  1. class ImageItem(scrapy.Item):
  2. # define the fields for your item here like:
  3. # name = scrapy.Field()
  4. collection = 'images' #代表mongodb的的集合名称
  5. #下面四个字段分别是图片id,链接,标题,缩率图
  6. id = Field()
  7. url = Field()
  8. title = Field()
  9. thumb = Field()

  

  2、构造我们要爬取的url;由于目标网站时ajax加载的,展示的数据在http://images.so.com/zj?ch=photography&sn=30&listtype=new&temp=1中以json的形式存储,不断的下拉页面之后,每次变化的参数只有sn,并且每次以30的增量增加,第一页sn=30,第二页为60,则sn和页码的关系为sn*30,所以我们可以构造出url

  1. #定义起始需要爬取的url列表,首先从spider中发送给调度引擎
  2. def start_requests(self):
  3. data = {'ch':'photography','listtype':'new','temp':1}
  4. base_url = 'http://images.so.com/zj?'
  5. for page in range(1,self.settings.get('MAX_PAGE') + 1): #MAX_PAGE以参数的形式在settings文件中配置
  6. data['sn'] = page * 30
  7. url = base_url + urlencode(data)
  8. yield Request(url,self.parse)

  3、编写解析函数,返回的数据是json格式

  1. #解析函数
  2. def parse(self, response):
  3. result = json.loads(response.text) #将JSON文本字符串转为JSON对象
  4. for image in result.get('list'):
  5. item = ImageItem()
  6. item['id'] = image.get('imageid')
  7. item['url'] = image.get('qhimg_url')
  8. item['title'] = image.get('group_title')
  9. item['thumb'] = image.get('qhimg_thumb_url')
  10. yield item

  4、编写pipeline文件,将图片属性数据存入mongo,将图片存储到本地

  1. import pymongofrom scrapy import Request
  2. from scrapy.exceptions import DropItem
  3. from scrapy.pipelines.images import ImagesPipeline
  4.  
  5. #定义了两个个Pipeline,分别为数据存储到mongodb,图片下载到本地
  6. #在settings中定义Pipeline的执行顺序
  7. class MongoPipeline(object):
  8. def __init__(self,mongo_url,mongo_db):
  9. self.mongo_url = mongo_url
  10. self.mongo_db = mongo_db
  11.  
  12. @classmethod
  13. def from_crawler(cls,crawler):
  14. return cls(
  15. mongo_url=crawler.settings.get('MONGO_URL'),
  16. mongo_db=crawler.settings.get('MONGO_DB')
  17. )
  18.  
  19. def open_spider(self,spider):
  20. self.client = pymongo.MongoClient(self.mongo_url)
  21. self.db = self.client[self.mongo_db]
  22.  
  23. def process_item(self, item, spider):
  24. self.db[item.collection].insert(dict(item))
  25. return item
  26.  
  27. def close(self,spider):
  28. self.client.close()
  29.  
  30. class ImagesPipeline(ImagesPipeline):
  31. def file_path(self,request,response=None,info=None):
  32. url = request.url
  33. file_name = url.split('/')[-1]
  34. return file_name
  35.  
  36. def item_completed(self,results,item,info):
  37. image_paths=[x['path'] for ok,x in results if ok]
  38. if not image_paths:
  39. raise DropItem('Image Download Failed')
  40. return item
  41.  
  42. def get_media_requests(self,item,info):
  43. yield Request(item['url'])

第一个为MongoPipeline,通过类方法from_crawler从settings文件中获取mongodb的配置信息,将蜘蛛文件中返回的item存入mongo数据库。

第二个为ImagesPipeline,scrapy提供了专门处理下载的Pipeline,包括文件下载和图片下载,下载过程支持异步和多线程,效率极高。

首先定义存储文件的路径,需要定义一个IMAGES_STORE变量,在settings文件中添加一行

  1. IMAGES_STORE = './images

我们将路径定义在当前路径下的images中,即下载的图片都会存储在这个文件夹中。

  内置的ImagesPipeline会默认读取Item对象的image_urls字段,并认为该变量是一个列表,会遍历这个字段,然后取出url进行图片下载。

  但是我们上面定义的模型可以看出,Item对象的图片连接并不是image_url,也不是列表形式的,而是单个url,所以为了实现下载,需要重写ImagePipeline,继承内置的ImagePileline,再次我们重写了三个方法,分别是

  1)get_media_requests():它的第一个参数item就是爬取生成的Item对象,我们将它的url取出来,直接生成Request对象返回,从而加入调度队列,等待被调度,执行下载。

  2)file_path():它的第一个参数request就是当前下载的Request对象,这个方法用来返回保存的文件名称,直接将图片链接的最后一部分当做文件名称即可。

  3)item_completed():它是当单个Item完成下载时的处理方法,因为并不是每张图片都会下载成功,所以需要分析下载结果并剔除下载失败的图片,该方法的第一个参数results就是该item对象的下载结果,它是一个列表的形式,列表的每一个元素都是一个元组,其中包含了下载成功或者失败的信息。

  5、在settings中激活pipeline,并配置需要的配置项

  1. ITEM_PIPELINES = {
  2. 'images360.pipelines.ImagesPipeline': 300,
  3. 'images360.pipelines.MongoPipeline': 301,
  4. }

  6、执行爬虫,获取数据即可。

  scrapy crawl  images

  项目完整代码:https://gitee.com/liangxinbin/Scrpay/tree/master/images360

Scrapy实战篇(六)之爬取360图片数据和图片的更多相关文章

  1. Scrapy 通过登录的方式爬取豆瓣影评数据

    Scrapy 通过登录的方式爬取豆瓣影评数据 爬虫 Scrapy 豆瓣 Fly 由于需要爬取影评数据在来做分析,就选择了豆瓣影评来抓取数据,工具使用的是Scrapy工具来实现.scrapy工具使用起来 ...

  2. (3)分布式下的爬虫Scrapy应该如何做-递归爬取方式,数据输出方式以及数据库链接

    放假这段时间好好的思考了一下关于Scrapy的一些常用操作,主要解决了三个问题: 1.如何连续爬取 2.数据输出方式 3.数据库链接 一,如何连续爬取: 思考:要达到连续爬取,逻辑上无非从以下的方向着 ...

  3. 爬虫(十七):Scrapy框架(四) 对接selenium爬取京东商品数据

    1. Scrapy对接Selenium Scrapy抓取页面的方式和requests库类似,都是直接模拟HTTP请求,而Scrapy也不能抓取JavaScript动态谊染的页面.在前面的博客中抓取Ja ...

  4. Scrapy实战篇(七)之爬取爱基金网站基金业绩数据

    本篇我们以scrapy+selelum的方式来爬取爱基金网站(http://fund.10jqka.com.cn/datacenter/jz/)的基金业绩数据. 思路:我们以http://fund.1 ...

  5. Scrapy框架学习(四)爬取360摄影美图

    我们要爬取的网站为http://image.so.com/z?ch=photography,打开开发者工具,页面往下拉,观察到出现了如图所示Ajax请求, 其中list就是图片的详细信息,接着观察到每 ...

  6. python框架Scrapy中crawlSpider的使用——爬取内容写进MySQL

    一.先在MySQL中创建test数据库,和相应的site数据表 二.创建Scrapy工程 #scrapy startproject 工程名 scrapy startproject demo4 三.进入 ...

  7. 爬虫学习(二)--爬取360应用市场app信息

    欢迎加入python学习交流群 667279387 爬虫学习 爬虫学习(一)-爬取电影天堂下载链接 爬虫学习(二)–爬取360应用市场app信息 代码环境:windows10, python 3.5 ...

  8. 【图文详解】scrapy爬虫与动态页面——爬取拉勾网职位信息(2)

    上次挖了一个坑,今天终于填上了,还记得之前我们做的拉勾爬虫吗?那时我们实现了一页的爬取,今天让我们再接再厉,实现多页爬取,顺便实现职位和公司的关键词搜索功能. 之前的内容就不再介绍了,不熟悉的请一定要 ...

  9. item pipeline 实例:爬取360摄像图片

    生成项目 scrapy startproject image360 cd Image360 && scrapy genspider images  images.so.com 一. 构 ...

  10. scrapy之盗墓笔记三级页面爬取

    #今日目标 **scrapy之盗墓笔记三级页面爬取** 今天要爬取的是盗墓笔记小说,由分析该小说的主要内容在三级页面里,故需要我们 一一解析 *代码实现* daomu.py ``` import sc ...

随机推荐

  1. 服务器搭建lamp环境

    使用的例子:服务器版本内核centos 7.04     Xshell连接到您的服务器上,使系统处于最新状态执行以下命令, yum update -y     利用yum命令安装Apache执行命令, ...

  2. django 单点登录思路-装饰器

    def the_one(func): '''自定义 验唯一证在线 装饰器''' def check_login_status(request): if request.session.get('qq' ...

  3. 大数据 - hadoop三台linux虚拟服务器 - 初始化部署

    搭建hadoop环境 1.解压Hadoop的安装包,解压到modules文件夹中.(安装包下载地址:http://archive.apache.org/dist/hadoop/core/hadoop- ...

  4. SQLServer 2008R2主从部署实战

    说明: 由于临时接到做OA的主从环境,基于Windows 200R2 SQLServer2008 R2,由于搜索的资料都不完整,好多重要之处有遗漏,亲自动手做了好几次,填完了坑,整理以备忘记与分享,如 ...

  5. QWaiteCondition思考3

    QWaitConditioin::wait() 接收一个mutex作为参数,这个mutex应该被调用线程初始化为锁定状态.在线程进入休眠状态(waite)之前,mutex会被解锁.当线程被唤醒(Wak ...

  6. 清除cookie

    function clearCookie(){ if(document.cookie.length < 2048){ return; } //cookie大于2kb,清除cookie var c ...

  7. Hive与HBase表联合使用Join的问题

    hive与hbase表结合级联查询的问题,主要hive两个表以上涉及到join操作,就会长时间卡住,查询日志也不报错,也不会出现mr的进度百分比显示,shell显示如下图 如图: 解决这个问题,需要修 ...

  8. O/R关系的深入理解(转载)

    本文转载自aa8945163: http://aa8945163.iteye.com/blog/859713 什么是O/R Mapping? 广义上,ORM指的是面向对象的对象模型和关系型数据库的数据 ...

  9. python学习1---列表、矩阵、数组

    1.列表与数组区别 numpy数组的所有元素类型是相同的,而列表的元素类型是任意的. 2.numpy数组与矩阵区别 矩阵必须是二维的,数组可以是多维的,matrix是array的一个分支. matri ...

  10. post表单翻页保存搜索条件

    问题:搜索条件下的数据,进行翻页行为后,搜索条件丢失 1.搜索表单 2.翻页 解决:既然点击页面跳转的a标签使用的方法是GET,而点击“搜索”按钮使用的方法是POST,那么可以让点击a标签实际上就是提 ...