从脚本中输出Scrapy的json格式

26 投票
4 回答
27444 浏览
提问于 2025-04-18 06:03

我在一个Python脚本里运行了scrapy

def setup_crawler(domain):
    dispatcher.connect(stop_reactor, signal=signals.spider_closed)
    spider = ArgosSpider(domain=domain)
    settings = get_project_settings()
    crawler = Crawler(settings)
    crawler.configure()
    crawler.crawl(spider)
    crawler.start()
    reactor.run()

它运行得很顺利,然后就停止了,但结果在哪里呢?我想要结果以json格式输出,我该怎么做呢?

result = responseInJSON

就像我们在命令行中那样操作

scrapy crawl argos -o result.json -t json

4 个回答

4
settings.overrides 

这个方法好像不再有效了,可能已经被淘汰了。现在,正确的做法是通过使用 set 方法来修改项目设置:

from scrapy.utils.project import get_project_settings
settings = get_project_settings()
settings.set('FEED_FORMAT', 'json')
settings.set('FEED_URI', 'result.json')
8

简单!

from scrapy import cmdline

cmdline.execute("scrapy crawl argos -o result.json -t json".split())

把那个脚本放在你放 scrapy.cfg 的地方。

23

我成功地让它工作了,只需在 CrawlerProcess 的构造函数中添加 FEED_FORMATFEED_URI,使用基本的 Scrapy API 教程代码,如下所示:

process = CrawlerProcess({
'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
'FEED_FORMAT': 'json',
'FEED_URI': 'result.json'
})
27

你需要手动设置 FEED_FORMATFEED_URI 这两个选项:

settings.overrides['FEED_FORMAT'] = 'json'
settings.overrides['FEED_URI'] = 'result.json'

如果你想把结果放到一个变量里,你可以定义一个 Pipeline 类,这个类会把数据收集到一个列表中。使用 spider_closed 信号处理器来查看结果:

import json

from twisted.internet import reactor
from scrapy.crawler import Crawler
from scrapy import log, signals
from scrapy.utils.project import get_project_settings


class MyPipeline(object):
    def process_item(self, item, spider):
        results.append(dict(item))

results = []
def spider_closed(spider):
    print results

# set up spider    
spider = TestSpider(domain='mydomain.org')

# set up settings
settings = get_project_settings()
settings.overrides['ITEM_PIPELINES'] = {'__main__.MyPipeline': 1}

# set up crawler
crawler = Crawler(settings)
crawler.signals.connect(spider_closed, signal=signals.spider_closed)
crawler.configure()
crawler.crawl(spider)

# start crawling
crawler.start()
log.start()
reactor.run() 

顺便提一下,可以看看 Scrapy 是如何 解析命令行参数 的。

另外可以参考: 在同一进程中捕获标准输出

撰写回答