如何保存Scrapy广泛爬网结果?

1zmg4dgp  于 2023-02-16  发布在  其他
关注(0)|答案(1)|浏览(118)

Scrapy有一个内置的方法,可以使用FEEDS设置在AWS S3中保存结果。
但是对于在不同域上的广泛爬行,这将创建单个文件,其中保存来自所有域的结果。
我如何将每个域的结果保存在它自己的单独文件中?
我无法在文档中找到任何对此的引用。

jecbmhm3

jecbmhm31#

在FEED_URI设置中,您可以添加占位符,占位符将被抓取的数据替换。
例如,域名可以包含在文件名中,方法是使用domain属性,如下所示

FEED_URI = 's3://my-bucket/{domain}/%(time)s.json'

这个解决方案只有在每个域运行一次spider时才有效,但由于您没有明确说明,我假设一次运行会爬取多个域。如果您事先知道所有域,则可以通过编程方式生成FEEDS设置的值并使用项目过滤。

# Assumes that items have a domain field and that all target domains are 
# defined in an ALL_DOMAINS variable.

class DomainFilter:

    def __init__(self, feed_options):
        self.domain = feed_options["domain"]

    def accepts(self, item):
        return item["domain"] == self.domain

ALL_DOMAINS = ["toscrape.com", ...]
FEEDS = {
    f"s3://mybucket/{domain}.jsonl": {
        "format": "jsonlines",
        "item_filter": DomainFilter,
    }
    for domain in ALL_DOMAINS
}

相关问题