先說前提,我不推薦在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