0

Scrapy Framework と djano-item を使用して、Web ページからの画像のダウンロードをセットアップしようとしています。ドキュメントのようにすべてを行ったと思います が、スクレイピークロールを呼び出した後、次のようにログに記録します。

スクレイピーログ

何が問題なのかについての情報は見つかりませんが、画像フィールドは空で、ディレクトリには画像が含まれていません。

これは私のモデルです

class Event(models.Model):
    title = models.CharField(max_length=100, blank=False)
    description = models.TextField(blank=True, null=True)
    event_location = models.CharField(max_length=100, blank = True, null= True)
    image_urls = models.CharField(max_length = 200, blank = True, null = True)
    images = models.CharField(max_length=100, blank = True, null = True)
    url = models.URLField(max_length=200)

    def __unicode(self):
        return self.title

これが、スパイダーから画像パイプラインに移動する方法です

def parse_from_details_page(self, response):
    "Some code"
    item_event = item_loader.load_item()
    #this is to create image_urls list (there is only one image_url allways)
    item_event['image_urls'] = [item_event['image_urls'],]
    return item_event

そして最後に、これは Scrapy プロジェクトの私の settings.py です:

import sys
import os
import django

DJANGO_PROJECT_PATH = os.path.join(os.path.dirname((os.path.abspath(__file__))), 'MyScrapy')
#sys.path.insert(0, DJANGO_PROJECT_PATH)
#sys.path.append(DJANGO_PROJECT_PATH)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "MyScrapy.settings")
#os.environ["DJANGO_SETTINGS_MODULE"] = "MyScrapy.settings"


django.setup()

BOT_NAME = 'EventScraper'

SPIDER_MODULES = ['EventScraper.spiders']
NEWSPIDER_MODULE = 'EventScraper.spiders'

ITEM_PIPELINES = {
    'scrapy.pipelines.images.ImagesPipeline': 100,
    'EventScraper.pipelines.EventscraperPipeline': 200,
}

#MEDIA STORAGE URL
IMAGES_STORE = os.path.join(DJANGO_PROJECT_PATH, "IMAGES")

#IMAGES (used to be sure that it takes good fields)
FILES_URLS_FIELD = 'image_urls'
FILES_RESULT_FIELD = 'images'

よろしくお願いいたします。

編集:

このようなドキュメントのカスタム イメージ パイプラインを使用しました。

class MyImagesPipeline(ImagesPipeline):

def get_media_requests(self, item, info):
    for image_url in item['image_urls']:
        import ipdb; ipdb.set_trace()
        yield scrapy.Request(image_url)

def item_completed(self, results, item, info):
    import ipdb; ipdb.set_trace()
    image_paths = [x['path'] for ok, x in results if ok]
    if not image_paths:
        raise DropItem("Item contains no images")
    item['image_paths'] = image_paths
    return item

get_media_requests では URL へのリクエストが作成されますが、item_completed の結果パラメーターでは次のようなものが得られます:[(False, <twisted.python.failure.Failure scrapy.pipelines.files.FileException: >)] まだ修正方法がわかりません。https を使用したアドレスへの参照によって問題が発生する可能性はありますか?

4

1 に答える 1

0

私はスクレイピーで正確な問題に直面しました。私の解決策:

get_media_requests 関数で生成するリクエストにヘッダーを追加しました。ユーザー エージェントとホストを他のヘッダーと共に追加しました。これが私のヘッダーのリストです。

headers = {
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
            'Accept-Encoding': 'gzip, deflate, sdch',
            'Accept-Language': 'en-GB,en-US;q=0.8,en;q=0.6',
            'Connection': 'keep-alive',
            'Upgrade-Insecure-Requests': '1',
            'Proxy-Connection': 'keep-alive',
            'Pragma': 'no-cache',
            'Cache-Control': 'no-cache',
            'Host': 'images.finishline.com',
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'
        }

ブラウザで正確な画像の URL (画像をダウンロードする URL) を開きます。ヘッダーのリストについては、ブラウザのネットワーク タブを確認してください。上記のリクエストのヘッダーがそれらと同じであることを確認してください。

それがうまくいくことを願っています。

于 2016-08-31T07:47:09.343 に答える