原文地址:http://blog.kantli.com/article/45
python爬蟲獲取圖片比較方便的是用urllib庫中的urlretrieve函數,語法簡單:
import urllib
urllib.urlretrieve(link, 'img_name')
但許多時候,獲取圖片之前先要登錄網頁,因此往往避不開驗證碼處理的問題。簡單的驗證碼,一般通過pillow庫、pytesseract庫之類的處理,語法也很干脆:
from PIL import Image
from pytesseract import image_to_string
img = Image.open('img_name')
text = image_to_string(img)
不過,如果想用urlretrieve方法獲取驗證碼圖片,就可能會遇到一些困惑。主要的問題在于,這個方法發出圖片請求之后,服務器除了發回圖片,還會發回一個響應,這個響應包含新的cookie值。因為這個響應的存在,我們之前用opener.open()獲取的cookie值就失效了,必須要獲取這個新的值。
其實獲取的辦法也很簡單,urlretrieve返回的是一個元組,這個元組的第二個值就是響應header,那么,新的cookie值就得到了:
res = urllib.urlretrieve(link, 'img_name')[1]
new_cookie_value = res['Set-Cookie']
當然,Set-Cookie值一般還有‘JSESSIONID=’的存在,當然不是問題,簡單處理如下:
new_cookie_value = res['Set-Cookie'][11:]
剩下的問題就是,怎么把新的cookie值寫入cookie中,常用的cookielib庫中沒有直接從字符串中讀取cookie值的方法,因為用不著,比較方便的方法示例如下:
cj = cookielib.LWPCookieJar('file_name')
for item in cj:
item.name = 'JSESSIONID'
item.value = res\[‘Set-Cookie’]\[11:]
cj.save(ignore_discard=True, ignore_expires=True)
這個示例是從其它地方直接搬過來的,這個寫法還有問題,不過大意應該清楚了。
這么寫下來,感覺很順暢,其實可能的困惑點有兩個:
第一個是在獲取驗證碼圖片的時候,以為不能使用urlretrieve這個簡便的方法,而想方設法等待網頁加載完成,或者使用文件流之類的方式,太麻煩了。事實上,如果使用這個方法,一般只需要訪問圖片網址一次就可以了。
第二個是從字符串讀取cookie值的方法,也有不少復雜的寫法,容易讓人望而卻步。如果只是為了解決爬蟲的問題,可能大多數情況下沒有必要。