您的位置 首页 php

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 requests
In [2]: url = '
In [3]: r1 = requests.get(url)
In [4]: r1.content. decode ('utf-8').find('登录')
Out[4]: 1580
In [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]: -1
In [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='"/>
 <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("");
 </script>
 </body>
 </html>
 

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

文章来源:智云一二三科技

文章标题:python学习: 使用browsercookie从浏览器获取cookies

文章地址:https://www.zhihuclub.com/78530.shtml

关于作者: 智云科技

热门文章

评论已关闭

1条评论

网站地图