gpt4 book ai didi

javascript - 使用 Requests/BeautifulSoup 抓取网站时绕过脚本响应

转载 作者:行者123 更新时间:2023-12-03 04:56:41 24 4
gpt4 key购买 nike

我正在 www.marriot.com 上搜索有关其酒店和价格的信息。我使用 chrome 检查工具来监控网络流量,以找出 marriot 正在使用的 API 端点。

这是我试图模拟的请求:

http://www.marriott.com/reservation/availabilitySearch.mi?propertyCode=TYSMC&isSearch=true&fromDate=02/23/17&toDate=02/24/17&numberOfRooms=1&numberOfGuests=1&numberOfChildren=0&numberOfAdults=1

用我的Python代码:

import requests
from bs4 import BeautifulSoup

base_uri = 'https://www.marriott.com'
availability_search_ext = '/reservation/availabilitySearch.mi'

rate_params = {
'propertyCode': 'TYSMC',
'isSearch': 'true',
'fromDate': '03/01/17',
'toDate': '03/02/17',
'numberOfRooms': '1',
'numberOfGuests': '1',
'numberOfChildren': '0',
'numberOfAdults': '1'
}

def get_rates(sess):
first_resp = sess.get(base_uri + availability_search_ext, params=rate_params)
soup = BeautifulSoup(first_resp.content, 'html.parser')
print soup.title

if __name__ == "__main__":
with requests.Session() as sess:
#get_hotels(sess)
get_rates(sess)

但是,我得到这个结果:

<!DOCTYPE doctype html>

<html>
<head><script src="/common/js/marriottCommon.js" type="text/javascript"> </script>
<meta charset="utf-8">
</meta></head>
<body>
<script>
var xhttp = new XMLHttpRequest();
xhttp.addEventListener("load", function(a,b,c){
window.location.reload()
});
xhttp.open('GET', '/reservation/availabilitySearch.mi?istl_enable=true&istl_data', true);
xhttp.send();
</script>
</body>
</html>

他们似乎试图阻止机器人抓取数据,因此他们会发回一个重新加载页面的脚本,发送 XHR 请求,然后点击此端点 http://www.marriott.com/reservation/rateListMenu.mi 来渲染网页。

因此,我尝试通过将 python 代码更改为以下内容来模拟返回的 javascript 的行为:

rate_list_ext = '/reservation/rateListMenu.mi'    
xhr_params = {
'istl_enable': 'true',
'istl_data': ''
}

def get_rates(sess):
first_resp = sess.get(base_uri + availability_search_ext,
params=rate_params)
rate_xhr_resp = sess.get(base_uri + availability_search_ext,
params=xhr_params)
rate_list_resp = sess.get(base_uri + rate_list_ext)
soup = BeautifulSoup(rate_list_resp.content, 'html.parser')

我使用所有参数发出初始 get 请求,然后发出脚本正在发出的 xhr 请求,然后向rateListMenu.mi 端点发出请求以尝试获取最终的 html 页面,但我得到 session 超时响应。

我什至与请求库进行了持久 session ,以存储网站在阅读后返回的任何 cookie:Different web site response with RoboBrowser

我做错了什么?

最佳答案

当 JavaScript 发出 get 请求时,它会包含 header 。如果您包含大量此类 header ,您的请求应该会获得类似的返回值。

示例:

headers = {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.100 Safari/537.36"}

sess.get(base_uri + availability_search_ext, params=rate_params, headers=headers)

关于javascript - 使用 Requests/BeautifulSoup 抓取网站时绕过脚本响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42406115/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com