【问题标题】:How to create a csv file dynamically with name of the spider in scrapy python如何在scrapy python中使用蜘蛛的名称动态创建csv文件
【发布时间】:2012-07-27 05:15:16
【问题描述】:

您好,我正在使用 scrapy 获取一些 html 页面,

我已经编写了我的蜘蛛,并从spider.py 文件中的页面中获取了所需的数据,并且在我的pipeline.py 文件中,我想将所有数据写入一个动态创建的csv file,名称为蜘蛛和下面是我的pipeline.py 代码

pipeline.py:

from scrapy import log
from datetime import datetime


class examplepipeline(object):

    def __init__(self):
        dispatcher.connect(self.spider_opened, signal=signals.spider_opened)
        dispatcher.connect(self.spider_closed, signal=signals.spider_closed)

    def spider_opened(self, spider):
        log.msg("opened spider  %s at time %s" % (spider.name,datetime.now().strftime('%H-%M-%S')))
        self.exampleCsv = csv.writer(open("%s(%s).csv"% (spider.name,datetime.now().strftime("%d/%m/%Y,%H-%M-%S")), "wb"),
                   delimiter=',', quoting=csv.QUOTE_MINIMAL)
        self.exampleCsv.writerow(['Listing Name', 'Address','Pincode','Phone','Website'])           

    def process_item(self, item, spider):
        log.msg("Processsing item " + item['title'], level=log.DEBUG)
        self.exampleCsv.writerow([item['listing_name'].encode('utf-8'),
                                    item['address_1'].encode('utf-8'),
                                    [i.encode('utf-8') for i in item['pincode']],
                                    item['phone'].encode('utf-8'),
                                    [i.encode('utf-8') for i in item['web_site']]
                                    ])
        return item 


    def spider_closed(self, spider):
        log.msg("closed spider %s at %s" % (spider.name,datetime.now().strftime('%H-%M-%S')))

结果:

--- <exception caught here> ---
  File "/usr/lib64/python2.7/site-packages/twisted/internet/defer.py", line 133, in maybeDeferred
    result = f(*args, **kw)
  File "/usr/lib/python2.7/site-packages/Scrapy-0.14.3-py2.7.egg/scrapy/xlib/pydispatch/robustapply.py", line 47, in robustApply
    return receiver(*arguments, **named)
  File "/home/local/user/example/example/pipelines.py", line 19, in spider_opened
    self.examplecsv = csv.writer(open("%s(%s).csv"% (spider.name,datetime.now().strftime("%d/%m/%Y,%H-%M-%S")), "wb"),
exceptions.IOError: [Errno 2] No such file or directory: 'example(27/07/2012,10-30-40).csv'

这里实际上蜘蛛的名字是example

我不明白上面的代码有什么问题,它应该使用蜘蛛名称动态创建 csv 文件,但是显示上面提到的错误,谁能告诉我那里发生了什么............

【问题讨论】:

    标签: python csv scrapy web-crawler


    【解决方案1】:

    问题在于文件名中的正斜杠(目录分隔符)。这个不允许。尝试在日期中使用其他字符。

    更多信息在这里 http://www.linuxquestions.org/questions/linux-software-2/forward-slash-in-filenames-665010/

    此链接有助于获取您想要的格式 How to print date in a regular format in Python?

    >>> import datetime
    >>> datetime.date.today()
    datetime.date(2012, 7, 27)
    >>> str(datetime.date.today())
    '2012-07-27'
    

    在你的代码中使用它

    open("%s(%s).csv"% (spider.name,datetime.now().strftime("%d-%m-%Y:%H-%M-%S"))
    

    【讨论】:

    • 哦,我们如何创建一个带有蜘蛛名称和日期的文件呢?
    • 给出不同的日期字符串格式。 docs.python.org/library/…
    • @kamal:我认为问题不在于斜线,因为当我只给 csv/%s 一个带有蜘蛛名称的 csv 文件时,正在 csv 文件夹中创建,问题在于日期和时间,我想我们无法创建带有日期的 csv 文件,如果可能,请告诉我
    • 我用破折号替换了格式字符串中的正斜杠,效果很好。
    • @shiva 它起作用了,因为您必须已经拥有一个 csv 目录。打开不会为您提供目录。
    【解决方案2】:

    正如Kamal 指出的那样,当前的问题是您创建的文件名中存在正斜杠。 Kamal 的解决方案有效,但我不会使用 Kamal 建议的方法来解决这个问题,但是:

    open("%s(%s).csv"% (spider.name, datetime.now().replace(microsecond=0).isoformat())
    

    这里主要是使用.isoformat()把它变成ISO 8601格式:

    YYYY-MM-DDTHH:MM:SS.mmmmmm
    

    它的优点是可以按时间顺序递增排序。 .replace(microsecond=0) 调用用于删除微秒信息,在这种情况下,.isoformat() 的输出中将不存在尾随 .mmmmm。如果您想保留微秒信息,您可以拨打.replace()。当我放弃微秒时,我会编写其余的应用程序以防止两个调用创建同一个文件。

    此外,您可以删除自定义 __init__ 并将 spider_opened 重命名为 open_spider,并将 spider_closed 重命名为 close_spider。 Scrapy 会在蜘蛛打开时自动调用open_spider,在蜘蛛关闭时自动调用close_spider。你不必挂在信号上。文档早在 Scrapy 0.7 就提到了这些方法。

    【讨论】:

      猜你喜欢
      • 2011-02-20
      • 1970-01-01
      • 2017-09-03
      • 1970-01-01
      • 1970-01-01
      • 2016-01-12
      • 1970-01-01
      • 1970-01-01
      • 2012-02-16
      相关资源
      最近更新 更多