使用Scrapy将数据写入多个文件

6

我正在使用Scrapy爬取一个网站,并希望将结果分成两部分。通常,我这样调用Scrapy:

$ scrapy crawl articles -o articles.json
$ scrapy crawl authors  -o  authors.json

这两只蜘蛛是完全独立的,它们不会进行任何交流。这个设置对于小型网站来说是可行的,但对于较大的网站来说,我无法像这样爬取太多的作者。

我应该如何让 articles 蜘蛛告知 authors 蜘蛛要爬取哪些页面并保持这个双文件结构?理想情况下,我不希望将作者 URL 写入文件中,然后再用另一个蜘蛛读取它。


我认为问题将会是文件的大小。这个解决方案不会很好地扩展(我相信你已经注意到了)。你有没有考虑过使用数据库或存储来解决这个问题?对于这个问题,一些无模式方案会浮现在我的脑海中。我不认为你只满足于两个巨大的文件。 - DrColossos
2个回答

2

我最终使用命令行参数来进行作者信息的爬取:

class AuthorSpider(BaseSpider):
    ...

    def __init__(self, articles):
        self.start_urls = []

        for line in articles:
            article = json.loads(line)
            self.start_urls.append(data['author_url'])

接下来,我添加了在Scrapy文档中概述的重复项管道:

from scrapy import signals
from scrapy.exceptions import DropItem

class DuplicatesPipeline(object):
    def __init__(self):
        self.ids_seen = set()

    def process_item(self, item, spider):
        if item['id'] in self.ids_seen:
            raise DropItem("Duplicate item found: %s" % item)
        else:
            self.ids_seen.add(item['id'])
            return item

最后,我将文章JSON行文件传递给命令:
$ scrapy crawl authors -o authors.json -a articles=articles.json

这并不是一个完美的解决方案,但它能够起到作用。


0

一切都取决于您的业务逻辑,但这是我的建议

我假设每篇文章都应该有一个作者/多个作者。

那么为什么要多次爬取同一页以获取文章和作者呢?

所以我认为您的爬虫应该只爬取包含作者的文章,因此使用一个爬虫同时提取文章和作者,并使用Scrapy pipeline编写多个json文件,可以将文章和作者分开。

另外一点是对于大数据来说,不建议使用JSON格式,而是使用jsonlines


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接