前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >应用Selenium实现知乎模拟登录

应用Selenium实现知乎模拟登录

作者头像
luanhz
发布2020-03-31 17:07:32
1.8K0
发布2020-03-31 17:07:32
举报
文章被收录于专栏:小数志小数志

【0】序:应用Python爬虫都会遇到一个问题,那就是有些平台的数据是需要登录后方可进行抓取,而登录的Post过程又往往涉及复杂的form data问题,有些是经过稍加分析便可以破解获取,有些则不是常人可及。应用Selenium实现模拟登录或许是针对这个问题的一种有效方法。

【1】基本知识

1.1关于Selenium。Selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(SeleniumRemote Control)和测试的并行处理(Selenium Grid)。Selenium的核心Selenium Core基于JsUnit,完全由JavaScript编写,因此可以用于任何支持JavaScript的浏览器上。selenium可以模拟真实浏览器,自动化测试工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问题。【摘自百科】

以上说的比较术语话,简言之selenium就是可以模拟对浏览器操作的一套工具,包括访问网页(get)、定位网页元素(find_element)、模拟鼠标点击(click)、模拟键盘输入(send_keys)以及获取网页源码(page_source)、文本(text)和元素(get_attribute)等等。支持大部分主流浏览器,包括Chrome、Firefox和IE等等,主要经历了3个大的版本,目前版本号是selenium(3.141.0)。

1.2关于爬虫登录知乎。模拟登录知乎应该是相对较为简单的过程,常常是各大教程讲解模拟登录的案例,当然最终目的一般都不会仅仅是模拟登录,而是要登录后获取平台的数据。所以借助登录的过程获取保存cookie信息,用于用于后续爬取平台(这里cookie可以理解成门票,登录的过程就是买票的过程,拿到票后就可以在平台内任意“遨游”)。获取cookie的过程有多种,主要有三:一是手动登录后通过F12开发者工具复制保存到本地;二是利用Post方法提供form data实现登录,并构建一个自带cookie的定制版opener;三是应用selenium实现模拟登录,尔后保存cookie,应用于后续的request中。

其中,第一种方法最为简单,F12后复制cookie简单进行格式变换(字符串变换为字典)后即可,测试可用。

第二种方法最具有爬虫味道也更为纯粹,从post到get全套自动化,但难点是如何分析form data。这个form data最早还比较简单,后来逐渐复杂:最初是一个form data,只有4个参数(用户名,密码,时间戳以及_xsrf);后来登录post数据变成了RequestPayload,数据个数明显增多;到现在仍然是Form Data,只不过变成了加密的一长串字符,对于我等小白简直崩溃。

知乎登录曾用Payload格式(借用图)

知乎登录最新Form Data格式

鉴于此,还是第三种模拟登录获取cookie的方法相对直观。然而,应用Selenium实现模拟登录也经历了两个阶段,一是可以直接selenium驱动浏览器打开网页,获取cookie,但这种方法对于知乎来说俨然已经成为过去式了,它会甄别出是人为操作还是selenium模拟操作,若判定是模拟操作,则不予登录。

一个简单的解决办法是依托已打开浏览器实现模拟登录,这样知乎平台就不会判定是selenium模拟操作,进而可以实现登录并保存cookie。

当然,可以想象的是半自动的模拟登录折中解决方案绝非长久之计,因为同样流程登录淘宝就依然不行。

Ps:以上是经过不完全搜索网络资源后总结的结果,不保证全面性和准确性。

【2】实现目标及思路

虽然手动登录复制cookie的方式简单有效,但本文是想试验selenium模拟登录,所以整体思路是:

  • CMD命令打开浏览器远程接口
  • Selenium接管本地已打开浏览器,实现绕过平台检测
  • 登录知乎,获取cookie
  • 将selenium得到的列表格式系列cookie变换为request所用的字典格式cookie
  • 带cookie参数的request访问知乎平台目标网页,抓取数据

这里,需注意selenium得到cookie与request所用cookie完全不同,而且不能互相变换,但所幸的是可以由selenium变为request格式cookie。

Selenium保存的cookie格式是一个元组,元组种每个元素是一个字典

代码语言:javascript
复制
1({'domain': 'www.zhihu.com', 'expiry': 1548513010.239976, 'httpOnly': False, 'name': '', 'path': '/', 'secure': False, 'value': '73af20938a97f63d9b695ad561c4c10c'}, 
2{'domain': '.zhihu.com', 'expiry': 1643120121.442839, 'httpOnly': False, 'name': 'q_c1', 'path': '/', 'secure': False, 'value': '73c53fd183ed41e896762bf71a7582de|1548512121000|1548512121000'}, 
3{'domain': '.zhihu.com', 'expiry': 1564064119.947819, 'httpOnly': True, 'name': 'z_c0', 'path': '/', 'secure': False, 'value': '"2|1:0|10:1548512119|4:z_c0|92:Mi4xLVEwOURRQUFBQUFBOENMQWxyVGlEaVlBQUFCZ0FsVk5kN2s1WFFBc19ObFJTdVNkTmYzVS03RFVkRTY3Nzk2Y2VB|6d5b94332bb5c6ef09762050848261a0a68f90622f9e0563b1a709473ba10b34"'}, 
4{'domain': '.zhihu.com', 'expiry': 1611584110.240158, 'httpOnly': False, 'name': '_zap', 'path': '/', 'secure': False, 'value': '40eed39e-6a15-462d-a567-7f6c3920a917'},
5{'domain': '.zhihu.com', 'expiry': 1643120112.21106, 'httpOnly': False, 'name': 'd_c0', 'path': '/', 'secure': False, 'value': '"AKAj1Ja04g6PTgnGWTtdZDmbYnjjoR9g3AA=|1548512112"'}, 
6{'domain': '.zhihu.com', 'httpOnly': False, 'name': '_xsrf', 'path': '/', 'secure': False, 'value': 'e1b41180-7ee9-4c52-94cf-e0a725865e87'}, 
7{'domain': '.zhihu.com', 'expiry': 1551104112.300524, 'httpOnly': True, 'name': 'capsion_ticket', 'path': '/', 'secure': False, 'value': '"2|1:0|10:1548512112|14:capsion_ticket|44:OGRiMWQxYTVjODVhNDc2N2I2MGJmZWQ4NWY0ZDBiYTc=|5c2954f0cea65fb38cb4e4f6576aeeeef59da762d76e6d459c1fb4ff4851b832"'}, 
8{'domain': '.zhihu.com', 'expiry': 1551104121, 'httpOnly': False, 'name': 'tst', 'path': '/', 'secure': False, 'value': 'r'})

而request的cookie格式就是一个字典

代码语言:javascript
复制
1{'': '73af20938a97f63d9b695ad561c4c10c', 
2'q_c1': '73c53fd183ed41e896762bf71a7582de|1548512121000|1548512121000',
3 'z_c0': '"2|1:0|10:1548512119|4:z_c0|92:Mi4xLVEwOURRQUFBQUFBOENMQWxyVGlEaVlBQUFCZ0FsVk5kN2s1WFFBc19ObFJTdVNkTmYzVS03RFVkRTY3Nzk2Y2VB|6d5b94332bb5c6ef09762050848261a0a68f90622f9e0563b1a709473ba10b34"', 
4'_zap': '40eed39e-6a15-462d-a567-7f6c3920a917', 
5'd_c0': '"AKAj1Ja04g6PTgnGWTtdZDmbYnjjoR9g3AA=|1548512112"', 
6'_xsrf': 'e1b41180-7ee9-4c52-94cf-e0a725865e87', 
7'capsion_ticket': '"2|1:0|10:1548512112|14:capsion_ticket|44:OGRiMWQxYTVjODVhNDc2N2I2MGJmZWQ4NWY0ZDBiYTc=|5c2954f0cea65fb38cb4e4f6576aeeeef59da762d76e6d459c1fb4ff4851b832"',
8 'tst': 'r'}

变换方法:

代码语言:javascript
复制
1for Sel_cookie in Sel_cookies:
2      Req_cookie[Sel_cookie['name']]= Sel_cookie['value']

后续,应用request携带该cookie就可以任意遨游知乎平台了。

最后,附一张2019年1月26日晚知乎热点TOP50抓取结果。

【3】后续

  • 尝试分析form data,实现post方式登录并获取cookie
  • 利用Scrapy框架实现全网爬取
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小数志 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CLI 工具
云开发 CLI 工具(Cloudbase CLI Devtools,CCLID)是云开发官方指定的 CLI 工具,可以帮助开发者快速构建 Serverless 应用。CLI 工具提供能力包括文件储存的管理、云函数的部署、模板项目的创建、HTTP Service、静态网站托管等,您可以专注于编码,无需在平台中切换各类配置。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档