您當前的位置:首頁 > 攝影

動態請求-逆向篇(2)

作者:由 大大的迷彩宇宙 發表于 攝影時間:2019-03-18

上一篇逆向非常簡單,目標資料直接在js檔案裡面就能獲取,我們直接稍作處理就能解決。本篇循序漸進,目標請求資料都不在明顯可觀察的位置,需要我們往裡尋找。

本文的目標來獲取攜程所有城市的熱門酒店,

【攜程酒店】酒店預訂,酒店價格查詢,賓館住宿推薦,網上訂酒店

動態請求-逆向篇(2)

動態請求-逆向篇(2)

動態請求-逆向篇(2)

在js一欄裡面逐個嘗試尋找,我這裡用success關鍵詞,因為ajax一般都會有個成功的回撥,果不其然,很快找到base-bmap。js裡面getList的一個函式,估計就是用來載入列表的請求,

動態請求-逆向篇(2)

右鍵該js檔案在原始碼中開啟此檔案

動態請求-逆向篇(2)

原始碼是堆在一起的程式碼,點選左下角花括號的按鈕可以格式化

動態請求-逆向篇(2)

然後在關鍵的位置打個斷點,打完斷點重新整理頁面,發現只攔截到1條記錄

動態請求-逆向篇(2)

右上角可以對斷點進行操作

動態請求-逆向篇(2)

進入next funcion call可以進入下一個相關函式,我們接著就進入到一個叫searchhotel。js的檔案當中,這也是關鍵的一個js,

在searchhotel。js當中,我們發現剛才的思路貌似斷了,還記得一開始那個hot_list那個div嗎,base-bmap。js並沒有相關欄位,因為所有目標值都是要插進這個div的,所有必然有個檔案會做這個操作,搜尋以後果然找到蛛絲馬跡

動態請求-逆向篇(2)

找到上面的關鍵資訊(關鍵資訊包括 請求的url,請求方式,請求引數等),滑鼠懸停可獲取到相關變數值,技巧就是先在想要獲取到的變數後面一句程式碼打個斷點,然後滑鼠懸停在相關變數上就會顯示對應的值,打幾次斷點後就可以獲取到所有想要的引數了

HotelSearch。setCity(param。cityId, param。cityName, param。cityPY, param),

var hotCityParams = {

method: cQuery。AJAX_METHOD_POST,

context: {

city: param。cityId,

cityName: param。cityName,

cityPY: param。cityPY,

type: 0,

cityip: ipcity,

psid: window。ajaxBlurId && ajaxBlurId。PSID || “”

},

$。ajax(addressUrlConfig。hothotel, hotCityParams);

整理下獲取到的引數 用requests來獲取

import requests

import json

from requests。exceptions import RequestException

import re

from pyquery import PyQuery as pq

headers = {

‘User-Agent’: ‘Mozilla/5。0 (Windows NT 6。1; WOW64) AppleWebKit/537。36 (KHTML, like Gecko) Chrome/27。0。1453。94 Safari/537。36’

}

def get_page(url,data={}):

try:

response = requests。post(url,headers=headers,data=data)

if response。status_code == 200:

return response。text

return None

except RequestException as e:

print(‘err: %s’ % e)

def main():

data = {

‘city’: 2,

‘type’: 0,

}

html = get_page(‘https://hotels。ctrip。com/Domestic/Tool/AjaxIndexHotSaleHotelNew。aspx?traceid=803572077966064154’,data=data)

doc = pq(html)

lis = doc(‘ul’)

for item in lis:

title = pq(item)。find(‘。searchresult_name a’)。text()

print(title)

動態請求-逆向篇(2)

這樣的話,切換城市只要修改城市id即可,那我們先來拿到城市列表吧,城市列表的獲取要簡單得多,就在js檔案中直接可以獲取

動態請求-逆向篇(2)

獲取程式碼如下, 慢著,在我測試的時候,出現了這個

動態請求-逆向篇(2)

這個驗證碼滑動完還出現一個點觸式驗證碼,根據以往文章的思路即可解決,這裡就手動解決了,考慮到會出現驗證碼,我們後期最好還是利用代理池,避免過多的驗證碼。

def get_city():

# 如果出現驗證碼,進行驗證

‘’‘

https://seccenter。ctrip。com/seccenter/main。aspx?returnurl=http%3a%2f%2fhotels。ctrip。com%2fdomestic%2fTool%2fAjaxGetCitySuggestion。aspx&bgref=1884911984

’‘’

url = ‘https://hotels。ctrip。com/Domestic/Tool/AjaxGetCitySuggestion。aspx’

html = get_response(url)

html_cut = html[90:]

res = html_cut。replace(‘熱門’,‘“熱門”’)。replace(‘display’,‘“display”’)。replace(‘data’,‘“data”’)。replace(‘group’,‘“group”’)

content = re。sub(‘([A-Z]{2,})’,r‘“\1”’,res)

lis = eval(content)

hot_list = lis[‘熱門’]

for item in hot_list:

arr = item[‘data’]。split(‘|’)

cityId = arr[2]

上面的正則簡單解釋一下,這個json檔案本身是帶混淆的,

動態請求-逆向篇(2)

先要把前面這段先去掉, 去掉以後我們用程式碼格式工具格式化後發現,有個熱門,以及按字母排列的城市列表,為了轉成字典格式,用正則將key替換成帶引號的key

{熱門: [{

display: “北京”,

data: “Beijing|北京|1”,

group: “B”

},

{

display: “上海”,

data: “Shanghai|上海|2”,

group: “S”

},

。。。

ABCD: [{

display: “阿壩”,

data: “Abazhou|阿壩|1838”,

group: “A”

},

{

display: “阿克蘇”,

data: “Aksu|阿克蘇|173”,

group: “A”

},

獲取到城市id,結合上面獲取的熱門酒店,就可以批次獲取到該城市的熱門酒店列表啦!

獲取結果如下

花築·南鑼鼓巷貳拾號酒店(原古巷貳拾號藝術酒店)

桔子酒店·精選(北京亞運村店)

北京崑崙飯店

北京崇文門飯店

北京香格里拉飯店

北京舟客家度假逸墅

北京金融街亞朵S吳酒店

北京華爾道夫酒店

上海三湘大廈

上海南泉大酒店

上海桂梧莊民宿

上海航空酒店

上海徐匯雲睿酒店

上海延安飯店

上海如果遇見你小墅

雲和夜泊酒店(上海國際旅遊度假區野生動物園店)

天津財富豪為酒店

麗楓酒店(天津開發區金融街店)

天津水晶宮飯店

天津友誼賓館

天津東麗湖恆大酒店

如家酒店(天津海河解放南路劉莊橋店)

天津津塔都市印象高階酒店公寓

天津萬家酒店式公寓

泊聯匯公館(重慶解放碑店)

重慶寶柏精品酒店

1314情侶主題酒店(重慶北城天街分店)

重慶融匯麗笙酒店

重慶盈田酒店

重慶華宇溫德姆至尊豪廷大酒店

重慶南濱晚渡公寓酒店

重慶兩江公館服務公寓(解放碑大唐諾亞店)

桔子酒店·精選(大連希望廣場店)

大連玫瑰坊酒店

大連富麗華大酒店

星海灣印記酒店(大連星海公園店)

星海金色陽光酒店式公寓(大連星海廣場店)

和頤酒店(大連西安路店)

Q加·大連海之星酒店式公寓

超極致海景度假酒店(青島黃島膠南那魯灣店)

中航翔通遊艇會酒店(青島奧帆中心五四廣場店)

金海紅宇賓館(青島火車站西廣場店)

青島頤中皇冠假日酒店

青島飯店

雲遊客棧(青島奧帆中心店)(原丿趣海邊度假小院奧帆中心店)

青島25小時海景度假公寓中聯自由港灣棧橋火車站店

西安水晶島酒店

歐傑西假日酒店(西安鐘樓店)

維拉酒店(西安綠地筆克軟體園店)

西安鐘樓麗晶庭院酒店

王子星月精選酒店(西安鐘鼓樓回民街店)

石誠客棧(咸陽機場店)

西安宏府壹號公寓酒店

美豪麗致酒店(西安高新店)

書香世家酒店(南京新街口德基廣場店)(原管家橋店)

港際賓館(南京夫子廟店)

桔子酒店·精選(南京夫子廟店)

南京新街口蘇寧諾富特酒店

南京新紀元大酒店

桔子酒店(南京博物院酒店)(原東華門店)

南京中心大酒店

蘇州市會議中心/蘇州中心大酒店

蘇州東太湖大酒店

蘇州國信雅都大酒店(原雅都大酒店)

蘇州溫德姆花園酒店

蘇州吳宮泛太平洋酒店

蘇州聆湖山居客棧

蘇州青普皇家驛棧

1779·懷德堂(蘇州拙政園平江路店)

杭州赫納酒店

杭州瑞萊克斯大酒店

浙江大酒店

杭州蝶來望湖賓館

浙江梅地亞賓館

曼陀林·雲谷花園客棧(杭州雷峰塔店)

桔子酒店精選(杭州和平會展中心店)

桔子水晶酒店(杭州錢江新城慶菱路地鐵站店)(原慶春東路慶菱路地鐵站店)

廈門金瑞佳泰酒店(原金巴蘭酒店)

久棲·鼓浪嶼海岸花旅館

廈門翔鷺國際大酒店

廈門金後酒店

廈門春光酒店

廈門昆舍設計酒店

廈門非格酒店

廈門宸洲洲際酒店

正熙國際酒店(成都春熙太古裡店)

如家精選酒店(成都寬窄巷子西蜀漢路東地鐵站店)

成都春熙亞朵S同道星座酒店

成都海洋萊普敦酒店

成都榛悅隆堡酒店

桔子酒店精選(成都文殊院店)

優客優享服務公寓(成都九眼橋太古裡店)

深圳中南海怡酒店

深圳新大洲酒店

卡瑞登酒店(深圳北站店)

深圳灣木棉花酒店

麗楓酒店(深圳機場新航站樓店)

城牆根兒客棧(深圳2號店)

深圳星河麗思卡爾頓酒店

鵬城國際公寓(深圳ONE39店)(原千度精品公寓)

廣州順盈禮遇酒店

桔樹國際公寓(廣州珠江新城店)

廣州珠江新城木蓮莊酒店

廣州東方賓館

柏高酒店(廣州天河北水蔭路店)

奇幻城堡親子公寓(廣州萬達廣場店)

廣州瑞爾曼Omen國際公寓

三亞亞龍灣金棕櫚度假酒店

三亞亞龍灣凱萊仙人掌度假酒店

三亞國光豪生度假酒店

三亞亞龍灣華宇度假酒店

三亞灣紅樹林度假世界(木棉酒店)

三亞海邊精品度假公寓

三亞大東海精品海景度假公寓

臺北天豪屋(Tango House)

臺北S酒店(S Hotel)

臺北六福客棧(Leofoo Hotel)

天閣酒店(臺北信義館)(The Tango Hotel Taipei Xinyi)

臺北馥敦飯店-復南館(Taipei Fullerton Hotel South)

臺北慕軒飯店(Madison Taipei Hotel)

臺北香樹花園酒店(S-aura Hotel)

臺北六福萬怡酒店(Courtyard Taipei)

香港皇悅卓越酒店(銅鑼灣店)(Empire Prestige Causeway Bay)

香港百樂賓館酒店(Best Hotel(Hostel))

香港灣仔皇悅酒店(Empire Hotel Hong Kong-Wan Chai)

香港美麗華酒店(The Mira Hong Kong)

香港帝都酒店(Royal Park Hotel)

香港朗廷酒店(The Langham Hong Kong)

香港彌敦酒店(Nathan Hotel)

香港怡東酒店(Excelsior Hotel)

濟南軍悅世源酒店

翰林大酒店(濟南泉盈酒店連鎖千佛山店)

濟南魯能貴和洲際酒店

濟南倪氏海泰大酒店

山東政協大廈維景大酒店

書香世家酒店(濟南高新奧體會展中心店)

濟南天發舜和商務酒店

濟南高新禧悅東方酒店

寧波城市新貴酒店

寧波海俱麗景酒店

寧波開元名都大酒店

柏寧酒店(寧波鄞州萬達店)

寧波凱洲皇冠假日酒店

寧波天一廣場亞朵酒店

寧波康橋小鎮酒店

寧波南苑環球酒店

瀋陽金鑫輝大酒店

瀋陽紫瀾門龍庭大酒店(原龍庭大酒店)

瀋陽凱賓斯基飯店

和頤酒店(瀋陽中街店)

瀋陽皇朝萬鑫酒店

瀋陽星期天假日酒店式公寓

7天連鎖酒店(瀋陽北一馬路萬達廣場店)

紐賓凱楚玉酒店(武漢理工大學店)

武漢匯豪大酒店

武漢世茂希爾頓酒店

武漢恆信美居酒店

優居自助湖景酒店(武漢經開萬達店)

麗楓酒店(武漢理工大學店)

如意居主題公寓(武漢站店)

鄭州逸泉國際酒店

大河國際飯店(鄭州高鐵會展中心店)

鄭州建業艾美酒店

鄭州天鵝城國際飯店

如家精選酒店(鄭州大學路萬達廣場店)

錦江之星品尚(鄭州大學隴海路店)

喜鵲愉家旅館(鄭州紅專路店)(原文化路店)

世紀星連鎖酒店(鄭州紅旗路省人民醫院店)

總結:

儘管最後程式碼量不到100行,可是為了尋找目標的請求介面,我們花了挺多的時間,也就是用更多的時間去換取效率,然而這個方法並不一定是最好的,隨著網站的維護更新,我們的爬取程式碼也要隨著更新,也可能更難獲取了,相對於selenium爬取邏輯來說,需要更多的維護工作量。程式碼參考

wuzhenbin/spider-reverse

標簽: 酒店  大酒店  data  公寓  Hotel