CrawlSpider
類為我們提供一系列方法,可以按照指定的規則在頁面中提取并跟蹤鏈接。
我們通過 rules
屬性來定義提取的鏈接的規則,看下面一個簡單例子:
# -*- coding: utf-8 -*-
import scrapy
from scrapy.contrib.spiders import CrawlSpider, Rule
# 鏈接提取器
from scrapy.contrib.linkextractors import LinkExtractor
class QuotesSpider(CrawlSpider):
name = "quotes"
allowed_domains = ['quotes.toscrape.com']
start_urls = ['http://quotes.toscrape.com/']
rules = (
# 提取匹配包含 'tag' 但不含 'love' 的鏈接并使用 parse_item 方法進行爬取
Rule(
LinkExtractor(allow=('tag'), deny=('love')),
callback='parse_item'
),
)
def parse_item(self, response):
self.logger.info('開始爬取:' + response.url)
# 提取 tag 內容
tag = response.css('h3 > a::text').extract_first()
return {
"url": response.url,
"tag": tag,
}
上面這個例子,我們從主頁 “http://quotes.toscrape.com/” 中提取包含字符 “tag” 的鏈接,然后從這些鏈接中提取 tag 和 url。
Rule 的參數如下:
class scrapy.spiders.Rule(
link_extractor,
callback=None,
cb_kwargs=None,
follow=None,
process_links=None,
process_request=None
)
-
link_extractor
:定義了鏈接的提取規則。 -
callback
:回調函數,表示用哪個函數來處理提取到的鏈接(注意:不可用 parse 方法作為回調函數)。 -
cb_kwargs
:一個要傳遞關鍵字參數給回調函數的的字典。 -
follow
:一個布爾值,(待補充)。 -
process_links
:(待補充)。 -
process_request
:(待補充)。