我是使用Scrapy的新手,我想了解如何在CrawlSpider中使用这些规则。
如果我有一条规则,我在亚利桑那州图森市的蛋糕列表的黄页中爬行,那么如何产生一个URL请求激活规则 - 具体来说它是如何激活restrict_xpath属性的?
感谢。
答案 0 :(得分:14)
CrawlSpider
的rules属性指定如何从页面中提取链接以及应为这些链接调用哪些回调。它们由该类中实现的默认parse()
方法处理 - look here to read the source。
因此,每当您想要触发URL的规则时,您只需要生成scrapy.Request(url, self.parse)
,并且Scrapy引擎将向该URL发送请求并将规则应用于响应。
链接的提取(可能使用或不使用restrict_xpaths
)由为该规则注册的LinkExtractor对象完成。它基本上搜索整个页面中的所有<a>
和<area>
s元素,或仅在设置属性后应用restrict_xpaths
表达式后获取的元素中搜索。
例如,假设你有一个像这样的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
引擎开始向start_urls
中的网址发送请求,并执行默认回调(CrawlSpider中的parse()
方法)以获取响应。
对于每个响应,parse()方法将在其上执行链接提取器以从页面获取链接。也就是说,它为每个响应对象调用LinkExtractor.extract_links(response)
来获取URL,然后生成scrapy.Request(url, <rule_callback>)
个对象。
示例代码是蜘蛛的骨架,它按照产品类别和子类别的链接抓取电子商务网站,以获取每个产品页面的链接。
对于在此蜘蛛中专门注册的规则,它会使用parse()
方法作为回调对“类别”和“子类别”列表中的链接进行爬网(这将触发为这些调用的爬网规则)页面),以及匹配正则表达式product.php?id=\d+
和回调parse_product_page()
的链接 - 这将最终刮掉产品数据。
正如你所看到的,非常强大的东西。 =)