scrapy 在爬取過程中抓取下載圖片


先說前提,我不推薦在sarapy爬取過程中使用scrapy自帶的 ImagesPipeline 進行下載,是在是太耗時間了

最好是保存,在使用其他方法下載


 

我這個是在 https://blog.csdn.net/qq_41781877/article/details/80631942 看到的,可以稍微改改來講解

文章不想其他文章說的必須在items.py 中建立 image_urls和image_path ,可以直接無視

只需要yield返回的item中有你需要的圖片下載鏈接

設置mid中的ua和ip,異常情況啥的,接下來是在pip中借用scrapy自帶的圖片下載類

ImagesPipeline


接下來基本是固定模板,創建一個類三個函數,都是固定的,除了方法可能根據需求改寫 pip文件重寫
from scrapy.pipelines.images import ImagesPipeline
from scrapy.exceptions import DropItem

import re
import scrapy

class SaveImagePipeline(ImagesPipeline):
  
  # 使用這個類,運行的第一個函數是這個
get_media_requestsdef get_media_requests(self, item, info):# 下載圖片,如果傳過來的是集合需要循環下載
 # meta里面的數據是從spider獲取,然后通過meta傳遞給下面方法:file_path # yield Request(url=item['url'],meta={'name':item['title']})       # 這是我自己改的,根據yield給的tag和img_url切割得到一個圖片名,傳遞給下一個函數 name = item['tag'] + item['img_url'].split('/')[-1] yield scrapy.Request(url=item['img_url'], meta={'name':name})   # 第三個運行函數,判斷有沒有保存成功 ,我該寫了沒有保存成功者保存在本地文件中,以后進行抓取 def item_completed(self, results, item, info): # 是一個元組,第一個元素是布爾值表示是否成功 if not results[0][0]:
      with open('img_error.txt', 'a')as f:
        
         error = str(item['tag']+' '+item['img_url'])
          f.write(error)
      f.write('\n')
         raise DropItem('下載失敗') 
     
return item  

 
  # 第二個運行函數
# 重命名,若不重寫這函數,圖片名為哈希,就是一串亂七八糟的名字 def file_path(self, request, response=None, info=None): # 接收上面meta傳遞過來的圖片名稱
     # 我寫的圖片名
name = request.meta['name'] # 根據情況來選擇,如果保存圖片的名字成一個體系,那么可以使用這個
image_name = request.url.split('/')[-1] # 清洗Windows系統的文件夾非法字符,避免無法創建目錄 folder_strip = re.sub(r'[?\\*|“<>:/]', '', str(name)) # 分文件夾存儲的關鍵:{0}對應着name;{1}對應着image_guid # filename = u'{0}/{1}'.format(folder_strip, image_name)    # 如果有體系,可以使用這個 filename = u'{0}'.format(folder_strip) return filename

  
 
        

 

接下來在settings中設置文件放置在哪

IMAGES_STORE = ‘./meizi’            # meizi是放置圖片的文件夾,隨意設置名字

 

# 打開pip

ITEM_PIPELINES = {
   '爬蟲.pipelines.SaveImagePipeline': 300,         
}

 


 


,如果圖片有反爬,可以設置一個referer
我的如下 ,連同ua一起設置
 
         
import user_agent

class
Girl13_UA_Middleware(object): def process_request(self, request, spider): request.headers['User_Agent'] = user_agent.generate_user_agent() referer = request.url if referer: request.headers['Referer'] = referer

settings中將這個中間件mid設置為1

 





 

不過用這個還是很多下載出現錯誤404  ,雖然有一些下載下來了,五五開吧

 

 

要么一堆一次成功,要么一堆錯誤,有可能是ip訪問頻率問題吧,下次我再試試

 

github源碼地址  https://github.com/z1421012325/girl13_spider


免責聲明!

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



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