Spider 类定义了如何爬去某个网站, 包括爬取的动作以及如何从网页内容中提取结构化的数据, 总的来说 spider 就是定义爬取的动作以及分析某个网页
工作流程分析
以初始的 URL 初始化 Request, 并设置回调函数, 当该 request 下载完毕并返回时, 将生成 response, 并作为参数传给回调函数. spider 中初始的 requesst 是通过 start_requests() 来获取的. start_requests() 获取 start_urls 中的 URL, 并以 parse 以回调函数生成 Request
在回调函数内分析返回的网页内容, 可以返回 Item 对象, 或者 Dict, 或者 Request, 以及是一个包含三者的可迭代的容器, 返回的 Request 对象之后会经过 Scrapy 处理, 下载相应的内容, 并调用设置的 callback 函数
在回调函数内, 可以通过 lxml,bs4,xpath,CSS 等方法获取我们想要的内容生成 item
最后将 item 传递给 Pipeline 处理
我们以通过简单的分析源码来理解
我通常在写 spiders 下写爬虫的时候, 我们并没有写 start_requests 来处理 start_urls 中的 url, 这是因为我们在继承的 scrapy.Spider 中已经写过了, 我们可以点开 scrapy.Spider 查看分析
通过上述代码我们可以看到在父类里这里实现了 start_requests 方法, 通过 make_requests_from_url 做了 Request 请求
如下图所示的一个例子, parse 回调函数中的 response 就是父类列 start_requests 方法调用 make_requests_from_url 返回的结果, 并且在 parse 回调函数中我们可以继续返回 Request, 如下属代码中 yield Request() 并设置回调函数.
spider 内的一些常用属性
我们所有自己写的爬虫都是继承与 spider.Spider 这个类
name
定义爬虫名字, 我们通过命令启动的时候用的就是这个名字, 这个名字必须是唯一的
allowed_domains
包含了 spider 允许爬取的域名列表. 当 offsiteMiddleware 启用时, 域名不在列表中 URL 不会被访问
所以在爬虫文件中, 每次生成 Request 请求时都会进行和这里的域名进行判断
start_urls
起始的 url 列表
这里会通过 spider.Spider 方法中会调用 start_request 循环请求这个列表中每个地址.
custom_settings
自定义配置, 可以覆盖 settings 的配置, 主要用于当我们对爬虫有特定需求设置的时候
设置的是以字典的方式设置: custom_settings = {}
from_crawler
这是一个类方法, 我们定义这样一个类方法, 可以通过 crawler.settings.get() 这种方式获取 settings 配置文件中的信息, 同时这个也可以在 pipeline 中使用
start_requests()
这个方法必须返回一个可迭代对象, 该对象包含了 spider 用于爬取的第一个 Request 请求
这个方法是在被继承的父类中 spider.Spider 中写的, 默认是通过 get 请求, 如果我们需要修改最开始的这个请求, 可以重写这个方法, 如我们想通过 post 请求
make_requests_from_url(url)
这个也是在父类中 start_requests 调用的, 当然这个方法我们也可以重写
parse(response)
这个其实默认的回调函数
负责处理 response 并返回处理的数据以及跟进的 url
该方法以及其他的 Request 回调函数必须返回一个包含 Request 或 Item 的可迭代对象
来源: http://www.bubuko.com/infodetail-3101132.html