用py写爬虫也写过一些但是一直没有尝试过scrapy,大概自己写的项目都比较小,用beautifulsoup就搞定了不太需要用这种功能全面的框架,不过这两天还是接触了一下,用scrapy爬了一波堆糖的图片。

安装scrapy

在ubuntu上安装并不麻烦,不过似乎要装很多依赖的库,还是出了一些问题,把提示没有的库都装上就差不多行了,还有在我鼓捣了半天scrapy之后,第二天django版本莫名其妙变成了1.6.3,原来是1.7.3,不知道是不是这个原因,总之觉得很摸不着头脑,安装的scrapy是1.0版本。

创建项目

跟着文档一步一步来…先cd到某个文件夹下

scrapy startproject duitang

自动生成一个文件夹

duitang/scrapy.cfg            # deploy configuration fileduitang/             # project's Python module, you'll import your code from here__init__.pyitems.py          # project items filepipelines.py      # project pipelines filesettings.py       # project settings filespiders/          # a directory where you'll later put your spiders__init__.py...

然后是创建spider,也就是实现具体抓取逻辑的文件,scrapy提供了一个便捷的命令行工具,cd到生成的项目文件夹下执行

scrapy genspider mydomain mydomain.com

会在spiders文件夹下生成一个.py文件。到这里差不多准备工作完成了,接下来需要人工找出图片链接的规律。

抓取逻辑

需求:

搜索一个topic然后把搜索出来的图片下载下来。

获取页面链接

在堆糖上搜索了一下,找到搜索结果页面链接格式为

http://www.duitang.com/search/?kw=keyword&type=feed

keyword是搜索的关键词,然后这个页面会展示很多搜索到的结果,但是因为堆糖使用的是瀑布流的展示方式,拉到页面底部会加载出更多图片,但是spider并不能实现这一过程。
怎么实现不仅仅只抓取这一个页面呢,尝试了一下往下拉,在网页的network的console里面里面找到了加载下一页的链接

如图是之后加载出来的,最上面一行的完整链接是

http://www.duitang.com/search/?page=2&kw=%E5%A4%A7%E5%9C%A3&type=feed&_type=&_=1444971822370

在新标签页中打开是一堆json数据,尝试把&_type=&_=1444971822370删掉,果然出现了网页的页面,这时候网页链接和原来只差一个page=2,所以知道了只要加上page=x就可以爬到后面的页面了。

分析网页查找图片链接

接下来是在网页里面找到图片的链接,一般的图片就像上面图中加载出来的那样

http://img5.duitang.com/uploads/item/201509/20/20150920131020_jZKEh.thumb.224_0.jpeg

这样的格式

然而之后发现这是缩略图,所有的图都缩成了224宽度,之后点开大图,发现还是不对,虽然放大了也只是放大到700宽度,链接中的224全都变成了700,不过大图点开就是原图了。。。

然而原图和缩略图链接的差别不过是没有.thumb.224_0这一段,所以就好处理了,把缩略图的链接抓取下来然后改一下链接字符串就可以得到原图链接。

抓取实现

获取链接

即scrapy的工作流程,首先在创建的spider文件中实现逻辑,我的爬虫名字叫dasheng,因为爬的是大圣归来的图,自动生成的代码里面是这样:

import scrapyclass $classname(scrapy.Spider):name = "$name"allowed_domains = ["$domain"]start_urls = ('http://www.$domain/',)def parse(self, response):pass

$classname是形似DashengSpider这样的的类名,当然也没有特别严格的命名要求,$name是这个爬虫的名字,很重要,后面执行程序的时候就是按照这个名字执行的。
allowed_domains是限制爬虫的抓取范围在某个站点内
start_urls是开始抓取的链接,也可以是list格式。
parse方法就是对页面信息进行处理,它的参数就是访问页面的response

首先start_urls里面改成自己的链接,然后尝试在页面中获取图片链接,以前用beautifulsoup写的时候都是自己试一下改一下感觉很不方便,scrapy提供了一个shell可以轻松对response进行处理,命令行格式如下

scrapy shell [url]

执行会访问这个链接并获取response,之后就可以对response进行处理了。
scrapy提供xpath和css两种选择器来选择需要的元素,我这里用的是xpath,具体格式参考文档,感觉挺简单的。
需要的链接是在
response.xpath(‘//a[@class=”a”]/img/@src’)这个元素中,所以parse方法这样写

for sel in response.xpath('//a[@class="a"]/img/@src'):detaillink = sel.extract().replace('.thumb.224_0', '')print detaillink

response.xpath(‘//a[@class=”a”]/img/@src’)获取到的是一个选择器实例对象,而sel.extract()函数是把选择器其中的内容抽取出来,然后调用replace函数处理链接字符串。
这时候可以运行一下爬虫试试

scrapy crawl spider_name

这样就开始爬了,在终端可以看到输出的链接还有很多其他的信息。可能会有奇奇怪怪的报错?…对照着检查一下就好。

下载图片

当然我最后的目的是把图片下载到本地所以只获取图片链接还不够,百度了一下说可以用Item Pipeline中的Image Pipeline,这个pipeline,个人理解是对抓取获得的数据进行进一步处理的文件。要使用这一部分还需要一些准备工作。
首先在settings.py中找到设置管道的部分(大概60几行),改成如下:

# Configure item pipelines
# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
#ITEM_PIPELINES = {#    'duitang.pipelines.SomePipeline': 300,
#}
ITEM_PIPELINES = {'scrapy.pipelines.images.ImagesPipeline': 1}IMAGES_STORE = 'pic/'  # 存储位置IMAGES_EXPIRES = 15  # 15天内不抓取重复的图片

然后在items.py中定义一个item,它是一个类似字典的东西,用来存储爬到的信息,储存在scrapy特有的Field里面,Image Pipeline要求两个必须的item属性image_urls和images,定义如下。

import scrapy
class DuitangItem(scrapy.Item):# define the fields for your item here like:image_urls = scrapy.Field()images = scrapy.Field()

接下来改写spider的部分,把爬到的链接储存在image_urls字段中

def parse(self, response):for sel in response.xpath('//a[@class="a"]/img/@src'):item = DuitangItem()detaillink = sel.extract().replace('.thumb.224_0', '')item['image_urls'] = [detaillink] yield item

接下来在pipleline.py中重写管道函数

import scrapy
from scrapy.pipelines.images import ImagesPipeline
from scrapy.exceptions import DropItemclass DuitangPipeline(ImagesPipeline):def get_media_requests(self, item, info):for image_url in item['image_urls']:yield scrapy.Request(image_url)def item_completed(self, results, item, info):image_paths = [x['path'] for ok, x in results if ok]if not image_paths:raise DropItem("Item contains no images")item['image_paths'] = image_pathsreturn item

这样就完成了,接下来在运行一遍爬虫,就可以看到图片被下载到pic文件夹下的full文件夹了。

注意:imge_urls属性的格式是列表而不是字符串,因为这个问题栽了一坑。

但是到这时候,大概只爬到了第一页的图片,需要更改链接中的page数值。所以最终代码是这样的

# -*- coding: utf-8 -*-
import scrapy
from duitang.items import DuitangItemclass DtSpider(scrapy.Spider):name = "cbl"allowed_domains = ["duitang.com"]page = 1start_urls = []for page in range(1,100):start_urls.append("http://www.duitang.com/search/?page=%s&kw=keyword&type=feed" % page)def parse(self, response):for sel in response.xpath('//a[@class="a"]/img/@src'):item = DuitangItem()detaillink = sel.extract().replace('.thumb.224_0', '')item['image_urls'] = [detaillink] yield item

完毕,100页大概能抓2000+图片的样子,速度很快。

使用scrapy抓取堆糖图片相关推荐

  1. 把url地址复制到粘贴板上_写个简单的python爬虫爬取堆糖上漂亮的小姐姐

    简单的爬虫入门实战 最近刚学了python的爬虫,刚好可以用来爬取漂亮的图片作为壁纸,网上美图网站有很多,比如:花瓣,堆糖.它们请求图片数据的方式差不多类似,都是通过用户不断下滑加载新的图片,这种请求 ...

  2. 用Scrapy抓取游民星空每周壁纸精选的图片

    很早之前就想抓一些壁纸,本人喜欢去看游民星空(一个主打游戏类的综合性网站).然后很早之前就眼馋它的每周壁纸了,所以这次就将该站的每周壁纸集合中的所有壁纸抓了一下(虽然有打包的可以下,但是还是想尝试一下 ...

  3. Java获取游戏头像_java爬取堆糖所有头像(高质量版头像)

    百度贴吧的用户头像爬下来之后,图片经过裁剪,尺寸太小,都是110*110之类的,并且有很多用户被注销后,头像是缩略图重复,所以爬了堆糖里面的头像,堆糖里的头像质量还是蛮高的. 堆糖官网:www.dui ...

  4. scrapy抓取淘宝女郎

    scrapy抓取淘宝女郎 准备工作 首先在淘宝女郎的首页这里查看,当然想要爬取更多的话,当然这里要查看翻页的url,不过这操蛋的地方就是这里的翻页是使用javascript加载的,这个就有点尴尬了,找 ...

  5. 真正意义上能够全部抓取昵图网全站图片

    真正意义上能够全部抓取昵图网全站图片 # -*- coding: utf-8 -*- import scrapy from scrapy.http import Request from nipic. ...

  6. 使用python抓取落网期刊图片

    使用python抓取落网期刊图片 虽然使用python开发也将近两年了,但工作中使用python更多处理业务逻辑,数据加工等,难免有些枯燥.乏味.一直听闻python在web数据爬取.数据分析上有无可 ...

  7. scrapy抓取淘宝女郎 1

    scrapy抓取淘宝女郎 准备工作 首先在淘宝女郎的首页这里查看,当然想要爬取更多的话,当然这里要查看翻页的url,不过这操蛋的地方就是这里的翻页是使用javascript加载的,这个就有点尴尬了,找 ...

  8. 逆向爬虫18 Scrapy抓取全站数据和Redis入门

    逆向爬虫18 Scrapy抓取全站数据和Redis入门 一.全站数据抓取 1. 什么是抓取全站数据? 我们曾经在过猪八戒,图片之家,BOSS直聘等网站,利用网站官方提供的搜索功能,搜索指定关键词的内容 ...

  9. python爬虫框架:scrapy抓取企业名录

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资 ...

  10. Python进阶之Scrapy抓取苏宁图书数据

    Python进阶之Scrapy抓取苏宁图书数据 1. 需求 2. 代码示例: 创建项目 start.py settings.py iterms.py snb.py pipelines.py 3. 注意 ...

最新文章

  1. 如何避免重复提交?分布式服务的幂等性设计!
  2. Kinect For Windows V2开发日志一:开发环境的配置
  3. Dsure-HTML5网站前端开发框架,网页设计师福利
  4. sql 拼接int类型的字段_SQL 基础教程—第一章:4. 表的创建
  5. k型热电偶分度表_一张表搞定热电偶与热电阻的问题
  6. 机器学习篇-指标:AUC
  7. Android6.0 源码修改之 仿IOS添加全屏可拖拽浮窗返回按钮...
  8. 增长率不用计算机,事业单位行测:这类资料分析题根本不用计算
  9. 前端学习(3119):react-hello-react的解决类中方法的this
  10. C++(STL):27 ---关联式容器set源码剖析
  11. 京东二面:MySQL 主从延迟、读写分离 7 种解决方案!
  12. Python 分离路径和文件名,分离文件名和后缀
  13. SAP License:BCS进阶第五篇-BCS合并现金流量表的实现
  14. SQL Server 使用Detach和Attach 方式 移动数据库位置
  15. HDU 1019 least common Multipy
  16. 获取网站url ico小图标
  17. 基于Stata reshape命令的面板数据整理
  18. L1-8 雀魂majsoul (20 分)
  19. Linux云计算机构-防盗防击防破解三大工具:webshell、ddos-deflate、Medusa
  20. Spring Boot 项目 启动 端口经常被占用 彻底解决方案

热门文章

  1. 前端:标准删除确认提示
  2. 计算机课ppt插入图片,PPT中图片的巧妙切换 -电脑资料
  3. Ubuntu 11.04 安装配置过程
  4. HTML在线转换JS
  5. 工作,到底意味着什么
  6. bzoj4816[SDOI2017]数字表格
  7. noip2018秃页记
  8. win10文件夹全屏的快捷键
  9. 【价值积累】属于我的创业感悟
  10. Python专栏 | ICA应用:如何识别伪影信号?(一)