如何使用pythonscrapy从一个页面中刮取多个部分?

2024-04-26 21:21:34 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个单独的HTML文件,其中包含多个不同结构的部分,这些部分需要广泛不同的刮削。蜘蛛布局的最佳实践是什么?

我应该用一个蜘蛛还是更多蜘蛛?我是否应该多次请求同一个URL,每次都使用不同的回调函数?或者只是按顺序解析不同的部分?同时,也要考虑到的缓存和其他部分的性能限制。在

那么,有什么最佳实践建议吗?社区中使用的规则或惯例?在

多个请求

如果我多次请求一个URL,它是否被缓存/限制?或者对引擎的每个请求都会导致对“外部web服务器”的请求?在

class MultiSpider(scrapy.Spider):

    """Parse the parts in parallel."""

    name = 'multispider'

    def start_requests(self):
        url = 'https://en.wikipedia.org/wiki/Main_Page'
        yield scrapy.Request(url=url, callback=self.parser_01)
        yield scrapy.Request(url=url, callback=self.parser_02)

    def parser_01(self, response):
        selector = response.xpath('//some/path')
        if selector is not None:
            # do stuff with *selector* and
            yield {}

    def parser_0(self, response):
        selector = response.xpath('//some/other/path')
        if selector is not None:
            # do very different stuff with *selector* and
            yield {}

多个解析器函数

如果我想避免一个巨大的parse函数,而是为不同的任务/部分使用多个函数,有没有特别好/不好的方法来构建它(例如“如何从何处屈服”)?在

^{pr2}$

Tags: 函数selfparserurlresponserequestdefcallback
2条回答

为了回答您关于如何构建spider/最佳实践的问题,我通常会这样做:

  1. 避免构建在同一页面上工作的多个蜘蛛——因为目标网站的带宽通常是瓶颈,在网站上创建不必要的流量并不被认为是礼貌的抓取。

  2. 对同一个URL创建多个请求也是一样的:这可能会给目标网站造成不必要的流量,这不是很好的scraper行为。另外,scrapy在默认情况下过滤重复的请求,因此您可能会突然想知道为什么没有执行所有的请求。

(注:有一些方法可以解决这个问题,也可以使用代理等。。。但这让事情变得不必要复杂)

  1. 因此,如果您想避免大型解析方法执行许多不同的操作,请随意将其拆分。与你在自己的例子中建议的非常相似。我甚至会更进一步,将完整的处理步骤封装到单独的解析方法中,例如

    class SomeSpider(scrapy.Spider):
    
        def parse(self, response):
            yield self.parse_widgets_type_a(response)
            yield self.parse_widgets_type_b(response)
            # ....
            yield self.follow_interesting_links(response)
    
        def parse_widgets_type_a(self, response):
            # ....
    
        def parse_widgets_type_b(self, response):
            # ....
    
        def follow_interesting_links(self, response):
            # ....
            yield Request(interesting_url)
    

基于这个模板,您甚至可能希望将不同的解析方法重构为不同的Mixin类。在

如果这是一个单一的网页,我会建议使用一个蜘蛛。请求页面一次并解析所需的所有数据(您可以为此使用一个或多个函数)。在

例如,我还建议使用物品

import scrapy

class AmazonItem(scrapy.Item):
    product_name = scrapy.Field()
    product_asin = scrapy.Field()
    product_avg_stars = scrapy.Field()
    product_num_reviews = scrapy.Field()
    pass

如果你想把你的爬网数据保存到一个数据库,你应该使用管道。在

相关问题 更多 >