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