温馨提示: 豌豆仅提供国内节点,不提供境外节点,不能用于任何非法用途,不能访问境外网站及跨境联网。

批量获取IP

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

发布时间:

问题引入

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

思路介绍

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

链家的模拟登录_01清除浏览器缓存和Cookie.png
链家的模拟登录_02禁用跳转后清除日志.png

首先简要介绍一下模拟登录网站的基本逻辑,模拟网站登录需要知道,要向什么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.png
链家的模拟登录_04打开gz.lianjia.com.png

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

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

链家的模拟登录_05登录postdata.png

分析所提交的数据(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?

链家的模拟登录_06lt值.png

分析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.png
链家的模拟登录_08JSESSIONID.png

而对于模拟登录网站中,所涉及的其他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.png
链家的模拟登录_10登录成功Cookie.png
链家的模拟登录_11lianjia_token.png

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

Telegram Group:

https://t.me/sspadluo

数据分析

转载请注明:转载自微信公众号「数据分析」


相关文章


Python爬虫实战之爬取链家广州房价_02把小爬虫变大 如何深入 Python 虚拟机追查 HTTP 服务 core dump 导致 502 问题 Python-爬取知乎某个问题下的所有回答 python3.x 购买12306火车票 Python采集微博热评进行情感分析祝你狗年脱单 3行Python代码完成人脸识别 零基础如何学习python爬虫 Kaggle泰坦尼克生存预测之随机森林学习

上一篇:Python爬虫实战之爬取链家广州房价_03存储
下一篇:用Python分析李小璐微博

咨询·合作