上一篇文章里小谈了一下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的加密