我创建了一个脚本,通过随后发送两个https请求从目标页面获取html元素。我的脚本可以完美地完成任务。但是,我必须复制chrome开发工具中的四个值以填写payload
中的四个键,以便发送最终的http请求以到达目标页面。这是[starting link,以下是有关如何到达目标页面的说明。
Find Hotel
按钮(如果默认情况下chek-out
日期至少比check-in
日期长一天,则无需更改日期。Book Now
按钮。现在,它应该会自动将您引导到目标页面。Enter Guest Details
的目标页面时,从那里解析html元素我已经尝试过(使用一个):
import requests
from bs4 import BeautifulSoup
url = 'https://booking.discoverqatar.qa/SearchHandler.aspx?'
second_url = 'https://booking.discoverqatar.qa/PassengerDetails.aspx?'
params = {
'Module':'H','txtCity':'','hdnCity':'2947','txtHotel':'','hdnHotel':'',
'fromDate':'30/10/2019','toDate':'31/10/2019','selZone':'','minSelPrice':'',
'maxSelPrice':'','roomConfiguration':'2|0|','noOfRooms':'1',
'hotelStandardArray':'63,60,54,50,52,51','CallFrom':'','DllNationality':'-1',
'HdnNoOfRooms':'-1','SourceXid':'MTEzNzg=','mdx':''
}
payload = {
'CallFrom':'MToxNjozOCBQTXxCMkN8MToxNjozOCBQTQ==',
'Btype':'MToxNjozOCBQTXxBfDE6MTY6MzggUE0=',
'PaxConfig':'MToxNjozOCBQTXwyfDB8MnwwfHwxOjE2OjM4IFBN',
'usid':'MToxNjozOCBQTXxoZW54dmkzcWVnc3J3cXpld2lsa2ZwMm18MToxNjozOCBQTQ=='
}
with requests.Session() as s:
r = s.get(url,params=params,headers={"User-agent":"Mozilla/5.0"})
res = s.get(second_url,params=payload,headers={
"User-agent":"Mozilla/5.0",
"Referer":r.url
})
soup = BeautifulSoup(res.text,'lxml')
print(soup)
在上面的脚本中,我从开发工具中复制并粘贴了CallFrom
,Btype
,PaxConfig
和usid
的值,以便在payload
中使用。
如何填写有效载荷内自动使用的值?
发送到第二个请求的参数是Base64编码的,在解码后它们是:
'CallFrom':'1:16:38 PM|B2C|1:16:38 PM',
'Btype':'1:16:38 PM|A|1:16:38 PM',
'PaxConfig':'1:16:38 PM|2|0|2|0||1:16:38 PM',
'usid':'1:16:38 PM|henxvi3qegsrwqzewilkfp2m|1:16:38 PM'
乍看之下,您已经注意到它们处于以下形式:
$date|$param|$date
$date
是当前时间,格式为utc_ts_now.strftime("%I:%M:%S %p")
。
对于这四个参数的$param
部分,我想应该将其固定为CallFrom
和Btype
,usid
是session键,您可以在上一个请求中或其他位置轻松找到它在HTML元素中。
[PaxConfig
是访客计数,与您在第一个请求中发送的roomConfiguration
有关。