4

Web サイトの構造を定義する一連のリンクがあります。これらのリンクから画像をダウンロードしている間、ダウンロードした画像をウェブサイトの構造に似たフォルダー構造に同時に配置したいと思います

同じための私のコードは次のようなものです:

class MyImagesPipeline(ImagesPipeline):
    """Custom image pipeline to rename images as they are being downloaded"""
    page_url=None
    def image_key(self, url):
        page_url=self.page_url
        image_guid = url.split('/')[-1]
        return '%s/%s/%s' % (page_url,image_guid.split('_')[0],image_guid)

    def get_media_requests(self, item, info):
        #http://store.abc.com/b/n/s/m
        os.system('mkdir '+item['sku'][0].encode('ascii','ignore'))
        self.page_url = urlparse(item['start_url']).path #I store the parent page's url in start_url Field
        for image_url in item['image_urls']:
            yield Request(image_url)

必要なフォルダー構造が作成されますが、フォルダーを詳しく調べると、ファイルがフォルダー内で間違って配置されていることがわかります。

「get_media_requests」および「image_key」関数が非同期で実行されている可能性があるため、「image_key」関数で使用される前に「page_url」の値が変更される可能性があるため、これが発生していると思われます。

4

2 に答える 2

1

self非同期アイテム処理により、パイプライン内でクラス変数を使用できないというあなたの意見はまったく正しいです。各リクエストにパスを保存し、さらにいくつかのメソッドをオーバーライドする必要があります (未テスト):

def image_key(self, url, page_url):
    image_guid = url.split('/')[-1]
    return '%s/%s/%s' % (page_url, image_guid.split('_')[0], image_guid)

def get_media_requests(self, item, info):
    for image_url in item['image_urls']:
        yield Request(image_url, meta=dict(page_url=urlparse(item['start_url']).path))

def get_images(self, response, request, info):
    key = self.image_key(request.url, request.meta.get('page_url'))
    ...

def media_to_download(self, request, info):
    ...
    key = self.image_key(request.url, request.meta.get('page_url'))
    ...

def media_downloaded(self, response, request, info):
    ...
    try:
        key = self.image_key(request.url, request.meta.get('page_url'))
    ...
于 2012-10-20T22:26:47.360 に答える