特点:爬取效率高、扩展性强、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
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