python編程scrapy簡單代碼實現(xiàn)搜狗圖片下載器
學(xué)習(xí)任何編程技術(shù),都要有緊有送,今天這篇博客就到了放松的時候了,我們學(xué)習(xí)一下如何用 scrapy 下載圖片吧。
目標(biāo)站點說明
這次要采集的站點為搜狗圖片頻道,該頻道數(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ā)生變化,所以實現(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ù)代碼都是在對JSON數(shù)據(jù)中的圖片地址進行提取。
其中最重要的一行代碼如下:
yield {'image_urls': [_["originImage"] for _ in img[0]["picList"]]}
這里的 image_urls 是為了調(diào)用 scrapy 內(nèi)置的圖片下載中間件,固定的參數(shù)。
settings.py
該文件也需要進行修改,具體細(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)請求頭
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,
}
# 圖片存儲文件夾
IMAGES_STORE = "images"
運行代碼圖片就會自動進行下載,保存到 images 目錄中,下載完畢輸出如下信息,本次僅采集第一頁數(shù)據(jù),顧得到40張圖片。

如果你代碼運行之后,沒有下載到目標(biāo)圖片,請確定是否出現(xiàn)如下BUG。
ImagesPipeline requires installing Pillow 4.0.0
解決辦法非常簡單,安裝 Pillow 庫即可。
還存在一個問題是文件名是動態(tài)的,看起來有點亂。

在 pipelines.py 文件中增加一個自定義文件名稱的數(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
再次運行代碼,圖片保存之后,文件名就變得易識別了許多。

最后補全下一頁的邏輯即可實現(xiàn)本案例啦,這一步驟留給你來完成。
以上就是使用python scrapy簡單代碼實現(xiàn)搜狗圖片下載器的詳細(xì)內(nèi)容,更多關(guān)于python scrapy實現(xiàn)搜狗圖片下載器的資料請關(guān)注本站其它相關(guān)文章!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信