美文网首页Python数据采集与爬虫爬虫专题
urlretrieve获取图片的同时获取cookie值

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

作者: Kant_14 | 来源:发表于2017-06-14 21:30 被阅读85次

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

    相关文章

      网友评论

        本文标题:urlretrieve获取图片的同时获取cookie值

        本文链接:https://www.haomeiwen.com/subject/aumeqxtx.html