5

Scrapy (バージョン 1.0.3) スパイダーを使用して、Web ページからいくつかのデータを抽出し、次のようにファイルをダウンロードします (簡略化):

def extract_data(self, response):
    title = response.xpath('//html/head/title/text()').extract()[0].strip()
    my_item = MyItem()
    my_item['title'] = title    

    file_url = response.xpath('...get url of file...')
    file_urls = [file_url]  # here there can be more urls, so I'm storing like a list
    fi = FileItem()
    fi['file_urls'] = file_urls 
    yield my_item
    yield fi

pipelines.py では、FilePipeline をオーバーライドしてファイルの名前を変更するだけです。

from scrapy.pipelines.files import FilesPipeline

class CustomFilesPipeline(FilesPipeline):
    def file_path(self, request, response=None, info=None):
        filename = format_filename(request.url)
        return filename

私が持っているitems.pyで:

class MyItem(scrapy.Item):
    title = scrapy.Field()

class FileItem(scrapy.Item):
    file_urls = scrapy.Field()
    files = scrapy.Field()

私が持っているsettings.pyで:

ITEM_PIPELINES = {
    'myscraping.pipelines.CustomFilesPipeline': 100
} 

出力csvファイルで、次のようなものが得られます。

title1
title2
,
,
title3
etc.

空の行 (カンマのみ) はダウンロードされたファイルを表しているようです。そのような行が出力 csv ファイルに含まれないようにする方法を知りたい、またはアドバイスを得たいです。(ファイルはフォルダーに保存されます)。
Scrapy の設定で FEED_STORE_EMPTY (デフォルトでは false です。つまり、空のフィードをエクスポートするべきではありません) について知りましたが、これは私が推測するファイルには関係ありません。
これはパイプラインで何かをしなければならないと感じていますが、その方法がわかりません。
任意の助けをいただければ幸いです

4

1 に答える 1

0

ここに答えを貼り付けます:

def extract_data (自己、応答):
    title = response.xpath('//html/head/title/text()').extract()[0].strip()
    my_item = MyItem()
    my_item['タイトル'] = タイトル    
    file_url = response.xpath('...ファイルの URL を取得...')
    my_item['file_urls'] = [file_url]
    利回り my_item
于 2015-10-15T09:32:47.177 に答える