2

こんにちは私はいくつかのhtmlページをフェッチするためのscrapyに取り組んでいます、

私はスパイダーを作成し、spider.pyファイル内のページから必要なデータをフェッチしました。ファイル内で、スパイダーの名前で動的に作成されpipeline.pyたものにすべてのデータを書き込みたいと思います。以下は私のコードですcsv filepipeline.py

pipe.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ファイルを作成する必要がありますが、上記のエラーが表示されたら、そこで何が起こっているのか教えてください.........

4

2 に答える 2

1

The problem is with forward slash(directory separator) in your filename. It is not allowed. Try using some other character in the date.

More info here http://www.linuxquestions.org/questions/linux-software-2/forward-slash-in-filenames-665010/

This link is helpful for getting the format you want 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'

Use this in your code

open("%s(%s).csv"% (spider.name,datetime.now().strftime("%d-%m-%Y:%H-%M-%S"))
于 2012-07-27T05:34:18.693 に答える
0

カマルが指摘したように、当面の問題は、作成するファイル名にスラッシュが含まれていることです。カマルの解決策は機能しますが、カマルが提案した方法を使用してこれを修正することはしませんが、次のようにします。

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()マイクロ秒の情報を保持したい場合は、への呼び出しをドロップできます。マイクロ秒を削除するときは、2つの呼び出しで同じファイルが作成されないように、残りのアプリケーションを作成します。

また、カスタム__init__を削除して、名前spider_openedを、、open_spiderおよびspider_closedに変更することもできますclose_spideropen_spiderScrapyは、スパイダーが開いているときと閉じているときに自動的に呼び出しますclose_spider。信号に接続する必要はありません。ドキュメントには、Scrapy0.7までさかのぼってこれらのメソッドが記載されています。

于 2015-06-01T12:24:57.807 に答える