非全文翻譯淋淀,僅翻譯部分重要功能介紹
文檔翻譯自Scrapy 1.5.1
scrapy documentation
CrawlSpider: scrapy.spider.CrawlSpider
是scrapy提供的幾個常用爬蟲類之一勤庐,常用來做通用爬蟲的開發(fā)招刹。可以通過定義一組Rules來追蹤所需要的鏈接。優(yōu)點是便利衰腌,只需要很少的代碼就可以實現(xiàn)一個全站爬蟲。缺點是不一定能滿足對特定網(wǎng)站的爬取需求觅赊。如果有需要右蕊,可以根據(jù)需求重寫它的方法、屬性來獲得更多的自定義功能吮螺。
除了從Spider繼承的屬性饶囚,此類還有一個新的屬性:
- rules
它是一個或多個Rule對象組成的列表帕翻。每個Rule定義用于爬取網(wǎng)點的特定行為。如果多個規(guī)則都匹配到相同的鏈接萝风,則將根據(jù)它們在Rule中定義的順序使用第一個規(guī)則嘀掸。
此外,這個Spider還提供了一個可重寫的方法:
- parse_start_url(response)
class srapy.spiders.Rules(link_extractor, callback=None, cb_kwargs=None, follow=None, process_link=None, process_request=None)
link_extractor
是一個Link Extractor對象规惰,它定義從每個已爬取網(wǎng)頁中提取哪些鏈接睬塌。
callback
是一個可調(diào)用的方法或者一個字符串(將使用具有該名稱的spider對象的方法)為使用指定link_extractor對象提取的每個鏈接調(diào)用。此回調(diào)函數(shù)接受response并作為其第一個參數(shù)歇万,并且必須返回Item
和/或Request
對象(或其任何子類)的列表揩晴。
警告
編寫crawl spider rules時,避免使用
parse
作為回調(diào)函數(shù)贪磺,因為CrawlSpider
使用parse
方法本身來實現(xiàn)其主要邏輯硫兰。如果覆蓋了該parse
方法,則crawl spider將不再起作用寒锚。
cb_kwargs
是一個包含要傳遞給callback
函數(shù)關(guān)鍵字的參數(shù)的dict劫映。
follow
是一個布爾值,它指定是否應(yīng)該從使用此規(guī)則提取的每個響應(yīng)中繼續(xù)跟蹤鏈接壕曼。如果callback
存在苏研,則follow默認為True
,否則默認為False
腮郊。
process_links
是一個可調(diào)用的方法摹蘑,或一個字符串(將使用具有該名稱的spider對象的方法),將使用指定的每個response提取的每個鏈接列表調(diào)用該方法link_extractor
轧飞。主要目的是用于過濾衅鹿。
process_request
是一個可調(diào)用的方法,或一個字符串(將使用具有該名稱的spider對象的方法)过咬,該方法將在此rule
提取的每個request中調(diào)用大渤,并且必須返回請求或None(用于過濾請求)
CrawlSpider示例
官方示例:
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
class MySpider(CrawlSpider):
name = 'example.com'
allowed_domains = ['example.com']
start_urls = ['http://www.example.com']
rules = (
# Extract links matching 'category.php' (but not matching 'subsection.php')
# and follow links from them (since no callback means follow=True by default).
Rule(LinkExtractor(allow=('category\.php', ), deny=('subsection\.php', ))),
# Extract links matching 'item.php' and parse them with the spider's method parse_item
Rule(LinkExtractor(allow=('item\.php', )), callback='parse_item'),
)
def parse_item(self, response):
self.logger.info('Hi, this is an item page! %s', response.url)
item = scrapy.Item()
item['id'] = response.xpath('//td[@id="item_id"]/text()').re(r'ID: (\d+)')
item['name'] = response.xpath('//td[@id="item_name"]/text()').extract()
item['description'] = response.xpath('//td[@id="item_description"]/text()').extract()
return item
這個Spider會開始抓取example.comde的主頁,收集類別鏈接和項目鏈接掸绞,使用該parse_item
方法解析后者泵三。對于每個項目的response,將使用XPath從HTML中提取一些數(shù)據(jù)并填充Item衔掸。
重點補充:LinkExtractor
LinkExtractor
對象烫幕,其唯一目的是從scrapy.http.Response
中提取符合規(guī)則的鏈接。
內(nèi)置link extractors參考
scrapy.linkextractors模塊中提供了與scrapy捆綁在一起的LinkExtractor類敞映。
默認的link extractor是LinkExtractor
较曼,它與以下內(nèi)容相同LxmlLinkExtractor
:
from scrapy.linkextractors import LinkExtractor
以前版本的scrapy中曾包含過其他link extractor(鏈接提取器)類,但已經(jīng)棄用振愿。
LxmlLinkExtractor
class scrapy.linkextractors.lxmlhtml.LxmlLinkExtractor(allow =()捷犹,deny =()弛饭,allow_domains =(),deny_domains =()萍歉,deny_extensions = None侣颂,restrict_xpaths =(),restrict_css =()枪孩,tags =('a'横蜒,'area'),attrs = ('href'销凑,),canonicalize = False仅炊,unique = True斗幼,process_value = None,strip = True )
LxmlLinkExtractor是官方推薦的link extractor抚垄,具有很多方便過濾的選項蜕窿,是使用lxml強大的HTMLParse實現(xiàn)的。
參數(shù)
- allow(正則表達式(或列表)):URL必須匹配才能被提取呆馁。如果沒有給出(或為空)桐经,它將匹配所有鏈接。
- deny(正則表達式(或列表)):URL必須匹配才能排除浙滤。它將優(yōu)于
allow
參數(shù)阴挣。如果沒有給出(或為空),它將不排除任何鏈接
- allow_domains(str或list):單個值或者包含域的字符串列表纺腊,用于提取鏈接畔咧。
- deny_domains(str或list):單個值或者包含域的字符串列表,用于忽略提取鏈接的揖膜。
- deny_extensions*(list):包含擴展名的單個值或字符串列表誓沸,用于提取鏈接時忽略的擴展名鏈接,如果沒有給出壹粟,將默認為
scrapy.linkextractors
包IGNORED_EXTENSIONS中定義的列表 *
- restrict_xpaths(str或list):是一個XPath(str或list)拜隧,定義response中應(yīng)從中提取鏈接的區(qū)域。如果給定趁仙,則僅掃描由這些XPath選擇的內(nèi)容中提取鏈接洪添。
- restrict_css(str或list),定義response中應(yīng)從中提取鏈接的區(qū)域幸撕。如果給定薇组,則僅掃描由這些CSS選擇的內(nèi)容中提取鏈接。
- tags(str或list):提取鏈接時的標簽或標簽列表坐儿,默認為
('a','area')
- attrs(list):查找要提取的鏈接時應(yīng)考慮的屬性或?qū)傩粤斜?僅適用于tags參數(shù)中指定的標簽)律胀。默認為
('href',)
- canonicalize(boolean)- 規(guī)范每個提取的url(使用w3lib.url.canonicalize_url)宋光。默認為False。canonicalize_url用于重復(fù)檢查; 它可以更改服務(wù)器端可見的URL炭菌,因此對于具有規(guī)范化和原始URL的請求罪佳,響應(yīng)可能不同。如果您使用LinkExtractor跟蹤鏈接黑低,則保持默認值使爬蟲更加健壯canonicalize=False赘艳。
- unique(boolean):是否應(yīng)對提取的鏈接應(yīng)用重復(fù)過濾
- process_value(callable):接收從標簽中提取的每個值和掃描的屬性的函數(shù),可以修改該值并返回一個新值克握,或者返回
None
完全忽略該鏈接蕾管。如果沒有給出,process_value
默認為菩暗。lambda x: x
例如要從此代碼中提取鏈接:
<a href="javascript:goToPage('../other/page.html'); return false">Link text</a>
你可以使用以下功能
process_value
:
def process_value(value):
m = re.search("javascript:goToPage\('(.*?)'", value)
if m:
return m.group(1)
- strip(boolean):是否從提取的屬性中去除空格掰曾。根據(jù)HTML5標準,前導(dǎo)和尾部空格必須從被剝離
href
的屬性<a>停团,<area>
以及許多其他的元素旷坦,src
屬性<img>,<iframe>
元件等佑稠,所以LinkExtractor
默認去除空格字符秒梅。設(shè)置strip=False為關(guān)閉它(例如,如果您從允許前導(dǎo)/尾隨空格的元素或?qū)傩灾刑崛RL)舌胶。