网站首页 > 技术文章 正文
上一节,我们使用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 = 'https://baidu.com/' 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='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协议库已经无能为力了,我们需要更强大的工具
猜你喜欢
- 2024-09-27 urllib用账号密码登陆,携带cookie访问链接
- 2024-09-27 简单说说爬虫这个神奇的工具(简单说说爬虫这个神奇的工具怎么写)
- 2024-09-27 python接口自动化(十三)--cookie绕过验证码登录(详解)
- 2024-09-27 一键生成 QQ 历史报告,谁最在意你?
- 2024-09-27 Python爬虫Resquests库的使用(python爬虫re库如何换行)
- 2024-09-27 开源:仿网易云音乐Android客户端(安卓开发仿网易云)
- 2024-09-27 你要偷偷的学Python,然后惊呆所有人(第十一天)
- 2024-09-27 package-lock.json的作用?(packagelockjson是做什么用的)
- 2024-09-27 Python保存Cookie到TXT文件(python的cookies)
- 2024-09-27 python爬虫实战之Headers信息校验-Cookie
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (87)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)