Python爬虫实战之爬取链家广州房价_04链家的模拟登录(记录)

来源:互联网 发布:给淘宝店铺起名字 编辑:程序博客网 时间:2024/06/11 20:05

问题引入

开始链家爬虫的时候,了解到需要实现模拟登录,不登录不能爬取三个月之内的数据,目前暂未验证这个说法是否正确,这一小节记录一下利用浏览器(IE11)的开发者工具去分析模拟登录网站(链家)的内部逻辑过程,花了一个周末的时间,部分问题暂未解决。

思路介绍

利用浏览器(IE11)的开发者工具,启用网络流量捕获,在调试之前,先做一些配置上的准备工作:清除旧的cookie和缓存,禁用跳转后清除日志(Firefox在开发工具的Settings设置中勾上启用持续日志)。

链家的模拟登录_01清除浏览器缓存和Cookie

链家的模拟登录_02禁用跳转后清除日志

首先简要介绍一下模拟登录网站的基本逻辑,模拟网站登录需要知道,要向什么url地址,发送什么样的数据,GET请求还是POST请求。GET请求从服务器请求数据,不需要post data,但是经常需要在url后面加上对应的query parameter,类似?para1=value1&para2=value2之类的形式,本质上有点类似于post data。POST请求需要提供对应的post data,对应工具中的Request Body。而剩下的,是设置发送请求时的相关参数,包括user-agent等,对应工具中的Request Headers。提交请求后,网站服务器返回Response Headers和Response Body。其中,还经常涉及到cookie信息,在发送前,准备好,发送给服务器,服务器返回的信息中,往往也包含更新后的cookie值。

总结一下,主要关注点:Request HeadersRequest BodyResponse HeadersResponse BodyCookie

打开IE11后,调出工具,切换到网络界面,打开链家,过滤HTML请求,可以看到,页面跳转到http://gz.lianjia.com/,服务器返回的Response Headers里面设置了一些cookie,如lianjia_ssidlianjia_uuid

链家的模拟登录_03打开www.lianjia.com

链家的模拟登录_04打开gz.lianjia.com

点击登录,然后输入用户名和密码,正常登录。

找到登录网站所涉及的最核心的地址,对于此,我们可以通过搜索在哪里发送了我们的密码。可以看到,和我们密码相关的url地址为https://passport.lianjia.com/cas/login。即以后如果写代码,所要访问的url地址,就是这个地址了。

链家的模拟登录_05登录postdata

分析所提交的数据(post data)中的参数和值,这就是模拟网站登录的核心数据了,是在写代码时,对于url=https://passport.lianjia.com/cas/login提交POST请求时,要发送的一些参数和值。

username=XXXXXXXXXXXpassword=XXXXXXXXXXverifycode=service=http%3A%2F%2Fgz.lianjia.com%2Fisajax=truecode=lt=LT-99999-9HQFRxGdmePMdsCSnTeH9h2ne26uQbnWqN2

接下来,分析这些值是如何来的。例如lt值,搜索LT-99999,发现来自https://passport.lianjia.com/cas/prelogin/loginTicket?

链家的模拟登录_06lt值

分析Cookie,在最核心的地址https://passport.lianjia.com/cas/login的Request Headers中,lianjia_ssidlianjia_uuidJSESSIONID,其中lianjia_ssidlianjia_uuid通过先访问其他页面获取,现在接着去找名为JSESSIONID的Cookie,是从哪里来的,所以,能想到的,就是先去搜索JSESSIONID,搜索出来的第一个url地址是https://passport.lianjia.com/cas/prelogin/loginTicket?。很明显,其就是我们所期望的,因为其中的JSESSIONID是通过Set-Cookie所获得的,是访问服务器的某个地址https://passport.lianjia.com/cas/prelogin/loginTicket?,然后服务器所返回的Cookie值。

链家的模拟登录_07登录Cookie

链家的模拟登录_08JSESSIONID

而对于模拟登录网站中,所涉及的其他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脚本是否有关系?

链家的模拟登录_09登录成功html

链家的模拟登录_10登录成功Cookie

链家的模拟登录_11lianjia_token

微信公众号「数据分析」,分享数据科学家的自我修养,既然遇见,不如一起成长。

数据分析

0 0
原创粉丝点击