爬蟲——破解安居客對手機號的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