天天看點

python爬蟲實戰——圖檔自動下載下傳器制作爬蟲的基本步驟效果需求分析分析網頁編寫正規表達式編寫爬蟲代碼

原文位址:http://blog.csdn.net/hk2291976/article/details/51188728

python爬蟲實戰——圖檔自動下載下傳器

之前介紹了那麼多基本知識【Python爬蟲】入門知識,大家也估計手癢了。想要實際做個小東西來看看,畢竟:

talk is cheap show me the code!

這個小工程的代碼都在github上,感興趣的自己去下載下傳: 

https://github.com/hk029/Pickup

制作爬蟲的基本步驟

順便通過這個小例子,可以掌握一些有關制作爬蟲的基本的步驟。

一般來說,制作一個爬蟲需要分以下幾個步驟:

1. 分析需求(對,需求分析非常重要,不要告訴我你老師沒教你) 

2. 分析網頁源代碼,配合F12(沒有F12那麼亂的網頁源代碼,你想看死我?) 

3. 編寫正規表達式或者XPath表達式(就是前面說的那個神器) 

4. 正式編寫python爬蟲代碼

效果

運作:

python爬蟲實戰——圖檔自動下載下傳器制作爬蟲的基本步驟效果需求分析分析網頁編寫正規表達式編寫爬蟲代碼

恩,讓我輸入關鍵詞,讓我想想,輸入什麼好呢?好像有點暴露愛好了。

python爬蟲實戰——圖檔自動下載下傳器制作爬蟲的基本步驟效果需求分析分析網頁編寫正規表達式編寫爬蟲代碼

回車

python爬蟲實戰——圖檔自動下載下傳器制作爬蟲的基本步驟效果需求分析分析網頁編寫正規表達式編寫爬蟲代碼

好像開始下載下傳了!好贊!,我看看下載下傳的圖檔,哇瞬間我感覺我又補充了好多表情包….

python爬蟲實戰——圖檔自動下載下傳器制作爬蟲的基本步驟效果需求分析分析網頁編寫正規表達式編寫爬蟲代碼

好了,差不多就是這麼個東西。

需求分析

”我想要圖檔,我又不想上網搜“ 

”最好還能自動下載下傳” 

……

這就是需求,好了,我們開始分析需求,至少要實作兩個功能,一是搜尋圖檔,二是自動下載下傳。

首先,搜尋圖檔,最容易想到的就是爬百度圖檔的結果,好,那我們就上百度圖檔看看

python爬蟲實戰——圖檔自動下載下傳器制作爬蟲的基本步驟效果需求分析分析網頁編寫正規表達式編寫爬蟲代碼

基本就是這樣,還挺漂亮的。

我們試着搜一個東西,我打一個暴字,出來一系列搜尋結果,這說明什麼….

python爬蟲實戰——圖檔自動下載下傳器制作爬蟲的基本步驟效果需求分析分析網頁編寫正規表達式編寫爬蟲代碼

随便找一個回車

python爬蟲實戰——圖檔自動下載下傳器制作爬蟲的基本步驟效果需求分析分析網頁編寫正規表達式編寫爬蟲代碼

好了,我們已經看到了很多圖檔了,如果我們能把這裡面的圖檔都爬下來就好了。我們看見網址裡有關鍵詞資訊

python爬蟲實戰——圖檔自動下載下傳器制作爬蟲的基本步驟效果需求分析分析網頁編寫正規表達式編寫爬蟲代碼

我們試着在網址直接換下關鍵詞,跳轉了有沒有!

python爬蟲實戰——圖檔自動下載下傳器制作爬蟲的基本步驟效果需求分析分析網頁編寫正規表達式編寫爬蟲代碼

這樣,可以通過這個網址查找特定的關鍵詞的圖檔,是以理論上,我們可以不用打開網頁就能搜尋特定的圖檔了。下個問題就是如何實作自動下載下傳,其實利用之前的知識,我們知道可以用request,擷取圖檔的網址,然後把它爬下來,儲存成.jpg就行了。

是以這個項目就應該可以完成了。

分析網頁

好了,我們開始做下一步,分析網頁源代碼。這裡 我先切換回傳統頁面,為什麼這樣做,因為目前百度圖檔采用的是瀑布流模式,動态加載圖檔,處理起來很麻煩,傳統的翻頁界面就好很多了。

python爬蟲實戰——圖檔自動下載下傳器制作爬蟲的基本步驟效果需求分析分析網頁編寫正規表達式編寫爬蟲代碼

這裡還一個技巧,就是:能爬手機版就不要爬電腦版,因為手機版的代碼很清晰,很容易擷取需要的内容。

好了,切換回傳統版本了,還是有頁碼的看的舒服。

python爬蟲實戰——圖檔自動下載下傳器制作爬蟲的基本步驟效果需求分析分析網頁編寫正規表達式編寫爬蟲代碼

我們點選右鍵,檢視源代碼

python爬蟲實戰——圖檔自動下載下傳器制作爬蟲的基本步驟效果需求分析分析網頁編寫正規表達式編寫爬蟲代碼

這都是什麼鬼,怎麼可能看清!!

python爬蟲實戰——圖檔自動下載下傳器制作爬蟲的基本步驟效果需求分析分析網頁編寫正規表達式編寫爬蟲代碼

這個時候,就要用F12了,開發者工具!我們回到上一頁面,按F12,出來下面這個工具欄,我們需要用的就是左上角那個東西,一個是滑鼠跟随,一個是切換手機版本,都對我們很有用。我們這裡用第一個

python爬蟲實戰——圖檔自動下載下傳器制作爬蟲的基本步驟效果需求分析分析網頁編寫正規表達式編寫爬蟲代碼

然後選擇你想看源代碼的地方,就可以發現,下面的代碼區自動定位到了這個位置,是不是很NB!

python爬蟲實戰——圖檔自動下載下傳器制作爬蟲的基本步驟效果需求分析分析網頁編寫正規表達式編寫爬蟲代碼

我們複制這個位址

python爬蟲實戰——圖檔自動下載下傳器制作爬蟲的基本步驟效果需求分析分析網頁編寫正規表達式編寫爬蟲代碼

然後到剛才的亂七八糟的源代碼裡搜尋一下,發現它的位置了!(小樣!我還找不到你!)但是這裡我們又疑惑了,這個圖檔怎麼有這麼多位址,到底用哪個呢?我們可以看到有thumbURL,middleURL,hoverURL,objURL

python爬蟲實戰——圖檔自動下載下傳器制作爬蟲的基本步驟效果需求分析分析網頁編寫正規表達式編寫爬蟲代碼

通過分析可以知道,前面兩個是縮小的版本,hover是滑鼠移動過後顯示的版本,objURL應該是我們需要的,不信可以打開這幾個網址看看,發現obj那個最大最清晰。

python爬蟲實戰——圖檔自動下載下傳器制作爬蟲的基本步驟效果需求分析分析網頁編寫正規表達式編寫爬蟲代碼
python爬蟲實戰——圖檔自動下載下傳器制作爬蟲的基本步驟效果需求分析分析網頁編寫正規表達式編寫爬蟲代碼

好了,找到了圖檔位置,我們就開始分析它的代碼。我看看是不是所有的objURL全是圖檔

python爬蟲實戰——圖檔自動下載下傳器制作爬蟲的基本步驟效果需求分析分析網頁編寫正規表達式編寫爬蟲代碼

貌似都是以.jpg格式結尾的,那應該跑不了了,我們可以看到搜尋出61條,說明應該有61個圖檔

編寫正規表達式

通過前面的學習,寫出如下的一條正規表達式不難把?

pic_url = re.findall('"objURL":"(.*?)",',html,re.S)
           
  • 1
  • 2

編寫爬蟲代碼

好了,正式開始編寫爬蟲代碼了。這裡我們就用了2個包,一個是正則,一個是requests包,之前也介紹過了,沒看的回去看!

#-*- coding:utf-8 -*-
import re
import requests
           
  • 1
  • 2
  • 3

然後我們把剛才的網址粘過來,傳入requests,然後把正規表達式寫好

url = 'http://image.baidu.com/search/flip?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1460997499750_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&



html = requests.get(url).text
pic_url = re.findall('"objURL":"(.*?)",',html,re.S)
           
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

理論有很多圖檔,是以要循環,我們列印出結果來看看,然後用request擷取網址,這裡由于有些圖檔可能存在網址打不開的情況,加個5秒逾時控制。

pic_url = re.findall('"objURL":"(.*?)",',html,re.S)
i = 
for each in pic_url:
    print each
    try:
        pic= requests.get(each, timeout=)
    except requests.exceptions.ConnectionError:
        print '【錯誤】目前圖檔無法下載下傳'
        continue
           
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

好了,再就是把網址儲存下來,我們在事先在目前目錄建立一個picture目錄,把圖檔都放進去,命名的時候,用數字命名把

string = 'pictures\\'+str(i) + '.jpg'
    fp = open(string,'wb')
    fp.write(pic.content)
    fp.close()
    i += 
           
  • 1
  • 2
  • 3
  • 4
  • 5

整個代碼就是這樣:

#-*- coding:utf-8 -*-
import re
import requests

url = 'http://image.baidu.com/search/flip?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1460997499750_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&


html = requests.get(url).text
pic_url = re.findall('"objURL":"(.*?)",',html,re.S)
i = 
for each in pic_url:
    print each
    try:
        pic= requests.get(each, timeout=)
    except requests.exceptions.ConnectionError:
        print '【錯誤】目前圖檔無法下載下傳'
        continue
    string = 'pictures\\'+str(i) + '.jpg'
    fp = open(string,'wb')
    fp.write(pic.content)
    fp.close()
    i += 
           
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

我們運作一下,看效果(什麼你說這是什麼IDE感覺很炫!?趕緊去裝Pycharm,Pycharm的配置和使用看這個文章!)!

python爬蟲實戰——圖檔自動下載下傳器制作爬蟲的基本步驟效果需求分析分析網頁編寫正規表達式編寫爬蟲代碼

好了我們下載下傳了58個圖檔,咦剛才不是應該是61個嗎?

python爬蟲實戰——圖檔自動下載下傳器制作爬蟲的基本步驟效果需求分析分析網頁編寫正規表達式編寫爬蟲代碼

我們看,運作中出現了有一些圖檔下載下傳不了 

python爬蟲實戰——圖檔自動下載下傳器制作爬蟲的基本步驟效果需求分析分析網頁編寫正規表達式編寫爬蟲代碼

我們還看到有圖檔沒顯示出來,打開網址看,發現确實沒了。

python爬蟲實戰——圖檔自動下載下傳器制作爬蟲的基本步驟效果需求分析分析網頁編寫正規表達式編寫爬蟲代碼

是以,百度有些圖檔它緩存到了自己的機器上,是以你還能看見,但是實際連接配接已經失效

好了,現在自動下載下傳問題解決了,那根據關鍵詞搜尋圖檔呢?隻要改url就行了,我這裡把代碼寫下來了

word = raw_input("Input key word: ")
    url = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word='+word+'&ct=201326592&v=flip'
    result = requests.get(url)
           
  • 1
  • 2
  • 3

好了,享受你第一個圖檔下載下傳爬蟲吧!!