网站)上的内容,包括如何爬行(比如跳转链接),如何从页面获取结构化的数据。换句话说,spider 提供了自定义爬行行为和从特定网站解析数据的平台。
对于 spider,抓取过程会这样进行:
- 一开始,生成请求爬第一个URL,然后指定回调函数,该函数以这些请求的响应作为参数。
第一个发起的请求是由调用 start_request() 方法完成的,默认情况下,该方法生成 start_urls 的请求,将 parse 方法作为请求的回调函数。
2.在回调函数中,主要解析响应(web页面)并返回提取数据的字典、Item 对象、Request 对象或这些对象的迭代。这些请求包含回调(可能是同一个回调),然后由Scrapy下载,下载的响应会给指定的新回调处理。
这里可以理解为,在回调中需要处理 scrapy 下载,交由回调函数处理。回调函数默认为 'parse(self, response)',会在下面一步介绍。
- 在回调函数中中,你需要解析页面内容,一般来说使用 Selectors 解析(也可以使用 BeautifulSoup, lxml 和任意你喜欢的解析机制),然后生成解析数据内容。
- 在最后,spider 返回的解析内容会被持久化到数据库(也可以是数据管道)或通过 Feed 导出为文件。
即使这个过程被应用在绝大部分 spider 上,但处于不同的期望,还是有不同的默认 spider 绑定到 Scrapy 上。
scrapy.Spider
class scrapy.spiders.Spider
这是最简单的 spider,所有 spider 都必须继承它。(包括与 Scrapy 绑定的 spider和你自己编写的 spider)它不提供任何特定的函数。只是提供一个默认的 start_requests() 的实现,这个函数根据 start_urls 发送请求并为每个响应调用 parse 方法。
name
name 是一个字符串,代表 spider 的名称。也是 Scrapy 定位和实例化 spider 的方式,所以 name 必须保持唯一。然而,并没有要求你不能创建多个 spider 的实例。name 是 spider 最重要的属性而且是必须的。
如果 spider 仅抓取一个域名,通常做法是将该域名作为 spider 的名称。比如,爬取 'mywebsite.com' 就命名 spider 为 mywebsite。
allowed_domains
可选项,域名列表,表示当前 spider 允许爬取的域名。如果请求的 URL 不属于域名列表中的内容,那么该请求将不会被允许(offsiteMiddleware 默认已启用)。
以 'http://www.example.com/1.html' 来说,添加的域名为 'example.com'。
start_urls
URL 的列表,是spider 开始爬取的位置,接下来的 Request 都会以此由该列表中的数据生成。
custom_settings
自定义配置,spider 运行时项目范围内的陪我之会覆盖它。它必须定义成类属性确保其在实例化之前更新。
crawler
这个属性在初始化类后通过 form_crawler() 类方法配置,并与 spider 实例绑定的 Crawler 对象关联。
Crawlers 在项目中封装了很多独立功能组件。
settings
配置 spider 运行时的设置,这是一个 settings 类的实例。
logger
Python 日志以 spider 名称作为 logger,你可以发送 log 消息,具体参考 Logging for Spiders。
from_crawler(crawler, *args, **kwargs)
这是一个类方法,用于创建 spider。
你必须要直接重写这个方法,因为默认实现了 '__init__()' 的代理,给定'args' 和 'kwargs' 再调用该方法。
尽管做了上述处理,该方法中还暴露了 'crawler' 和 'settings' 属性,以便于实例化后能在后续的 spider 代码中使用这两个属性。
Parameters
- crawler (Cralwer instance) - 绑定的 crawler 实例
- arg (list) - 传递给'__init__()'的位置参数
- kwargs (dict) - 传递给 '__init__()' 的关键字参数
start_requests()
这个方法必须返回可迭代对象,该对象中包含 spider 要爬取的请求。spider 开始抓取时 scrapy 会调用次方法,且只调用一次,所以该方法返回生成器也是可以的。
默认情况下,该方法为 start_urls 中每个 url 生成 'Request(ur, dont_filter=True)' 请求。
如果你的请求从某个域名开始抓取,重写此处即可。比如你需要POST请求登陆后开始发起请求,那么做如下修改:
class MySpider(scrapy.Spider):
name = 'myspider'
def start_request(self):
return [scrapy.FromRequest("http://www.example.com/login",
formdata={"user": "john", "pass": "secret"}, callback=self.logged_in)]
def logged_in(self, response):
pass
parse(response)
如果请求没有指定回调,parse 便作为默认回调。scrapy 中该回调用于传输下载的响应。
parse 方法控制着响应的传输,并返回抓取的数据或下一个URL。其他的请求回调也有同样的需求。
这个方法以及其他的请求回调,都必须返回请求、字典、Item对象的迭代。
Parameters:
response(Response) - 将要解析的请求
log(message[, level, component])
通过 spider 的 logger 封装发送日志消息,保持向后兼容。
closed(reason)
关闭 spider 时调用。
Generic Spiders 常规 spider
Scrapy 提供了多个常规的 spider,各自提供了方便的抓取功能,如根据规则跳转链接,解析 XML/CSV 提要等
CrawlSpider
爬取常规网站最常用的 spider,提供跳转链接的规则。
两个新的属性:
rules
如果有多个规则命中,则默认取第一个。
parse_start_url(response)
可重写,解析初始的响应
Crawling rules
参数:link_extractor,callback, cb_kwargs, follow, porcess_links, process_request
link_extractor
Link Extractor 对象,定义了获取链接的规则
callback
回调(可调用对象)
cb_kwargs
callback 的参数
follow
响应中的链接是否跳转。如果 callback 为 None,则默认 follow=True,否则默认为 False。
process_links
使用特定的 link_extractor 时,响应中的每个链接都调用 process_links()。主要用于过滤。
process_request
被规则提取的请求都会调用 process_request()
XMLFeedSpider
解析 XML 提要
iterator: 默认为 iternaodes
itertag:默认为 item,可以设置为需要迭代的 tag
namespaces:设置域名,可以与 itertag 一起使用
adapt_resonse(response)
在解析响应前对 response 做适度的修改
parse_node(response, selector)
必须重写的方法,用于对提供的 tag 进行节点匹配
process_reuslts(response, results)
spider 返回的每个结果都会调用这个方法,目的在于返回结果到核心框架前执行必要的处理。
CSVFeedSpider
与 XMLFeedSpider 类似,只不过把迭代节点node改成了迭代行。
delimiter 分隔符,默认为逗号
quotechar 引号,默认为双引号
headers CSV 文件列名
parse_row(response, row) 解析每一行
adapt_response() process_results() 重写 response 和 result 方法
SitemapSpider
网站地图,不做详解
[1] https://docs.scrapy.org/en/latest/topics/spiders.html
网友评论