【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模拟登录,所以整体思路是:
这里,需注意selenium得到cookie与request所用cookie完全不同,而且不能互相变换,但所幸的是可以由selenium变为request格式cookie。
Selenium保存的cookie格式是一个元组,元组种每个元素是一个字典
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格式就是一个字典
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'}
变换方法:
1for Sel_cookie in Sel_cookies:
2 Req_cookie[Sel_cookie['name']]= Sel_cookie['value']
后续,应用request携带该cookie就可以任意遨游知乎平台了。
最后,附一张2019年1月26日晚知乎热点TOP50抓取结果。
【3】后续