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值的方法,也有不少复杂的写法,容易让人望而却步。如果只是为了解决爬虫的问题,可能大多数情况下没有必要。
网友评论