打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
python学习: 使用browsercookie从浏览器获取cookies

上一节,我们使用Charles记录微博的登录过程,并从中解析出了微博的登录细节,还用Python模拟实现了整个过程。只要微博登录不改变,我们的代码就一直可用,这也算是一劳永逸的事情了,而且程序运行中不需要人工参与,高度自动化。记得之前微博还是有验证码的,这次重新实现的这个过程中没有发现验证码的蛛丝马迹。

完全用Python实现模拟登录的过程其实是很累的,考验的是耐力、观察力、联想能力等等。虽然累,但一旦完成后面就省心了,也算是值得一试。

然而世事无常,并非所有登录都像微博那样无验证码(也许有,只是没有跳出来),更多的是像12306,知乎,哔哩哔哩那样上了变态的验证码的。有时候为了自动识别验证码耗费的精力之大难以想象,所以我们写爬虫时,要综合考量投入产出比,人工输入验证码可能是更快捷便利的方法。

今天,我们就介绍一款专门从浏览器缓存的cookies获取cookies的工具,一个Python的模块:browsercookie。

它是一个很有用的爬虫工具,通过加载你浏览器的cookies到一个cookiejar对象里面,让你轻松下载需要登录的网页内容。

browsercookie 的安装

它的源代码在bitbucket上: browsercookie

可以从源码安装,或者直接pip安装

pip install browsercookie

需要注意的是,在Windows系统下,内置的sqlite模块在加载FireFox数据库时会抛出错误。需要更新sqlite的版本:

pip install pysqlite

browsercookie 的使用


我们拿百度的首页来做实验,如果没有登录cookies,打开的首页右上角菜单栏显示登录而不显示用户名,如果有登录cookies,首页则显示用户名而不显示登录,通过在得到的html中搜索“登录”来验证这两者的不同准备工作就是,要先打开浏览器(比如Chrome, 或Firefox)登录一下百度,然后就可以关掉浏览器了,当然开着也无所谓。

首先,我们看看未登录状态下得到的标题:

In [1]: import requestsIn [2]: url = 'https://baidu.com/'In [3]: r1 = requests.get(url)In [4]: r1.content.decode('utf-8').find('登录')Out[4]: 1580In [5]: r1.content.decode('utf8').find('user-name')Out[5]: -1

由上面的实验我们看出来,没有cookies请求得到登录的信息,‘user-name’是显示登录名时的css的class,通过查找user-name再次确认没有登录。

然后,在看看从浏览器获得cookies后得到的标题:

In [11]: cjff = browsercookie.firefox()In [12]: header = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'}In [13]: r2 = requests.get(url, cookies=cjff, headers=header)In [14]: r2.content.decode('utf8').find('登录')Out[14]: -1In [15]: r2.content.decode('utf8').find('user-name')Out[15]: 5038

通过上面的代码,我们验证了从browsercookie获取cookies并成功登录的百度。

细心的小猿们可能已经发现了,我用的cookies是从Firefox那里得来的

<code>cjff = browsercookie.firefox()</code>。

原因是,我先实验从Chrome那里获取cookies,得到的cookies里面确实也包含百度,但是就是不能登录,于是改用Firefox就轻松登录了。


browsercookie 的缺憾

前面我们也提到了从Chrome获得的cookies不能登录百度的问题,后来我又实验了几个不同的网站,有的可以也有不可以的,再次证明了这个模块的不完美。

不过,这个库用起来很简单,几行代码就可以验证它对我们要登录的网站是否起作用,所以,写爬虫遇到登录的问题不妨先拿它验证一下,万一行呢,不就省了很多精力。

还有一类问题,就是你得到了cookies,访问任何该网站的URL,它都先返回一段登录验证的html,里面通过JS重定向到不同的网址,你需要进一步解析这段JS代码才能访问到你真正想访问的目标网址,这样的操作就比较累人,这样的网站对爬虫很不友好。别猜了,我说的就是微博。

<html> <head> <title>新浪通行证</title> <meta http-equiv='refresh' content='0; url='https://login.sina.com.cn/crossdomain2.php?action=login&entry=miniblog&r=https%3A%2F%2Fpassport.weibo.com%2Fwbsso%2Flogin%3Fssosavestate%3D1574046135%26url%3Dhttps%253A%252F%252Fweibo.com%252Fkaifulee%26display%3D0%26ticket%3DST-MTM3MTQ1MzA0MA%3D%3D-1542510135-gz-E235393C87F25EE4E30B221C2B5F7F37-1%26retcode%3D0&login_time=1542509978&sign=d531a8b4eed9c403''/> <meta http-equiv='Content-Type' content='text/html; charset=GBK' /> </head> <body bgcolor='#ffffff' text='#000000' link='#0000cc' vlink='#551a8b' alink='#ff0000'> <script type='text/javascript' language='javascript'> location.replace('https://login.sina.com.cn/crossdomain2.php?action=login&entry=miniblog&r=https%3A%2F%2Fpassport.weibo.com%2Fwbsso%2Flogin%3Fssosavestate%3D1574046135%26url%3Dhttps%253A%252F%252Fweibo.com%252Fkaifulee%26display%3D0%26ticket%3DST-MTM3MTQ1MzA0MA%3D%3D-1542510135-gz-E235393C87F25EE4E30B221C2B5F7F37-1%26retcode%3D0&login_time=1542509978&sign=d531a8b4eed9c403'); </script> </body> </html>

这种异步加载的网页越来越多,尤其是前端框架ReactJS, VueJS等框架的出现让前后端分离,由浏览器运行JavaScript来渲染前端。这个时候,就需要我们的爬虫支持JavaScript的运行,此时此刻,requests等单纯的HTTP协议库已经无能为力了,我们需要更强大的工具

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
教你如何查看各种浏览器的Cookies
小白学 Python 爬虫(10):Session 和 Cookies
用python selenium 自动化操作浏览器
python爬虫实践之网页抓取 | IT瘾
Python爬虫(学习准备)
Python异常UnicodeEncodeError: ''gbk'' codec can''t encode character ''
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服