2016-07-25 89 views
0

我試圖通過使用Scrapy Framework和djano-item從網頁設置圖像下載。我想我已經在doc 所做的一切,像但調用scrapy爬行後,我日誌看起來像這樣:Scrapy圖像管道不會下載圖像

Scrapy log

我找不到有什麼地方出了錯,但圖片字段爲空和目錄做的任何信息不包含任何圖像。

這是我的模型

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它創建請求我的網址,但在item_completed的結果PARAM我得到事端像這樣:[(False, <twisted.python.failure.Failure scrapy.pipelines.files.FileException: >)] 我仍然不知道如何解決它。 問題可能是由https引用地址引起的嗎?

回答

0

我遇到了scrapy的問題。 我的解決方案:

爲您在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' 
     } 

在您的瀏覽器中打開確切的圖片網址(您正在下載圖片的網址)。只需檢查瀏覽器的網絡標籤,查看標題列表。確保我上面提到的那個請求的標題與那些標題相同。

希望它有效。