【问题标题】:Running scrapy from inside Python script - CSV exporter doesn't work从 Python 脚本内部运行 scrapy - CSV 导出器不起作用
【发布时间】:2013-07-19 15:09:59
【问题描述】:

当我从命令行运行它时,我的刮板工作正常,但是当我尝试从 python 脚本中运行它时(使用 Twisted 概述的方法 here)它不会输出它通常的两个 CSV 文件做。我有一个创建和填充这些文件的管道,其中一个使用 CsvItemExporter(),另一个使用 writeCsvFile()。代码如下:

class CsvExportPipeline(object):

    def __init__(self):
        self.files = {}

    @classmethod
    def from_crawler(cls, crawler):
        pipeline = cls()
        crawler.signals.connect(pipeline.spider_opened, signals.spider_opened)
        crawler.signals.connect(pipeline.spider_closed, signals.spider_closed)
        return pipeline

    def spider_opened(self, spider):
        nodes = open('%s_nodes.csv' % spider.name, 'w+b')
        self.files[spider] = nodes
        self.exporter1 = CsvItemExporter(nodes, fields_to_export=['url','name','screenshot'])
        self.exporter1.start_exporting()

        self.edges = []
        self.edges.append(['Source','Target','Type','ID','Label','Weight'])
        self.num = 1

    def spider_closed(self, spider):
        self.exporter1.finish_exporting()
        file = self.files.pop(spider)
        file.close()

        writeCsvFile(getcwd()+r'\edges.csv', self.edges)

    def process_item(self, item, spider):
        self.exporter1.export_item(item)

        for url in item['links']:
            self.edges.append([item['url'],url,'Directed',self.num,'',1])
            self.num += 1
        return item

这是我的文件结构:

SiteCrawler/      # the CSVs are normally created in this folder
    runspider.py  # this is the script that runs the scraper
    scrapy.cfg
    SiteCrawler/
        __init__.py
        items.py
        pipelines.py
        screenshooter.py
        settings.py
        spiders/
            __init__.py
            myfuncs.py
            sitecrawler_spider.py

刮板似乎在所有其他方面都正常运行。命令行末尾的输出表明已爬取了预期的页面数量,并且蜘蛛似乎已正常完成。我没有收到任何错误消息。

---- 编辑: ----

将打印语句和语法错误插入管道没有任何效果,因此看起来管道被忽略了。为什么会这样?

下面是运行爬虫的脚本代码(runspider.py):

from twisted.internet import reactor

from scrapy import log, signals
from scrapy.crawler import Crawler
from scrapy.settings import Settings
from scrapy.xlib.pydispatch import dispatcher
import logging

from SiteCrawler.spiders.sitecrawler_spider import MySpider

def stop_reactor():
    reactor.stop()

dispatcher.connect(stop_reactor, signal=signals.spider_closed)
spider = MySpider()
crawler = Crawler(Settings())
crawler.configure()
crawler.crawl(spider)
crawler.start()
log.start(loglevel=logging.DEBUG)
log.msg('Running reactor...')
reactor.run()  # the script will block here until the spider is closed
log.msg('Reactor stopped.')   

【问题讨论】:

标签: python python-2.7 export twisted scrapy


【解决方案1】:

将“from scrapy.settings import Settings”替换为“from scrapy.utils.project import get_project_settings as Settings”解决了问题。

找到了解决方案here。没有提供解决方案的解释。

alecxe 提供了an example 如何从 Python 脚本中运行 Scrapy。

编辑:

详细阅读了 alecxe 的帖子后,我现在可以看到“from scrapy.settings import Settings”和“from scrapy.utils.project import get_project_settings as Settings”之间的区别。后者允许您使用项目的设置文件,而不是默认设置文件。阅读 alecxe 的帖子(链接到上面)了解更多详情。

【讨论】:

    【解决方案2】:

    在我的项目中,我使用 os.system 在另一个 python 脚本中调用了scrapy代码

    import os
    os.chdir('/home/admin/source/scrapy_test')
    command = "scrapy crawl test_spider -s FEED_URI='file:///home/admin/scrapy/data.csv' -s LOG_FILE='/home/admin/scrapy/scrapy_test.log'"
    return_code = os.system(command)
    print 'done'
    

    【讨论】:

      猜你喜欢
      • 2013-09-18
      • 2012-08-11
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 2018-02-15
      • 2017-05-16
      • 2016-11-11
      相关资源
      最近更新 更多