Как динамически создать файл csv с именем паука в scrapy python

Привет, я работаю над 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-файл с именем паука, но показывает вышеупомянутую ошибку, может ли кто-нибудь сообщить мне, что там происходит.........


person Shiva Krishna Bavandla    schedule 27.07.2012    source источник


Ответы (2)


Проблема связана с косой чертой (разделителем каталогов) в вашем имени файла. Это не разрешено. Попробуйте использовать другой символ в дате.

Подробнее здесь 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"))
person Kamal    schedule 27.07.2012
comment
о, как мы можем создать файл с именем паука и датой? - person Shiva Krishna Bavandla; 27.07.2012
comment
дать другой формат строки даты. docs.python.org/library/ - person Babu; 27.07.2012
comment
@kamal: я думаю, что проблема не в косой черте, потому что, когда я дал только csv/%sa файл csv с именем паука, создается в папке csv, проблема связана с датой и временем, я думаю, что мы не можем создать файл csv с датой, если возможно, пожалуйста, дайте мне знать - person Shiva Krishna Bavandla; 27.07.2012
comment
Я заменил косую черту в строке формата на тире, и все заработало нормально. - person Lenna; 27.07.2012
comment
@shiva это сработало, потому что у вас уже должен быть каталог csv. открыть бы не каталоги для вас. - person Kamal; 27.07.2012
comment
@kamal: да, конечно, я нашел решение, на самом деле мы не можем создавать имена файлов с косой чертой, поэтому отображается, что я сделал формат даты в d-m-y, так что все равно сработало, большое спасибо за вашу поддержку - person Shiva Krishna Bavandla; 27.07.2012

Как указал Камаль, неотложной проблемой является наличие косой черты в имени файла, который вы создаете. Решение Камала работает, но я бы не стал исправлять это, используя метод, предложенный Камалем, но с помощью:

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

Главное здесь — использование .isoformat() для перевода в формат ISO 8601:

YYYY-MM-DDTHH:MM:SS.mmmmmm

который имеет то преимущество, что его можно легко отсортировать в возрастающем хронологическом порядке. Вызов .replace(microsecond=0) предназначен для удаления микросекундной информации, и в этом случае конечный .mmmmm будет отсутствовать в выводе .isoformat(). Вы можете сбросить вызов на .replace(), если хотите сохранить информацию о микросекундах. Когда я отбрасываю микросекунды, я пишу остальные свои приложения, чтобы два вызова не создавали один и тот же файл.

Кроме того, вы можете удалить свой собственный __init__ и переименовать spider_opened в open_spider, а spider_closed в close_spider. Scrapy будет автоматически вызывать open_spider при открытии паука и close_spider при закрытии паука. Вам не нужно цепляться за сигналы. В документации эти методы упоминаются еще в Scrapy 0.7.

person Louis    schedule 01.06.2015