25

scrapy在 python 脚本中运行

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

27

您需要手动设置FEED_FORMAT和设置:FEED_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 如何解析命令行参数

另请参阅:在 Python 的同一进程中捕获标准输出

于 2014-05-09T22:09:33.833 回答
21

FEED_FORMAT我设法通过简单地将and添加FEED_URI到构造函数来使其工作CrawlerProcess,使用基本的 Scrapy API 教程代码如下:

process = CrawlerProcess({
'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
'FEED_FORMAT': 'json',
'FEED_URI': 'result.json'
})
于 2015-10-08T01:11:54.513 回答
7

简单的!

from scrapy import cmdline

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

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

于 2016-02-10T20:47:15.960 回答
2
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')
于 2021-06-23T13:59:58.493 回答