爬虫——破解安居客对手机号的Ajax加密请求


上一篇文章里小谈了一下selenium,其中说对Ajax的加密可以通过开发者工具检查请求参数,发送请求进行处理,现在我们就来说一下这个请求。

目标网站(安居客租房信息):https://hz.zu.anjuke.com/?from=navigation

点进一个详情界面之后,发现安居客对房东的手机号都是加密覆盖的,需要点击才能获取,那好吧,F12进入开发者模式,选中Network进行抓包

在页面上点击获取电话之后,会发现出现了两个文件,选中XHR,然后选中response,就会发现什么?哎,对比页面之后会发现其中不正好有咱们所需要的手机号吗?

既然如此,那咱们看看怎么获取这个东西吧

选中这个文件,右键,Copy,Copy link address。将这个地址复制下来,在浏览器的导航栏中输入,就会发现获取了刚才的response里的信息。也就是说我们去拼接这个请求就可以获取电话号码了

那就分析这个地址吧,以&这个为断点,多复制几个地址,分析这几个不同的地址,去掉相同的参数,就会得到红框里的内容,这就是我们获取电话的重要参数

接下来就是获取这三个参数了。

怎么获取?这三个参数实际上是存在于源码中的,我们在源码中通过正则匹配出这三个参数就可以了

接下来,上源码:

import re
import requests
from lxml import etree

# 定制请求头,必须保存cookie信息,否则无法获取手机号
headers = {
    'cookie': 'sessid=F3C5048F-5EFC-7DC2-D706-171B3F342202; aQQ_ajkguid=E6473576-0CFA-547A-EF66-9729C7E5C2C4; lps=http%3A%2F%2Fwww.anjuke.com%2F%7Chttps%3A%2F%2Fwww.sogou.com%2Flink%3Furl%3DDSOYnZeCC_q7j7wj5mgOqD1S3J7oRWO3; ctid=18; twe=2; __xsptplusUT_8=1; 58tj_uuid=eba8ad5e-f054-41aa-b36a-c28a5c2a062e; init_refer=https%253A%252F%252Fwww.sogou.com%252Flink%253Furl%253DDSOYnZeCC_q7j7wj5mgOqD1S3J7oRWO3; new_uv=1; als=0; new_session=0; wmda_uuid=4007ce9d02b60083c9b2c096f2e5dc8a; wmda_new_uuid=1; wmda_session_id_6289197098934=1545017039830-dffe50e6-70d0-7706; wmda_visited_projects=%3B6289197098934; __xsptplus8=8.1.1545017036.1545017044.3%233%7Cwww.sogou.com%7C%7C%7C%7C%23%23k4--hgzAYsNToYCPD0_3M1ppGohhWYm5%23',
    'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'
}

# 随便获取一个详情界面的链接吧
j = "https://hz.zu.anjuke.com/fangyuan/1250568402?from=Filter_9&hfilter=filterlist"

# 获取网页源码
xq_link = requests.get(j, headers=headers)
xq_html = etree.HTML(xq_link.text, etree.HTMLParser())

# 利用正则获取参数
# 匹配出参数所在的代码
phone_data1 = xq_html.xpath('/html/body/div[3]/script[9]/text()')
# 第一个参数
regexp = r"broker_id:\'(.*?)\',"
res1 = re.findall(regexp, phone_data1[0])
req1 = res1[0]
# print(req1[0])
# 第二个参数
regexp = r"token: \'(.*?)\',"
res2 = re.findall(regexp, phone_data1[0])
req2 = res2[0]
# print(req2[0])
# 第三个参数,发现这个参数是房屋编号,便使用xpath提取出来吧
phone_data3 = xq_html.xpath('//*[@id="houseCode"]/text()')
regexp = r':(.*?),'
res3 = re.findall(regexp, phone_data3[0])
req3 = res3[0]
# print(req3)

# 拼凑获取手机号的url
url = "https://hz.zu.anjuke.com/v3/ajax/getBrokerPhone/?broker_id={}&token={}&prop_id={}"
# 将刚才的参数填到url中
phone_url = url.format(req1, req2, req3)
# 获取手机号
data1 = requests.get(phone_url, headers=headers)
# print(data1.text)
# 手机号码的正则匹配公式
regexp = r'"val":"(.*?)"}'
# 正则匹配
res = re.findall(regexp, data1.text)
phone = res[0]
print(phone)

 

到这里,我们就已经得到了我们想要的结果,也算是破解了对Ajax的加密

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM