python - 抓取两个页面时忽略请求

标签 python scrapy scrapinghub

我现在每天都在抓取这个网站,并使用 DeltaFetch 忽略已经访问过的页面(很多)。

我面临的问题是,对于这个网站,我需要先抓取页面 A,然后抓取页面 B 以检索有关该项目的其他信息。 DeltaFetch 可以很好地忽略对页面 B 的请求,但这也意味着每次运行抓取时,它都会运行对页面 A 的请求,无论它是否访问过它。

这就是我的代码现在的结构:

# Gathering links from a page, creating an item, and passing it to parse_A
def parse(self, response):
    for href in response.xpath(u'//a[text()="詳細を見る"]/@href').extract():
        item = ItemLoader(item=ItemClass(), response=response)
        yield scrapy.Request(response.urljoin(href), 
                                callback=self.parse_A,
                                meta={'item':item.load_item()})

# Parsing elements in page A, and passing the item to parse_B
def parse_A(self, response):
    item = ItemLoader(item=response.meta['item'], response=response)
    item.replace_xpath('age',u"//td[contains(@class,\"age\")]/text()")
    page_B = response.xpath(u'//a/img[@alt="周辺環境"]/../@href').extract_first()
    yield scrapy.Request(response.urljoin(page_B), 
                            callback=self.parse_B,
                            meta={'item':item.load_item()})

# Parsing elements in page B, and yielding the item
def parse_B(self, response):
    item = ItemLoader(item=response.meta['item'])
    item.add_value('url_B',response.url)
    yield item.load_item()

如果使用 DeltaFetch 忽略对页面 A 的第一个请求,当此页面已被访问时,我们将不胜感激。

最佳答案

DeltaFetch 仅在其数据库中记录产生项目的请求,这意味着默认情况下只会跳过那些。

但是,您可以使用 deltafetch_key 自定义用于存储记录的 key 元键。如果您为调用 parse_A() 的请求和在 parse_A() 中创建的请求设置相同的键,您应该能够实现您想要的效果。

像这样的东西应该可以工作(未经测试):

from scrapy.utils.request import request_fingerprint

# (...)

    def parse_A(self, response):
        # (...)
        yield scrapy.Request(
            response.urljoin(page_B),
            callback=self.parse_B,
            meta={
                'item': item.load_item(),
                'deltafetch_key': request_fingerprint(response.request)
            }
        )

注意:上面的示例有效地用过滤parse_A() url 请求替换了过滤parse_B() url 请求。您可能需要根据需要使用不同的 key 。

关于python - 抓取两个页面时忽略请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49059526/

相关文章:

python - 存储和处理大量时空数据

python - 使用xpath解析出不需要的数据

python - 如何使用scrapy选择下一个节点

web-scraping - 特定站点的 Scrapy 和 Splash 超时

selenium - 如何在 Scrapinghub 上安装 xvfb 以使用 Selenium?

python - 为什么这么多的应用程序/框架将它们的配置文件保存为未执行的格式?

python - TF.Keras model.predict 比直接 Numpy 慢?

python - SymPy 的多彩图

python - 使用scrapy爬取时出错

python - 无法部署到 Scrapinghub