簡體   English   中英

如何在scrapy python中使用蜘蛛的名稱動態創建csv文件

[英]How to create a csv file dynamically with name of the spider in scrapy python

嗨,我正在抓取一些HTML頁面,

我已經編寫了Spider,並且已經從spider.py文件中的頁面中獲取了所需的數據,並且在我的pipeline.py文件中,我想將所有數據寫入到使用Spider名稱及以下名稱動態創建的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文件,但是顯示上面提到的錯誤,任何人都可以讓我知道那里發生了什么.........

問題在於文件名中的正斜杠(目錄分隔符)。 這個不允許。 嘗試在日期中使用其他字符。

此處的更多信息http://www.linuxquestions.org/questions/linux-software-2/forward-slash-in-filenames-665010/

此鏈接有助於獲取所需的格式。 如何在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"))

正如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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM