爬取圖片過程遇到的ValueError: Missing scheme in request url: h 報錯與解決方法


一 、scrapy整體框架

1.1 scrapy框架圖

  

 

1.2 scrapy框架各結構解析

  item:保存抓取的內容

  spider:定義抓取內容的規則,也是我們主要編輯的文件

  pipelines:管道作用,用來定義如何過濾、存儲等功能(比如導出到csv或者mysql等功能)

  settings:配置例如ITEM_PIPELINES 、圖片存儲位置等等功能

  middlewares:下載器中間件是在引擎及下載器之間的特定鈎子(specific hook),處理Downloader傳遞給引擎的response

  

1.3 數據流過程

  從start_urls 開始,Scheduler 會將其交給 Downloader 進行下載,下載之后會交給 Spider 進行分析,Spider 分析出來的結果有兩種:一種是需要進一步抓取的鏈接,例如之前分析的“下一頁”的鏈接,這些東西會被傳回 Scheduler ;另一種是需要保存的數據,它們則被送到 Item Pipeline 那里,那是對數據進行后期處理(詳細分析、過濾、存儲等)的地方。另外,在數據流動的通道里還可以安裝各種中間件,進行必要的處理。  

二、 爬取圖片過程

2.1 整體介紹

2.1.1 環境

       Anocondas+python3.6

2.1.2 創建工程

1、創建hupu這個工程

E:\pgtool>scrapy startproject  hupu

 

2、創建相應的spiders

E:\pgtool>cd hupu##必須是進入到創建的項目中去建spiders

E:\pgtool\hupu>scrapy  genspider hp  hupu.com  ##hp=>生成hp.py ,爬蟲名稱為hp.py,允許訪問的域名為hupu.com

通過爬取http://photo.hupu.com/nba/p35923-1.html網頁中一個系列的圖片

2.2 配置各組件

2.2.1 item.py

import scrapy


class HupuItem(scrapy.Item):
    # define the fields for your item here like:
    hupu_pic = scrapy.Field()
#    images = scrapy.Field()
    image_paths = scrapy.Field()

 

2.2.2 settings.py

BOT_NAME = 'hupu'

SPIDER_MODULES = ['hupu.spiders']
NEWSPIDER_MODULE = 'hupu.spiders'
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
ITEM_PIPELINES = {
    'hupu.pipelines.HupuImgDownloadPipeline': 300,
}
IMAGES_URLS_FIELD = "hupu_pic"  # 對應item里面設定的字段,取到圖片的url
#IMAGES_RESULT_FIELD = "image_path"
IMAGES_STORE = 'E:/hupu'

2.2.3 hp.py

 1 # -*- coding: utf-8 -*-
 2 import scrapy
 3 from scrapy import Request
 4 from urllib.parse import urljoin
 5 from hupu.items import HupuItem
 6 class HpSpider(scrapy.Spider):
 7     name = 'hp'
 8     allowed_domains = ['hupu.com']
 9     start_urls = ['http://photo.hupu.com/nba/p35923-1.html']
10     
11     def parse(self, response):
12         item=HupuItem()
13         url=response.xpath('//div[@id="picccc"]/img[@id="bigpicpic"]/@src').extract()
14 
15         reurl="http:"+url[0]
16         print ('links is :--','\n',reurl)
17         list1=[]
18         list1.append(reurl)
19         item['hupu_pic']=list1
20         yield item
21         ifnext=response.xpath('//span[@class="nomp"]/a[2]/text()').extract()[0]
22         if "下一張" in ifnext:
23             next_url=response.xpath('//span[@class="nomp"]/a[2]/@href').extract()[0]
24             yield Request(('http://photo.hupu.com/nba/'+next_url),callback=self.parse)

 

2.2.4 pipelines.py

 1 from scrapy.pipelines.images import ImagesPipeline
 2 from scrapy import Request
 3 class HupuPipeline(object):
 4     def process_item(self, item, spider):
 5         return item
 6 class HupuImgDownloadPipeline(ImagesPipeline):
 7 
 8     def get_media_requests(self, item, info):
 9         for image_url in item['hupu_pic']:
10             yield Request(image_url)

三、 爬蟲執行與結果

3.1 執行過程

  進入到工程路徑下 scrapy crawl hp

  (base) E:\pgtool\Files\hupu>scrapy crawl hp

3.2 獲得結果

 

 四、遇到的問題與分析解決

4.1 問題出現

     最開始遇到ValueError: Missing scheme in request url: h 這種報錯,如下圖

  

4.2  問題解析

  如果單純獲取文本,那么只需start_urls是一個list;而如果獲取圖片,則必須start_urls與item中存儲圖片路徑字段這兩者必須都是 list。

4.3 解決方案

    未修改前的spiders:

   

  修改后spiders

  

五、總結

  scrapy框架簡單容易理解,而且支持異步多線程,是一個比較上手的爬蟲框架。本次爬蟲犯了一個低級錯誤,在於直接將圖片鏈接轉換為list而不經意間將鏈接拆分為一個一個的元素,如下示例:

  str1='baidu.com'

  list1=list(str1)

  list1的結果實際為['b','a','i','d','u','.','c','o','m'],這也就是為什么一直報錯Missing scheme in request url: h(翻譯為:請求URL中的丟失整體鏈接:在h開始的位置)所以需要我們將整個鏈接放在只有一個元素的list中,使用修改后list.append()將一個鏈接完整的放置在list[0]中。

 

有問題的小伙伴們可以留言討論交流,轉載請注明出處,謝謝。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM