一、简介
Scrapy是一个基于Twisted 的异步处理框架,是针对爬虫过程中的网站数据爬取、结构性数据提取而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
1.1 安装
pip3 install Scrapy
1.2 框架介绍
组成:
· Engine 引擎,处理整个系统的数据流处理、触发事务
· Item 项目,定义爬取结果的数据结构
· Scheduler 调度器
· Downloader 下载器
· Spider 定义爬取逻辑和网页解析规则
· Item Pipeline 项目管道,清洗、验证和存储数据
· Downloader Middlewares 下载器中间件
· Spider Middlewares 蜘蛛中间件
1.3 部分详解
1.3.1 spider
· 定义爬取网站的动作
· 分析爬取下来的网页
爬取循环过程如下:
初始的url初始化request-> Response作为参数返回回调函数 -> 回调函数分析网页内容 1)返回字典或item,可用pipelin处理 2)返回request 回调函数循环请求,直到生成item
1.3.2 Downloader Middleware
Request和Response之间的处理模块,可以完成修改 User-Agent、 处理重定向 、设置代理、失败重试、 设置 Cookies等功能。此模块非常重要
核心方法
process_request(request, spider)
process_response(request, response, spider)
process_exception(request, exception, spider)
1.3.3 Spider Middleware
spider处理机制的子框架
核心方法:
process_spider_input(response, spider)
process_spider_output(response, result, spider)
process_spider_exception(response, exception, spider)
process_start_requests(start_requests, spider)
1.3.4 Item Pipeline
open_spider(spider)
close_spider(spider)
from_crawler(cls, crawler)
1.4 selector
1)直接使用
from scrapy import selector body = '...' selector = Selector(text=body) title = selector.xpath('//title/text()').extract_first() #提取title标签里的内容 print(title)
构建时传入text参数,生成selector对象,通过xpath(), css()等方法提取
2)shell文件
scrapy shell 网址
之后在shell中可以用不同选择器进行操作。selector主要操作Response这个变量来进行解析
· result结果得到selectorlist类型列表变量;
· 可使用xpath()、css() 和正则表达式的方法选择
· extract()/ extract_first() 获取内容
e.g.
result = response.selector.xpath('//a') result result.xpath('.//a[@href="image1.html"]/text()')extract_first() #xpath result.css('a[@href="image1.html"]::text]).extract_first() #css
#备注:css中获取文本和属性需要用::text和::attr()的写法
二、上手项目
内容:爬取 http://quotes.toscrape.com
流程框架:抓取第一页-获取内容和下一页连接-翻页爬取-保存爬取结果
2.1 创建项目
通过命令行来创建项目
scrapy startproject tutorial
创建目录如下
tutorial/ scrapy.cfg tutorial/ __init__.py items.py pipelines.py settings.py spiders/ __init__.py ...
2.2 编写一个Spider
Spider是用户编写用于从单个网站(或者一些网站)爬取数据的类。其包含了一个用于下载的初始URL,如何跟进网页中的链接以及如何分析页面中的内容, 提取生成 item 的方法。
为了创建一个Spider,必须继承 scrapy.Spider 类, 且定义以下三个属性:
· name
· start_urls
· parse: 被调用时,每个初始URL完成下载后生成的 Response 对象将会作为唯一的参数传递给该函数。 该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL的 Request 对象。
scrapy genspider quotes quotes.toscrape.com
2.3 创建Item
Item 是保存爬取到的数据的容器;其使用方法和python字典类似, 并且提供了额外保护机制来避免拼写错误导致的未定义字段错误。
在item中定义相应的字段。编辑 tutorial 目录中的 items.py 文件
import scrapy class QuoteItem(scrapy.Item): title = scrapy.Field() link = scrapy.Field() desc = scrapy.Field()
字段field() 指明了每个字段的元数据
2.4 解析Response
parse()方法的参数 resposne 是 start_urls 里面的链接爬取后的结果 。 所以在 parse()方法中,我们可以直接对 response 变量包含的内容进行解析,比如浏览请求结果的网页源代码,或者进一步分析源代码内容,或者找出结果中的链接而得到下一个请求 。
分析网页结构
进入项目的根目录,执行下列命令启动spider:
scrapy crawl quotes
2.5 使用item
Item可以理解为一个字典,不过在声明的时候需要实例化。 然后依次用刚才解析的结果赋值 Item的每一个字段, 最后将 Item返回即可。
quotes = response.css('.quote') #选择quote的区块 for quote in quotes: item = QuoteItem() item['text'] = quote.css('.text::text').extract_first() item['author'] = quote.css('.author::text').extract_first() item['tags'] = quote.css('.tags .tag::text').extract() yield item
首页的所有内容被解析出来 ,并被赋值成了一个个 QuoteItem。
scrapy shell quotes.toscrape.com #可以在命令行交互
2.6 后续Request-多页抓取
找到next按钮,查看源代码,可以根据链接构建下一个请求。
通过递归调用,回调函数调用自己,实现翻页循环
next = response.css('.pager .next a::attr(href)').extract_first() url = response.urljoin(next) yield scrapy.Request(url=url, callback=self.parse)
2.7 保存到文件
scrapy crawl quotes -o quotes.json #也可以保存成csv,xml等不同文件格式
2.8 使用Item Pipeline
通过item Pipeline可以实现更复杂的操作,比如将数据保存到MongoDB,或者筛选某些有用的item
Pipeline功能主要包括:
- 清理 HTML数据。
- 验证爬取数据,检查爬取字段
- 查重井丢弃重复内容。
- 将爬取结果保存到数据库。
定义一个类并实现process_item()方法
两个参数item和spider实例
from scrapy.exceptions import DropItem class TextPipeline(object): def __init__(self): self.limit = 50 def process_item(self, item, spider): if item['text']: if len(item['text']) > self.limit: item['text'] = item['text'][0:self.limit].rstrip() + '...' #设置长度50截断字符串 return item else: return DropItem('Missing Text')
处理后的item即可存入MongoDB,其中涉及另外几个方法
- from_crawler 类方法@class,通过crawler可以拿到全局配置的信息,在setting.py中。比如在其中设置MongoDB的名称和地址,然后通过这个方法获取
- openspider
- closespider
通过process_item方法执行数据插入操作
执行后可在数据库中查看对应表格
本节对应代码请见:
参考: https://scrapy-chs.readthedocs.io/zh_CN/latest/intro/tutorial.html
##本系列内容为《python3爬虫开发实战》学习笔记。本系列博客列表如下:
(零)学习路线
(一)开发环境配置
(二)爬虫基础
(三)基本库使用
(四)解析库使用
(五)数据存储
(六)Ajax数据爬取
(七)动态渲染页面爬取Selenium
持续更新...