您好,登錄后才能下訂單哦!
這篇文章主要介紹了python編程scrapy簡單代碼如何實(shí)現(xiàn)搜狗圖片下載器,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
這次要采集的站點(diǎn)為搜狗圖片頻道,該頻道數(shù)據(jù)由接口直接返回,接口如下:
https://pic.sogou.com/napi/pc/recommend?key=homeFeedData&category=feed&start=10&len=10 https://pic.sogou.com/napi/pc/recommend?key=homeFeedData&category=feed&start=20&len=10
其中只有 start
參數(shù)在發(fā)生變化,所以實(shí)現(xiàn)起來是比較簡單的。
編寫核心爬蟲文件
import scrapy class SgSpider(scrapy.Spider): name = 'sg' allowed_domains = ['pic.sogou.com'] base_url = "https://pic.sogou.com/napi/pc/recommend?key=homeFeedData&category=feed&start={}&len=10" start_urls = [base_url.format(0)] def parse(self, response): json_data = response.json() if json_data is not None: img_list = json_data["data"]["list"] for img in img_list: yield {'image_urls': [_["originImage"] for _ in img[0]["picList"]]} else: return None
上述代碼直接調(diào)用了第一頁的接口數(shù)據(jù),后續(xù)代碼都是在對(duì)JSON數(shù)據(jù)中的圖片地址進(jìn)行提取。
其中最重要的一行代碼如下:
yield {'image_urls': [_["originImage"] for _ in img[0]["picList"]]}
這里的 image_urls
是為了調(diào)用 scrapy 內(nèi)置的圖片下載中間件,固定的參數(shù)。
settings.py
該文件也需要進(jìn)行修改,具體細(xì)節(jié)如下所示:
# 用戶代理設(shè)置 USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36' # Obey robots.txt rules ROBOTSTXT_OBEY = False # 下載間隔設(shè)置為 3 秒 DOWNLOAD_DELAY = 3 # 默認(rèn)請(qǐng)求頭 DEFAULT_REQUEST_HEADERS = { 'Accept': 'application/json, text/plain, */*', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.9', 'HOST': 'pic.sogou.com', } # 開啟 ImagesPipeline 圖片保存管道 ITEM_PIPELINES = { 'scrapy.pipelines.images.ImagesPipeline': 1, } # 圖片存儲(chǔ)文件夾 IMAGES_STORE = "images"
運(yùn)行代碼圖片就會(huì)自動(dòng)進(jìn)行下載,保存到 images
目錄中,下載完畢輸出如下信息,本次僅采集第一頁數(shù)據(jù),顧得到40張圖片。
如果你代碼運(yùn)行之后,沒有下載到目標(biāo)圖片,請(qǐng)確定是否出現(xiàn)如下BUG。
ImagesPipeline requires installing Pillow 4.0.0
解決辦法非常簡單,安裝 Pillow
庫即可。
還存在一個(gè)問題是文件名是動(dòng)態(tài)的,看起來有點(diǎn)亂。
在 pipelines.py
文件中增加一個(gè)自定義文件名稱的數(shù)據(jù)管道。
class SogouImgPipeline(ImagesPipeline): def get_media_requests(self, item, info): name = item["name"] for index, url in enumerate(item["image_urls"]): yield Request(url, meta={'name': name, 'index': index}) def file_path(self, request, response=None, info=None): # 名稱 name = request.meta['name'] # 索引 index = request.meta['index'] filename = u'{0}_{1}.jpg'.format(name, index) print(filename) return filename
上述代碼的主要功能是重新命名了圖片文件名,下面同步修改 SgSpider
類中的相關(guān)代碼。
def parse(self, response): json_data = response.json() if json_data is not None: img_list = json_data["data"]["list"] for img in img_list: yield { 'name': img[0]['title'], 'image_urls': [_["originImage"] for _ in img[0]["picList"]], } else: return None
再次運(yùn)行代碼,圖片保存之后,文件名就變得易識(shí)別了許多。
最后補(bǔ)全下一頁的邏輯即可實(shí)現(xiàn)本案例啦,這一步驟留給你來完成。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“python編程scrapy簡單代碼如何實(shí)現(xiàn)搜狗圖片下載器”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。