制作爬蟲的步驟
制作一個爬蟲一般分以下幾個步驟:
- 分析需求
- 分析網(wǎng)頁源代碼,配合開發(fā)者工具
- 編寫正則表達式或者XPath表達式
- 正式編寫 python 爬蟲代碼
效果預(yù)覽
運行效果如下:
存放圖片的文件夾:
需求分析
我們的爬蟲至少要實現(xiàn)兩個功能:
- 是搜索圖片
- 是自動下載
搜索圖片:最容易想到的是爬百度圖片的結(jié)果,我們就上百度圖片看看:
隨便搜索幾個關(guān)鍵字驶睦,可以看到已經(jīng)搜索出來很多張圖片:
分析網(wǎng)頁
我們點擊右鍵匿醒,查看源代碼:
打開源代碼之后,發(fā)現(xiàn)一堆源代碼比較難找出我們想要的資源廉羔。
這個時候溉痢,就要用開發(fā)者工具!我們回到上一頁面,調(diào)出開發(fā)者工具孩饼,我們需要用的是左上角那個東西:(鼠標(biāo)跟隨)髓削。
然后選擇你想看源代碼的地方镀娶,就可以發(fā)現(xiàn)立膛,下面的代碼區(qū)自動定位到了相應(yīng)的位置。如下圖:
我們復(fù)制這個地址,然后到剛才的一堆源代碼里搜索一下忍些,發(fā)現(xiàn)了它的位置鲁猩,但是這里我們又疑惑了,這個圖片有這么多地址罢坝,到底用哪個呢?我們可以看到有thumbURL搅窿,middleURL嘁酿,hoverURL,objURL
通過分析可以知道闹司,前面兩個是縮小的版本,hoverURL 是鼠標(biāo)移動過后顯示的版本沐飘,objURL 應(yīng)該是我們需要的游桩,可以分別打開這幾個網(wǎng)址看看,發(fā)現(xiàn) objURL 的那個最大最清晰耐朴。
找到了圖片地址借卧,接下來我們分析源代碼∩盖停看看是不是所有的 objURL 都是圖片铐刘。
發(fā)現(xiàn)都是以.jpg格式結(jié)尾的圖片影晓。
編寫正則表達式
pic_url = re.findall('"objURL":"(.*?)",',html,re.S)
編寫爬蟲代碼
這里我們用了2個包镰吵,一個是正則,一個是 requests 包
#-*- coding:utf-8 -*-
import re
import requests
復(fù)制百度圖片搜索的鏈接挂签,傳入 requests 疤祭,然后把正則表達式寫好
url = 'https://image.baidu.com/search/index?tn=baiduimage&ie=utf-8&word=%E6%A0%97%E5%B1%B1%E6%9C%AA%E6%9D%A5%E5%A4%B4%E5%83%8F&ct=201326592&ic=0&lm=-1&width=&height=&v=index'
html = requests.get(url).text
pic_url = re.findall('"objURL":"(.*?)",',html,re.S)
因為有很多張圖片饵婆,所以要循環(huán)勺馆,我們打印出結(jié)果來看看,然后用 requests 獲取網(wǎng)址,由于有些圖片可能存在網(wǎng)址打不開的情況谓传,所以加了10秒超時控制蜈项。
pic_url = re.findall('"objURL":"(.*?)",',html,re.S)
i = 1
for each in pic_url:
print each
try:
pic= requests.get(each, timeout=10)
except requests.exceptions.ConnectionError:
print('【錯誤】當(dāng)前圖片無法下載')
continue
接著就是把圖片保存下來,我們事先建立好一個 images 目錄续挟,把圖片都放進去紧卒,命名的時候,以數(shù)字命名诗祸。
dir = '../images/' + keyword + '_' + str(i) + '.jpg'
fp = open(dir, 'wb')
fp.write(pic.content)
fp.close()
i += 1
完整的代碼
我們看到有的圖片沒顯示出來博个,打開網(wǎng)址看,發(fā)現(xiàn)確實沒了功偿。
因為百度有些圖片它緩存到百度的服務(wù)器上,所以我們在百度上還能看見它械荷,但它的實際鏈接已經(jīng)失效了共耍。
總結(jié)
enjoy 我們的第一個圖片下載爬蟲吧!當(dāng)然它不僅能下載百度的圖片吨瞎,依葫蘆畫瓢痹兜,你現(xiàn)在應(yīng)該能做很多事情了,比如爬取頭像颤诀,爬淘寶展示圖等等字旭。