Python Scrapy-理解爬行器和LinkExtractor

Python Scrapy-理解爬行器和LinkExtractor,python,scrapy,web-crawler,scrapy-spider,Python,Scrapy,Web Crawler,Scrapy Spider,因此,我尝试使用爬行蜘蛛并理解以下示例: 然后给出的描述是: 这个爬行器将开始抓取example.com的主页,收集类别链接和项目链接,并使用parse_item方法解析后者。对于每个项目响应,将使用XPath从HTML中提取一些数据,并用它填充一个项目 我知道对于第二条规则,它从item.php中提取链接,然后使用parse\u item方法提取信息。然而,第一条规则的目的究竟是什么?它只是说它“收集”了链接。这意味着什么?如果他们不从中提取任何数据,为什么它有用 爬行蜘蛛在搜索论坛帖子时非常

因此,我尝试使用爬行蜘蛛并理解以下示例:

然后给出的描述是:

这个爬行器将开始抓取example.com的主页,收集类别链接和项目链接,并使用parse_item方法解析后者。对于每个项目响应,将使用XPath从HTML中提取一些数据,并用它填充一个项目


我知道对于第二条规则,它从
item.php
中提取链接,然后使用
parse\u item
方法提取信息。然而,第一条规则的目的究竟是什么?它只是说它“收集”了链接。这意味着什么?如果他们不从中提取任何数据,为什么它有用

爬行蜘蛛在搜索论坛帖子时非常有用,或者在搜索产品页面时分类在线商店时非常有用

这个想法是“不知何故”你必须进入每个类别,搜索与你想要提取的产品/项目信息相对应的链接。这些产品链接是在该示例的第二条规则中指定的(它表示url中包含
item.php

现在,爬行器应该如何继续访问链接,直到找到包含
item.php
的链接?这是我们的第一条规则。它说要访问包含
category.php
但不包含
subsection.php
的每个链接,这意味着它不会从这些链接中准确提取任何“项目”,但它定义了爬行器查找真正项目的路径


这就是为什么您看到它在规则中不包含
回调
方法的原因,因为它不会返回链接响应供您处理,因为它将被直接跟踪。

啊,我明白了。。。所以这个蜘蛛会从类似于
example.com/category.php/item.php
的链接中提取数据,而不是从类似于
example.com/subsection.php/item.php
的链接中提取数据?是的,如果你的意思是要提取
example.com/subsection.php/item.php
,它首先需要访问
example.com/subsection.php
页面。假设您位于
example.com
(主页),在该页面内只有两个链接(在正文内):
example.com/category.php
example.com/subsection.php
,当您访问它们时,您可以找到产品URL(带有
item.php
)。然后蜘蛛将只提取
category.php
中的内容,因为它从未访问过
subsection.php
。。。谢谢那么如果有第三个链接
example.com/third.php/item.php
,但我有与上面相同的规则,它会解析这些链接吗?只是对行为感到困惑,因为
third.php
既不在
allow=()
中,也不在
deny=()
中。你必须手动拒绝所有可能的额外链接吗?如果爬行器在
category.php
链接中发现
third.php/item.php
链接,那么它将被提取。它只说它将访问
category.php
链接。它不会访问
category.php/subsection.php
链接。请记住,“访问”链接与“提取”链接不同。同样,如果该链接位于
example.com/third.php
(认为这是一个类别)中,则不会。现在“如果”该链接以某种方式被找到,则该链接将被“提取”,因此您可以在
parse_item
上对其进行处理。我认为整个功能在
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