我是Python新手,我正在使用Python的seleniumbase库抓取一个网站,我需要间歇性地运行这个获取脚本,但我意识到当响应时间超过大约950毫秒时,它会抛出脚本超时错误,但我可以看到浏览器网络选项卡中的获取响应。如果响应延迟时间低于 950 毫秒,此代码可以正常工作。
script = """
return new Promise((resolve, reject) => {
var csrf = document.querySelector('meta[name="csrf-token"]').content;
var obj;
fetch("MyUrl", {
'headers': {
'accept': '/',
'accept-language': 'en-US,en;q=0.9',
'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'same-origin',
'x-csrf-token': csrf,
'x-requested-with': 'XMLHttpRequest'
},
'referrer': 'MyUrl',
'referrerPolicy': 'strict-origin-when-cross-origin',
'body': 'consularid=3&exitid=1&servicetypeid=1&calendarType=2&totalperson=1',
'method': 'POST',
'mode': 'cors',
'credentials': 'include'
})
.then(res => res.text())
.then(data => {
obj = data;
resolve(obj);
})
.catch(error => {
reject(error);
});
});
"""
obj_variable = sb.execute_script(script)
这是错误的一个例子:
Message: script timeout
(Session info: chrome=116.0.5845.141)
Stacktrace:
GetHandleVerifier [0x00007FF61E0352A2+57122]
(No symbol) [0x00007FF61DFAEA92]
(No symbol) [0x00007FF61DE7E25D]
(No symbol) [0x00007FF61DEEF314]
(No symbol) [0x00007FF61DED6FDA]
(No symbol) [0x00007FF61DEEEB82]
(No symbol) [0x00007FF61DED6DB3]
(No symbol) [0x00007FF61DEAD2B1]
(No symbol) [0x00007FF61DEAE494]
GetHandleVerifier [0x00007FF61E2DEF82+2849794]
GetHandleVerifier [0x00007FF61E331D24+3189156]
GetHandleVerifier [0x00007FF61E32ACAF+3160367]
GetHandleVerifier [0x00007FF61E0C6D06+653702]
(No symbol) [0x00007FF61DFBA208]
(No symbol) [0x00007FF61DFB62C4]
(No symbol) [0x00007FF61DFB63F6]
(No symbol) [0x00007FF61DFA67A3]
BaseThreadInitThunk [0x00007FFAFEF07614+20]
RtlUserThreadStart [0x00007FFB007C26B1+33]
我尝试在脚本代码中添加超时,但它不起作用,也许我没有做得正确
运行 inisde selenium 脚本时,您似乎遇到了脚本超时问题。
您说过您尝试在脚本中添加超时,但效果不佳。
此问题的一个可能的解决方案是您可以直接在 Selenium 脚本的上下文中设置超时。您可以使用javascript本身的
setTimeout
函数。
您还可以利用
execute_async_script
不等待脚本执行,也不会出现超时错误。
代码的修改版本:
script = """
return new Promise((resolve, reject) => {
var csrf = document.querySelector('meta[name="csrf-token"]').content;
var obj;
// Set a timeout of 30 seconds (change the value as needed)
var timeout = 30000;
var fetchAndResolve = () => {
fetch("MyUrl", {
'headers': {
'accept': '/',
'accept-language': 'en-US,en;q=0.9',
'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'same-origin',
'x-csrf-token': csrf,
'x-requested-with': 'XMLHttpRequest'
},
'referrer': 'MyUrl',
'referrerPolicy': 'strict-origin-when-cross-origin',
'body': 'consularid=3&exitid=1&servicetypeid=1&calendarType=2&totalperson=1',
'method': 'POST',
'mode': 'cors',
'credentials': 'include'
})
.then(res => res.text())
.then(data => {
obj = data;
resolve(obj);
})
.catch(error => {
reject(error);
});
};
setTimeout(() => {
reject(new Error("Script execution timed out"));
}, timeout);
fetchAndResolve();
});
"""
obj_variable = sb.execute_async_script(script)
希望这有帮助。