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