所以我尝试使用CrawlSpider并理解Scrapy Docs中的以下示例:
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
然后给出的描述是:
这个蜘蛛会开始抓取example.com的主页,收集类别链接和项链接,使用parse_item方法解析后者。对于每个项目响应,将使用XPath从HTML中提取一些数据,并且将使用它填充项目。
我理解,对于第二条规则,它会从item.php
中提取链接,然后使用parse_item
方法提取信息。但是,第一条规则的目的究竟是什么?它只是说它收集"链接。这意味着什么,如果它们没有从中提取任何数据,它为什么有用?
答案 0 :(得分:8)
CrawlSpider在抓取搜索帖子的论坛时非常有用,或者在搜索产品页面时对在线商店进行分类。
这个想法是"某种程度上"您必须进入每个类别,搜索与您要提取的产品/项目信息相对应的链接。这些产品链接是在该示例的第二条规则中指定的链接(它表示在网址中具有item.php
的链接。)
现在蜘蛛如何继续访问链接,直到找到包含item.php
的链接?这是第一个规则。它说要访问包含category.php
但不包含subsection.php
的每个链接,这意味着它不会完全提取任何"项目"从这些链接,但它定义了蜘蛛的路径,以找到真正的项目。
这就是为什么你看到它在规则中不包含callback
方法,因为它不会返回你要处理的链接响应,因为它会直接接着