上一节,我们使用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 那里 得来的
cjff = browsercookie.firefox()
。
原因是,我先实验从Chrome那里获取cookies,得到的cookies里面确实也包含百度,但是就是不能登录,于是改用Firefox就轻松登录了。
browsercookie 的缺憾
前面我们也提到了从Chrome获得的cookies不能登录百度的问题,后来我又实验了几个不同的网站,有的可以也有不可以的,再次证明了这个模块的不完美。
不过,这个库用起来很简单,几行代码就可以验证它对我们要登录的网站是否起作用,所以,写爬虫遇到登录的问题不妨先拿它验证一下,万一行呢,不就省了很多精力。
还有一类问题,就是你得到了cookies,访问任何该网站的URL,它都先返回一段登录验证的html,里面通过JS重定向到不同的网址,你需要进一步解析这段JS代码才能访问到你真正想访问的目标网址,这样的操作就比较累人,这样的网站对爬虫很不友好。别猜了,我说的就是微博。
新浪通行证
这种异步加载的网页越来越多,尤其是前端框架ReactJS, VueJS等框架的出现让前后端分离,由浏览器运行JavaScript来渲染前端。这个时候,就需要我们的爬虫支持JavaScript的运行,此时此刻,requests等单纯的HTTP协议库已经无能为力了,我们需要更强大的工具
相关文章
本站已关闭游客评论,请登录或者注册后再评论吧~