爬取圖片過程遇到的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]中。
有問題的小夥伴們可以留言討論交流,轉載請註明出處,謝謝。