嗨,我正忙着抓取一些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文件,但是显示上面提到的错误,请让我知道那里发生了什么.
发布于 2012-07-27 05:34:18
问题在于文件名中的正斜杠(目录分隔符)。这是不允许的。尝试在日期中使用其他字符。
更多信息请访问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"))发布于 2015-06-01 12:24:57
正如Kamal所指出的,当前的问题是在您创建的文件名中存在正斜杠。Kamal的解决方案起作用,但我不会通过使用Kamal建议的方法来修复这个问题,但是:
open("%s(%s).csv"% (spider.name, datetime.now().replace(microsecond=0).isoformat())这里的主要内容是使用.isoformat()将其转换为ISO8601格式:
YYYY-MM-DDTHH:MM:SS.mmmmmm它的优点是在增加时间顺序方面是微不足道的。.replace(microsecond=0)调用的目的是删除微秒信息,在这种情况下,跟踪.mmmmm将从.isoformat()的输出中消失。如果您想保存微秒信息,可以取消对.replace()的调用。当我删除微秒时,我会编写其余的应用程序,以防止两个调用创建相同的文件。
另外,您可以删除自定义__init__,并将spider_opened重命名为open_spider,将spider_closed重命名为close_spider。当一个蜘蛛被打开时,Scrapy会自动调用open_spider,当一个蜘蛛被关闭时,Scrapy会自动调用close_spider。你不必挂在信号上。文档提到这些方法可以追溯到Scrapy0.7。
https://stackoverflow.com/questions/11681842
复制相似问题