2012-01-07 98 views
7

我以scrapy開始,而且我有第一個真正的問題。它正在下載圖片。所以這是我的蜘蛛。用scrapy下載圖片

from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.selector import HtmlXPathSelector 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from example.items import ProductItem 
from scrapy.utils.response import get_base_url 

import re 

class ProductSpider(CrawlSpider): 
    name = "product" 
    allowed_domains = ["domain.com"] 
    start_urls = [ 
      "http://www.domain.com/category/supplies/accessories.do" 
    ] 

    def parse(self, response): 
     hxs = HtmlXPathSelector(response) 
     items = [] 
     sites = hxs.select('//td[@class="thumbtext"]') 
     number = 0 
     for site in sites: 
      item = ProductItem() 
      xpath = '//div[@class="thumb"]/img/@src' 
      item['image_urls'] = site.select(xpath).extract()[number] 
      item['image_urls'] = 'http://www.domain.com' + item['image_urls'] 
      items.append(item) 
      number = number + 1 
     return items 

當我引用ITEM_PIPELINESIMAGES_STOREsettings.py這樣,我得到的圖片我想下載(複製粘貼成瀏覽器檢查)正確的URL。

但是,當我解除引用那些我獲得以下錯誤:

raise ValueError('Missing scheme in request url: %s' % self._url') 
exceptions.ValueError: Missing scheme in request url:h 

,我不能下載我的照片。

我搜索了整整一天,沒有找到有用的東西。

+0

你有一個管道來處理網址嗎?你在settings.py中註冊了你的管道嗎? http://doc.scrapy.org/en/latest/topics/images.html,很有參考價值。你有適當的權限寫入IMAGE_STORE路徑嗎? – dm03514 2012-01-08 01:12:17

+0

是的,我做了一切,因爲它說,其實我用這個參考,但仍然...否 – iblazevic 2012-01-08 19:28:13

回答

12

我認爲你所搜索的圖片網址是相對的。爲了構建絕對URL使用urlparse.urljoin

def parse(self, response): 
    ... 
    image_relative_url = hxs.select("...").extract()[0] 
    import urlparse 
    image_absolute_url = urlparse.urljoin(response.url, image_relative_url.strip()) 
    item['image_urls'] = [image_absolute_url] 
    ... 

沒有使用ITEM_PIPELINES,但docs說:

In a Spider, you scrape an item and put the URLs of its images into a image_urls field.

因此,項[ 'image_urls']應該是圖像的列表網址。但你的代碼有:

item['image_urls'] = 'http://www.domain.com' + item['image_urls'] 

所以,我想它迭代你的單個URL字符char - 使用每個URL。

+0

這沒有幫助。正如我所說我已經有了絕對路徑,我測試了我得到的url,它的確是圖像的網址。我試過這個,結果和以前一樣,我得到了很好的url,但是當我打開ITEM_PIPELINES和IMAGES_STORE時,我得到和 – iblazevic 2012-01-08 19:03:00

+0

一樣的錯誤,但是這種獲得絕對url的方式肯定更好,所以謝謝 – iblazevic 2012-01-08 19:04:36

+0

@iblazevic,請參閱我的更新。並且不要忘記在scrapy資源中使用upvote /接受回答 – warvariuc 2012-01-08 19:55:49

5

我認爲你可能需要提供您的圖片網址列表的項目:

item['image_urls'] = [ 'http://www.domain.com' + item['image_urls'] ] 
+0

這是正確的。即使你的網址是正確的,image_urls應該是一個url列表,而不是一個字符串。 – rvnovaes 2013-08-18 00:14:15

+0

是的,它應該是一個列表。感謝您的評論 – 2014-06-01 22:19:48

+0

100%同意你的觀點,即解決了我的問題。謝謝 – 2016-01-21 14:35:21