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

完备用Python实现仿照登录的过程实在是很累的,磨练的是耐力、不雅观察力、遐想能力等等。
虽然累,但一旦完成后面就省心了,也算是值得一试。

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

php获取urlcookiespython进修 应用browsercookie从阅读器获取cookies Bootstrap

本日,我们就先容一款专门从浏览器缓存的cookies获取cookies的工具,一个Python的模块:browsercookie。

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

browsercookie 的安装

它的源代码在bitbucket上: browsercookie

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

pip install browsercookie

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

pip install pysqlitebrowsercookie 的利用

我们拿百度的首页来做实验,如果没有登录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协议库已经无能为力了,我们须要更强大的工具