scrapy爬虫框架

特点:爬取效率高、扩展性强、Python编写跨平台运行

数据流程

Scrapy中的数据流由执行引擎控制,其过程如下:
1、引擎打开一个网站(open a domain),找到处理该网站的Spider并向该spider请求第一个要爬取的URL(s)。
2、引擎从Spider中获取到第一个要爬取的URL并在调度器(Scheduler)以Request调度。
3、引擎向调度器请求下⼀个要爬取的URL。
4、调度器返回下一个要爬取的URL给引擎,引擎将URL通过下载中间件(请求(request)方向)转发给下载器(Downloader)。
5、一旦页面下载完毕,下载器生成一个该页面的Response,并将其通过下载中间件(返回(response)方向)发送给引擎。
6、引擎从下载器中接收到Response并通过Spider中间件(输入方向)发送给Spider处理。
7、Spider处理Response并返回爬取到的Item及(跟进的)新的Request给引擎。
8、引擎将(Spider返回的)爬取到的Item给Item Pipeline,将(Spider返回的)Request给调度器。
9、(从第二步)重复直到调度器中没有更多地request,引擎关闭该网站。


安装scrapy

mac、linux安装

pip install scrapy -i https://pypi.douban.com/simple

window安装
1.scrapy依赖twiste,进入http://www.lfd.uci.edu/~gohlke/pythonlibs/,找到适合的版本,下载对应python版本的Twisted‑18.9.0‑cp36‑cp36m‑win32.whl

安装版本.png

2.在下载安装存放的目录下安装

pip install Twisted‑18.9.0‑cp36‑cp36m‑win32.whl

3.如遇到需要下载pywin32,请下载安装

# Python for Windows Extensions - Browse /pywin32/Build 221 at SourceForge.net
pip install pypiwin32

4.安装scrapy

pip install scrapy

项目创建

1.创建项目

scrapy startproject hupugear(项目名称)

2.创建spiders,进入项目名称下创建

scrapy genspider hupu(蜘蛛名) bbs.hupu.com/gear(访问网站域名)

3.配置文件
修改settings文件

# 防止被爬网站的robots.txt起作用
ROBOTSTXT_OBEY = False   # True改为False

FEED_EXPORT_ENCODING = 'utf-8'   # 添加编码格式

4.蜘蛛执行命令

scrapy crawl hupu(蜘蛛名)

5.保存到文件 (csv, xml, pickle, marshal)

scrapy crawl hupu(蜘蛛名) -o result.json(生成文件名及格式)

6.其他
Spider 属性
name: Spider名字
allowed_domains: 允许爬取的域名
start_urls: Spider启动时爬取的url列表
parse: 负责解析返回的响应,提取数据或进⼀步处理
创建Item
Item是保存爬取数据的容器
解析Response
使用Item
后续Request


scrapy使用

Selector 是 Scrapy的选择器,基于lxml构建,支持xpath, css, 正则表达式匹配

scrapy shell https://bbs.hupu.com/gear
result = response.selector.xpath("//a[@class='truetit']/text()")
type(result)

result = response.selector.xpath("//a[@class='truetit']/text()").extract()
result

SelectorList 和 Selector都可继续调用xpath()和css() 方法

result = response.selector.xpath("//div[contains(@class, 'author')]")
type(result)

result.xpath('./a[1]/text()').extract()
result.xpath('./a[1]/text()').extract_first()
result.xpath('./a[1]/text()')[0]
result.xpath('./a[3]/text()').extract()
result.xpath('./a[3]/text()').extract()[0]
result.xpath('./a[3]/text()').extract_first()

extract()[0] 与 extract_first()区别

result = response.css('.author.box').xpath('./a[2]/text()').extract()

result = response.css('.endreply.box a::text').extract()
result = response.css('.endreply.box a::attr(href)').extract()

result = response.css('.author.box').xpath('./a[2]/text()').re('(.*?)-.*?-')

项目文件

1.spider

1、name:爬虫的名字。
2、allowed_domains:允许爬取的域名,不在此范围的链接不会被跟进爬取。
3、start_urls:起始URL列表,当我们没有重写start_requests()方法时,就会从这个列表开始爬取。
4、custom_settings:用来存放蜘蛛专属配置的字典,这里的设置会覆盖全局的设置。
5、crawler:由from_crawler()方法设置的和蜘蛛对应的Crawler对象,Crawler对象包含了很多项目组件,利用它我们可以获取项目的配置信息,如调用crawler.settings.get()方法。
6、settings:用来获取爬虫全局设置的变量。
7、start_requests():此方法用于生成初始请求,它返回一个可迭代对象。该方法默认是使用GET请求访问起始URL,如果起始URL需要使⽤POST请求来访问就必须重写这个方法,发送POST请求使使用FormRequest方法
8、parse():当Response没有指定回调函数时,该方法就会被调用,它负责处理Response对象并返回结果,从中提取出需要的数据和后续的请求,该方法需要返回类型为Request或Item的可迭代对象(生成器当前也包含在其中,因此根据实际需要可以用return或yield来产生返回值)。
9、closed():当蜘蛛关闭时,该方法会被调用,通常用来做一些释放资源的善后操作。

2.Downloader Middleware

2.1 调度器将Request发给Downloader下载之前,可以对Request进行修改process_request(request, spider)
2.2 下载后生成的Response发给Spider之前,可以对Response进行修改process_response(request, response, spider)
2.3 Downloader或process_request()方法异常
process_exception(request, exception, spider)

3.Pipeline(管道)

图片管道:Image pipeline

get_media_requests(self,item, info):
##  ImagePipeline根据image_urls中指定的url进行爬取,可以通过get_media_requests为每个url生成一个Request。

如:

for image_url in item[‘image_urls’]:
 self.default_headers[‘referer’] = image_url
 yield Request(image_url, headers=self.default_headers)
item_completed(self, results, item, info):
## 图片下载完毕后,处理结果会以二元组的方式返回给item_completed()函数。

这个二元组定义如下:

(success, image_info_or_failure)

其中,第一个元素表示图片是否下载成功;第二个元素是一个字典。如:

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

推荐阅读更多精彩内容