scrapy如何使用规则?
我刚开始使用Scrapy,想了解一下在CrawlSpider中是怎么使用规则的。
比如说,我有一个规则,是在黄页上爬取亚利桑那州图森市的杯子蛋糕商家列表。那么,当我发出一个网址请求时,怎么才能激活这个规则呢?特别是,怎么才能激活restrict_xpath这个属性呢?
谢谢。
1 个回答
CrawlSpider
的规则属性用来指定如何从网页中提取链接,以及对这些链接应该调用哪些回调函数。这些操作是通过该类中默认的 parse()
方法来处理的——你可以在这里查看源代码。
所以,每当你想要对一个网址应用规则时,只需要使用 scrapy.Request(url, self.parse)
来发送请求,Scrapy 引擎就会向这个网址发送请求,并对响应应用规则。
链接的提取(可能会使用 restrict_xpaths
)是由为该规则注册的 LinkExtractor 对象来完成的。它基本上会在整个页面中搜索所有的 <a>
和 <area>
元素,或者如果设置了 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)
来获取网址,然后生成 scrapy.Request(url, <rule_callback>)
对象。
这个示例代码是一个爬虫的框架,它会爬取一个电商网站,跟踪产品类别和子类别的链接,以获取每个产品页面的链接。
对于这个爬虫中特别注册的规则,它会使用 parse()
方法作为回调,爬取“类别”和“子类别”列表中的链接(这会触发爬取规则被调用),同时对匹配正则表达式 product.php?id=\d+
的链接使用回调 parse_product_page()
——最终会抓取产品数据。
如你所见,这些功能非常强大。=)