我创建了一个脚本,通过随后发送两个 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':'05/11/2019','toDate':'07/11/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
.How can I fill in the values automatically to be used within 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 关键,您可以在之前的回复中轻松找到它。PaxConfig
是客人数,它与roomConfiguration
有关您发送了第一个请求。要自动执行第二个请求,您将首先为每个参数生成解码值,然后使用
Base64
对它们进行编码。 .更新:
#!/usr/bin/env python3.7
import base64
from datetime import datetime
import requests
def first_request(session, params):
url = 'https://booking.discoverqatar.qa/SearchHandler.aspx'
r = session.get(url, params=params)
return r
def second_request(session, params):
url = 'https://booking.discoverqatar.qa/PassengerDetails.aspx'
r = session.get(url, params=params)
return r
def main():
params1 = {
'Module': 'H',
'txtCity': '',
'hdnCity': '2947',
'txtHotel': '',
'hdnHotel': '',
'fromDate': '05/11/2019',
'toDate': '07/11/2019',
'selZone': '',
'minSelPrice': '',
'maxSelPrice': '',
'roomConfiguration': '2|0|',
'noOfRooms': '1',
'hotelStandardArray': '63,60,54,50,52,51',
'CallFrom': '',
'DllNationality': '-1',
'HdnNoOfRooms': '-1',
'SourceXid': 'MTEzNzg=',
'mdx': ''
}
session = requests.Session()
_ = first_request(session, params1)
asp_session = session.cookies.get("ASP.NET_SessionId")
params2 = {
# Could related to options "Available" / "On Request"
"Btype": "A",
# Try out other guest counts to make sure
"PaxConfig": params1["roomConfiguration"] * 2,
"CallFrom": "B2C",
"usid": asp_session
}
date = datetime.utcnow().strftime("%I:%M:%S %p")
for k, v in params2.items():
v = "|".join([date, v, date])
v = base64.b64encode(bytes(v, "utf-8")).decode("utf-8")
params2[k] = v
r = second_request(session, params2)
print(r.text)
if __name__ == '__main__':
main()
关于python - 无法让我的脚本自动生成几个值以在有效负载中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58612344/