【问题标题】:How to store json file in scrapy?如何将json文件存储在scrapy中?
【发布时间】:2019-11-24 23:19:29
【问题描述】:

我目前正在使用 Scrapy 从不同网站抓取一些域,我想知道如何将我的数据保存在本地 json 文件中,格式为列表或字典格式,键为“域”和域列表作为价值。

在爬虫文件中,item是这样的:

item['domain'] = 'xxx'.extract()
yield item

import json
import codecs

class ChinazPipeline(object):

    def __init__(self):
        self.file = codecs.open('save.json', 'w', encoding='utf-8')

    def process_item(self, item, spider):
        line = json.dumps(dict(item), ensure_ascii=False) + "\n"
        self.file.write(line)
        return item

我的期望是:

{"domain": "['google.com', 'cnn.com', 'yahoo.com']"}

或者只是简单地将我抓取的所有域保存为 json 中的列表,这两种方式都适合我。

【问题讨论】:

    标签: python json scrapy


    【解决方案1】:

    这很简单。 Json 是默认的scrapy 导出器。 您可以通过打开输出到 JSON 文件来使用它:

    scrapy runspider yourspider.py -o filename.json 
    

    Scrapy 将根据文件类型自动确定您使用的格式。 其他选项是.csv.jsonline

    这是一个简单的方法。否则你可以写你自己的ItemExporter。看看exporters documentation

    注意:

    你甚至不需要在蜘蛛启动期间打开文件,scrapy 会自己管理它。 只需生成项目,scrapy 会自动将其写入文件。


    Scrapy 最适合one page -> one item 架构。 您想要的是提前抓取所有项目,然后将它们导出为单个列表。

    所以你应该有一些像self.results 这样的变量,从每个process_item() 调用中附加新的域。然后在蜘蛛关闭事件中导出它。 这个信号有捷径。所以你可以添加:

    def closed(self, reason):
        # write self.results list to JSON file.
    

    More documentation on Spider.closed() method.

    【讨论】:

    • 我试过这种方式,但我得到了这样的东西{"domain": ["www.cebbank.com"]} {"domain": ["www.xiaojukeji.com"]} { “域”:[“www.360.cn”]},但我希望同一个字典中的所有内容都像这样{“域”:“['google.com','cnn.com','yahoo.com' ]"},你知道如何解决这个问题吗?
    • 也许您可以仅在一个项目内附加到域列表/集,然后将其生成一次。另外,也许这个链接会有所帮助:github.com/scrapy-plugins/scrapy-jsonschema
    • 更新了一个答案,因为评论太多了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2018-10-24
    相关资源
    最近更新 更多