我是使用Scrapy的新手,我想了解CrawlSpider中如何使用规则。
如果我有一条规则要在列表中进行爬网,那么产生URL请求如何激活该规则-特别是它如何激活strict_xpath属性?
rules属性CrawlSpider指定如何从页面提取链接以及应为这些链接调用哪些回调。它们由parse()该类中实现的默认方法处理。
CrawlSpider
parse()
因此,每当你要触发URL规则时,只需要产生一个scrapy.Request(url, self.parse),Scrapy引擎就会向该URL发送一个请求并将规则应用于响应。
scrapy.Request(url, self.parse),Scrapy
链接的提取(可能使用或可能不使用restrict_xpaths)是通过为该规则注册的LinkExtractor对象完成的。如果设置了属性,它基本上会搜索整个页面中的所有<a>s和<area>s元素,或者仅搜索应用restrict_xpaths表达式后获得的元素。
restrict_xpaths
<a>s
<area>s
例: 例如,假设你有一个CrawlSpider,如下所示:
from scrapy.contrib.spiders.crawl import CrawlSpider, Rule from scrapy.contrib.linkextractors import LinkExtractor class MySpider(CrawlSpider): start_urls = ['http://someurlhere.com'] rules = ( Rule( LinkExtractor(restrict_xpaths=[ "//ul[@class='menu-categories']", "//ul[@class='menu-subcategories']"]), callback='parse' ), Rule( LinkExtractor(allow='/product.php?id=\d+'), callback='parse_product_page' ), ) def parse_product_page(self, response): # yield product item here
引擎开始将请求发送到url中,start_urls并执行默认的回调(parse()CrawlSpider中的方法)以响应它们。
start_urls
对于每个响应,parse()方法将在其上执行链接提取程序,以从页面获取链接。即,它LinkExtractor.extract_links(response)为每个响应对象调用以获得URL,然后产生scrapy.Request(url, <rule_callback>)对象。
parse()
LinkExtractor.extract_links(response)
scrapy.Request(url, <rule_callback>)
该示例代码是spider的框架,该spider在产品类别和子类别的链接之后爬网电子商务网站,以获取每个产品页面的链接。
对于专门在此spider中注册的规则,它将使用parse()回调方法对“类别”和“子类别”列表内的链接进行爬网(这将触发针对这些页面的抓取规则),以及与product.php?id=\d+带有回调的正则表达式parse_product_page()-最终将抓取产品数据。
product.php?id=\d+
parse_product_page()