如何在scrapy python中使用蜘蛛的名称动态创建csv文件

时间:2012-07-27 05:15:17

标签: python csv scrapy web-crawler

您好我正在研究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文件,但是显示上面提到的错误,任何人都可以让我知道那里发生了什么.........

2 个答案:

答案 0 :(得分: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"))

答案 1 :(得分:0)

正如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)调用是删除微秒信息,在这种情况下,.mmmmm的输出中将不存在尾随.isoformat()。如果要保留微秒信息,可以将呼叫暂停到.replace()。当我删除微秒时,我编写其余的应用程序以防止两次调用创建相同的文件。

此外,您可以删除自定义__init__并将spider_opened重命名为open_spider,将spider_closed重命名为close_spider。当蜘蛛打开时,Scrapy会自动调用open_spider,当蜘蛛关闭时,Sc close_spider会自动调用#include <stdio.h> #include <stdlib.h> #define INITIAL_SIZE 10 int main(int argc, char **argv){ int i = 0, num, size = 0, n = INITIAL_SIZE; int *A; A = malloc(n * sizeof(int)); if(A == NULL){ printf("OUT OF MEMORY\n"); exit(EXIT_FAILURE); } while(scanf("%d",&num) == 1 && getchar()!='\n'){ A[i] = num; i++; size++; if (size >= n){ n = n * 2; A = realloc(A,n * sizeof(int)); } } printf("Int Array: "); for (i = 0; i <= size; i++){ printf("%d ", A[i]); } printf("\n"); return 0; } 。您不必挂钩信号。该文档早在Scrapy 0.7中就提到了这些方法。