6

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

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

两只蜘蛛完全独立,完全不交流。此设置适用于较小的网站,但较大的网站的作者太多,我无法像这样抓取。

我如何让articles蜘蛛告诉authors蜘蛛要抓取哪些页面并维护这个两个文件结构?理想情况下,我宁愿不将作者 URL 写入文件,然后与其他蜘蛛一起读回。

4

2 回答 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

这不是一个很好的解决方案,但它有效。

于 2013-02-07T18:52:08.717 回答
0

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

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

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

所以我认为你的爬虫应该只爬取应该包含作者的文章,所以用一个刮刀同时提取文章和作者,并使用 Scrapy管道编写多个可以分离文章和作者的 json 文件。

还有一点是对于非常大的数据 json 不建议使用jsonlines

于 2013-02-07T10:40:18.060 回答