urlretrieve获取图片的同时获取cookie值

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,967评论 19 139
  • HTTP cookie(也称为web cookie,网络cookie,浏览器cookie或者简称cookie)是网...
    留七七阅读 18,105评论 2 71
  • 细说Cookie 阅读目录 开始 Cookie 概述 Cookie的写、读过程 使用Cookie保存复杂对象 Js...
    拉肚阅读 1,130评论 0 4
  • 再看这个之前,我认为家就因为是满满的。 满满的东西,才能让人感觉到温暖。 但是看完这个以后,才发现,简单才是富足。...
    yangyanglu阅读 306评论 0 0
  • 本来想早点睡的,可是关了灯之后翻来覆去睡不着,各种思绪在脑中跳动,也许是因为生活的不充实,也许是因为黑夜给予的孤...
    一只走心的90single汪阅读 177评论 4 2