以下的内容均为自己看书自学的分享,加深自己对于Scrapy的整体框架的理解。
Scrapy分析
1. 数据流总览图
1.1 Scrapy整体框架图和数据流总览
图片为自己学习总结所画,有不对的地方可以评论私信指出。
2. 重要的组件和中间件分析
2.1 Spider
2.1.1 Spider运行流程
Spider是最核心的类,定义了如何爬取某个网站的流程和解析方式。简单的来说其所要做的就是两件事:
- 定义爬取网站的动作
- 分析爬取下来的网页
整个的爬取流程如下:
- 以初始的URL初始化Request,并设置回调函数。当该Request成功请求返回后,Response生成并作为参数传递给回调函数。
- 在回调函数内分析返回的网页内容。返回的结果有两种形式,(1)解析到的有效结果返回字典或Item对象,它们可以经过处理后直接保存。(2)解析得到的下一个链接,可以利用此链接构造Request并设置新的回调函数,返回Request等待后续的调度。
- 如果返回的是字典或Item对象,可以通过命令行的方式直接存入本地文件。若设置了Pipeline的话,便利用其中的自定义的方法进行处理后保存。
- 如果返回的是Request对象的话,那么Request执行成功后得到的Response会被传递给Request中定义的回调函数,在回调函数中我们可以再次使用选择器来分析新的网页内容,并根据分析的数据生成Item。
2.1.2 Spider类的基础属性
Spider默认继承的是scrapy.spiders.Spider。提供了默认的 start_requests()方法的实现,读取并请求start_urls属性,并根据返回结果调用parse()方法解析结果。
- name:爬虫的名称,必须是唯一的,创建项目的时候自动生成。不过可以生成多个相同的Spider实例,数量没有限制。
- allowed_domains。允许爬取的域名,是可选配置,不在此范围内的连接不会跟进爬取。
- start_urls。起始的URL列表,当没有实现start_requests()方法时,默认会从这个列表开始抓取。
- custom_settings。一个字典,专属于Spider的配置,此设置会覆盖项目的全局设置。此设置必须在初始化前被更新,必须定义成类的变量。
- crawler。它是由from_crawler()方法设置的,利用它可以获取项目的一些配置信息,如在settings中配置的信息。
- start_requests()。此方法用于生产初始请求,他必须返回一个可迭代的对象。此方法默认从start_urls里面的URL来构造Request,而且Request时GET的请求方式。如果我们想在启动时以POST的方式来访问某个站点,可以直接重写这个方法,发送POST请求时使用FromRequest即可。
- parse()。当Response没有指定回调函数的时候,该方法会被默认使用,来处理Response,处理返回结果,并从中提取想要的数据和下一步的请求。
- closed()。当Spider关闭时该方法自动调用。
2.2 Downloader Middleware
下载中间件,处于Scrapy的Request和Response之间的处理模块。
2.2.1 架构分析
Scheduler从队列中拿出来一个Request发送给Downloader执行下载,这个过程会经过Downloader Middleware 的处理。当Downloader将Request下载完成后得到的Response返回给Spider处理的时候,也会经过Downloader Middleware 进行处理。
我们通过其可做的修改有两处:
1.在Scheduler调度出队列的Request发送给Downloader下载之前,也就是我们可以在Request执行下载任务之前对其进行处理。
2.在下载后生成Response发送给Spider之前,也就是我们可以在生成Response发送给Spider解析之前进行修改。
2.2.2 三个核心方法
(1)process_request(request,spider)。这个方法处理情况一,调用其方法对Request请求进行修改,比如修改头部请求等,返回值必为None,Response,Request对象之一,或者抛出异常。
(2)process_response(request,response,spider)。这个方法处理情况二,调用其对Response进行修改,比如修改状态码等。返回值必为None,Response,Request对象之一,或者抛出异常。
(3)process_exception(request,exception,spider)。处理产生的异常,使得项目可以顺利的执行完全程。
只需要实现其中一个方法,便可以定义一个 Downloader Middleware。
2.2.3 启动自定义的 Downloader Middleware
在settings.py中,将DOWNLOADER_MIDDLEWARE取消注释,设置为:
DOWNLOADER_MIDDLEWARE = {
'项目名.middlewares.自己定义的middleware的名字':503(数字为优先级)
}
2.3 Item Pipeline
2.3.1 主要功能
- 清理HTML数据
- 验证爬取的数据,检查爬取字段
- 查重并丢弃重复的内容
- 将爬取的数据返回给数据库
2.3.2 核心方法
必须要实现的方法 process_item(item,spider)
被定义的 Item Pipeline 会默认调用这个方法对Item进行处理。比如将数据处理或将数据保存如数据库等。它必须返回Item类型的值或抛出一个DropItem异常。
class PymysqlPipeline(object):
#连接数据库
def __init__(self):
self.connect = pymysql.connect(
host = 'localhost',
database = 'image_360',
user = 'root',
password = '123456',
charset = 'utf8',
port = 3306
)
# 创建游标对象
self.cursor = self.connect.cursor()
# 此方法是必须要实现的方法,被定义的 Item Pipeline 会默认调用这个方法对 Item 进行处理
def process_item(self,item,spider):
cursor = self.cursor
sql = 'insert into image_information(id,pic_desc,title,url,thumb) values (%s,%s,%s,%s,%s)'
cursor.execute(sql,(
item['id'],item['pic_desc'],item['title'],item['url'],item['thumb']
))
# 提交数据库事务
self.connect.commit()
return item
2.3.3 三个实用的方法
- open_spider(self,spiser)。在Spider开启的时候别调用,可以做一些初始化的操作,如开启数据库的连接等。
- close_spider(spider)。Spider关闭的时候调用,做一些收尾的操作,如关闭数据的连接等。
- from_crawler(cls,crawler)。一个类方法,用 @classmethod 标识,是一种依赖注入的方式。它的参数时crawler,通过crawler对象,可以拿到Scrapy所有核心组件,如全局配置信息,然后创建一个Pipeline实例。参数cls是Class,最后返回一个Class实例。