使用Scrapy写入多个文件

时间:2013-02-03 21:09:02

标签: python web-scraping scrapy

我正在使用Scrapy抓取一个网站,并希望将结果分成两部分。通常我会像这样打电话给Scrapy:

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

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

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

2 个答案:

答案 0 :(得分:1)

我最终使用了作者刮刀的命令行参数:

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 documentation中列出的重复项管道:

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

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

答案 1 :(得分:0)

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

我认为每篇文章都应该有作者/作者。

那么为什么你要多次抓取同一页面来获取文章&作者?

所以我认为你的抓取工具应该只抓取应该包含作者的文章,所以同时使用一个scraper和使用Scrapy pipeline提取articl和author来编写可以分隔文章和作者的多个json文件。

另一点是非常大的数据json不建议使用jsonlines