Scrapy 框架把爬虫从初始 URL 构造 Request 到爬取,再到解析 Response 等各功能抽象为各种组件。对于一般的网站,如果没有什么反爬(或者反爬不是很变态),使用者要做的就是实现针对特定网站的 spider。
Spider 主要用于定义爬取行为,包括构造 Request,定义规则抽取超链接,从 Response 解析出结构化数据。
具体来说,各功能主要实现为:
- 构造 Request
- 最简单的方法只需要将待爬取的 URL 放入
start_urls
列表就可以,Scrapy 会使用默认 headers 等构造 Request - 如果需要对 Request 进行设置,则需要自己实现
start_requests
方法(start_urls
默认也是调用本方法)
- 最简单的方法只需要将待爬取的 URL 放入
- 定义超链接抽取规则:实例化
scrapy.spiders.Rule
生成规则,由于内容较多,后续会进行更新讲解,可参考:https://docs.scrapy.org/en/latest/topics/spiders.html#scrapy.spiders.Rule。 - 解析结构化数据:默认调用
parse
解析(CrawlSpider 默认调用parse_start_url
),在解析函数内抽取数据和新的链接。
下面介绍 Scrapy 提供的几种爬虫的属性和方法。
scrapy.spiders.Spider
最简单的 spider,其他的 spider 都继承自它。我们一般要实现的定向爬虫也直接继承它。
属性
name
,爬虫名称(string,类属性),在一个 Scrapy 工程内,name 必须唯一,因为使用scrap crawl <name>
运行时就是根据它查找 spider。allowed_domains
,允许爬取的域名(list,类属性),只有在该域列表内的 URL 才会被爬取,不然就被过滤掉(默认OffsiteMiddleware
设置被打开)。
对于域的设置,比如要爬取京东,则设置:allowed_domains = ['jd.com', 'jd.hk']
start_urls
,爬虫启动的初始 URL(list,类属性),在通用爬虫中,设置为入口 URL,利用规则则可以爬取整个网站。custom_settings
,Scrapy 的 spider 级别配置(dict,类属性),Scrapy 的配置分为 5 级别:
- Command line options (优先级最高)
- Settings per-spider,
custom_settings
就处于这个级别 - Project settings module
- Default settings per-command
- Default global settings (优先级最低)
crawler
,在 spider 类方法from_crawler()
中设置,绑定Crawler
对象到 spider 实例。目前不是很了解,参见:https://docs.scrapy.org/en/latest/topics/api.html#topics-api-crawler。settings
,爬虫最终配置,参见:https://docs.scrapy.org/en/latest/topics/settings.html#topics-settings。logger
,用于打印日志,使用name
创建。
方法
from_crawler(cls, crawler, *args, **kwargs)
,类方法,用于创建 spider,一般不用重写。本方法设置的crawler
和settings
属性用于爬虫运行时进入 spider。start_requests(self)
,迭代器,返回由 URL 构造的 Request,作为入口在爬虫启动时自动运行。实现了本方法,则忽略start_urls
。当然,方法内使用start_urls
另说。parse(self, response)
,迭代器,默认 Response 解析函数。closed(self, reason)
,爬虫关闭时自动运行,实现了spider_closed
信号绑定。
示例
import scrapy
from myproject.items import MyItem
class MySpider(scrapy.Spider):
name = 'example.com'
allowed_domains = ['example.com']
def start_requests(self):
yield scrapy.Request('http://www.example.com/1.html', self.parse)
yield scrapy.Request('http://www.example.com/2.html', self.parse)
yield scrapy.Request('http://www.example.com/3.html', self.parse)
def parse(self, response):
for h3 in response.xpath('//h3').extract():
yield MyItem(title=h3)
for url in response.xpath('//a/@href').extract():
yield scrapy.Request(url, callback=self.parse)
scrapy.spiders.CrawlSpider
继承自 Spider,用于需要追踪页面链接的通用网站爬虫。除了继承的属性和方法,新增:
属性
rules
,Rule 对象(list,类属性),用于自动抽取页面链接。
方法
parse_start_url(self, response)
,start_urls
爬取返回的 Response 默认解析函数。
scrapy.spiders.XMLFeedSpider
参见:https://docs.scrapy.org/en/latest/topics/spiders.html#xmlfeedspider
scrapy.spiders.CSVFeedSpider
参见:https://docs.scrapy.org/en/latest/topics/spiders.html#csvfeedspider
scrapy.spiders.SitemapSpider
参见:https://docs.scrapy.org/en/latest/topics/spiders.html#sitemapspider