【问题标题】:scrapy from script output in json从 json 中的脚本输出中抓取
【发布时间】:2014-06-27 18:50:51
【问题描述】:

我在 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

【问题讨论】:

    标签: python json web-scraping scrapy scrapy-spider


    【解决方案1】:

    您需要手动设置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 parses command-line arguments

    另见:Capturing stdout within the same process in Python

    【讨论】:

    • 如果我不希望它在文件中怎么办?相反,我希望它在一个变量中?结果??
    • @WasifKhalil 我已经更新了答案,试一试。
    • AttributeError: 'Settings' 对象没有属性 'overrides'
    【解决方案2】:

    我设法通过将FEED_FORMATFEED_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'
    })
    

    【讨论】:

    • 绝对是一个简单的测试解决方案!谢谢。
    【解决方案3】:

    简单!

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

    将该脚本放在您放置scrapy.cfg的位置

    【讨论】:

      【解决方案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')
      

      【讨论】:

        猜你喜欢
        • 2011-07-02
        • 1970-01-01
        • 1970-01-01
        • 2015-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-24
        相关资源
        最近更新 更多