开始链家爬虫的时候,了解到需要实现模拟登录,不登录不能爬取三个月之内的数据,目前暂未验证这个说法是否正确,这一小节记录一下利用浏览器(IE11)的开发者工具去分析模拟登录网站(链家)的内部逻辑过程,花了一个周末的时间,部分问题暂未解决。
利用浏览器(IE11)的开发者工具,启用网络流量捕获,在调试之前,先做一些配置上的准备工作:清除旧的cookie和缓存,禁用跳转后清除日志(Firefox在开发工具的Settings设置中勾上启用持续日志)。
首先简要介绍一下模拟登录网站的基本逻辑,模拟网站登录需要知道,要向什么url地址,发送什么样的数据,GET请求还是POST请求。GET请求从服务器请求数据,不需要post data,但是经常需要在url后面加上对应的query parameter,类似?para1=value1¶2=value2之类的形式,本质上有点类似于post data。POST请求需要提供对应的post data,对应工具中的Request Body。而剩下的,是设置发送请求时的相关参数,包括user-agent等,对应工具中的Request Headers。提交请求后,网站服务器返回Response Headers和Response Body。其中,还经常涉及到cookie信息,在发送前,准备好,发送给服务器,服务器返回的信息中,往往也包含更新后的cookie值。
总结一下,主要关注点:Request Headers、Request Body、Response Headers、Response Body、Cookie。
打开IE11后,调出工具,切换到网络界面,打开链家,过滤HTML请求,可以看到,页面跳转到http://gz.lianjia.com/,服务器返回的Response Headers里面设置了一些cookie,如lianjia_ssid
和lianjia_uuid
。
点击登录,然后输入用户名和密码,正常登录。
找到登录网站所涉及的最核心的地址,对于此,我们可以通过搜索在哪里发送了我们的密码。可以看到,和我们密码相关的url地址为https://passport.lianjia.com/cas/login。即以后如果写代码,所要访问的url地址,就是这个地址了。
分析所提交的数据(post data)中的参数和值,这就是模拟网站登录的核心数据了,是在写代码时,对于url=https://passport.lianjia.com/cas/login提交POST请求时,要发送的一些参数和值。
username=XXXXXXXXXXX
password=XXXXXXXXXX
verifycode=
service=http%3A%2F%2Fgz.lianjia.com%2F
isajax=true
code=
lt=LT-99999-9HQFRxGdmePMdsCSnTeH9h2ne26uQbnWqN2
接下来,分析这些值是如何来的。例如lt值,搜索LT-99999,发现来自https://passport.lianjia.com/cas/prelogin/loginTicket?
分析Cookie,在最核心的地址https://passport.lianjia.com/cas/login的Request Headers中,lianjia_ssid
、lianjia_uuid
和JSESSIONID
,其中lianjia_ssid
、lianjia_uuid
通过先访问其他页面获取,现在接着去找名为JSESSIONID
的Cookie,是从哪里来的,所以,能想到的,就是先去搜索JSESSIONID
,搜索出来的第一个url地址是https://passport.lianjia.com/cas/prelogin/loginTicket?。很明显,其就是我们所期望的,因为其中的JSESSIONID
是通过Set-Cookie所获得的,是访问服务器的某个地址https://passport.lianjia.com/cas/prelogin/loginTicket?,然后服务器所返回的Cookie值。
而对于模拟登录网站中,所涉及的其他Cookie、其他参数的值,可参考上述的逻辑,去一点点分析,找到最终的某个值的来源,然后才能用程序模拟。
至此,对于想要模拟登录链家的内部逻辑过程,基本上清楚了。
顺序 | 访问地址 | 访问类型 | 发送的数据 | 需要获得/提取的返回的值 |
---|---|---|---|---|
1 | http://gz.lianjia.com/ | GET | 无 | lianjia_ssid, lianjia_uuid |
2 | https://passport.lianjia.com/cas/prelogin/loginTicket? | GET | 无 | 从返回的html中提取lt值,需要验证返回的Cookie中,是否包含JSESSIONID |
3 | https://passport.lianjia.com/cas/login | POST | post data,其中lt值是之前提取出来的 | 验证返回的html和Cookie |
在通过Python实现的时候,利用如上的流程,发现实际上行不通,登录失败。这里提出几个未解决的问题。
如何验证模拟登录网站已成功了呢?
按理,在通过最后一步访问地址为https://passport.lianjia.com/cas/login时,带上账号、密码、提取的lt值,已获取JSESSIONID值的情况下,通过返回的html代码或cookie值,是可以判断模拟登录网站已成功的,然而在进一步分析数据来源的时候,发现有一个lianjia_token
在登录后的页面经常出现,不知在模拟登录过程中是否需要用到?是否需要获取到lianjia_token
才算成功?也不知是如何得到的?和JS脚本是否有关系?
微信公众号「数据分析」,分享数据科学家的自我修养,既然遇见,不如一起成长。