gpt4 book ai didi

python - 为什么 cURL 给出正确的响应而 scrapy 没有?

转载 作者:太空狗 更新时间:2023-10-30 01:01:46 25 4
gpt4 key购买 nike

为什么 cURL 给出了正确的响应而 scrapy 却没有?

我想使用 javascript 抓取的网站填写表单然后发布它并在提供内容之前进行验证。

在从初始 GET 请求中的 javascript 中抓取参数后,我在 python 中复制了这个 js。我的 "TS644333_75" 值匹配 js 值(通过执行 document.write(..) 测试,而不是让它像正常一样提交),如果您将结果复制并粘贴到cURL 也可以。例如:

curl  --http1.0 'http://www.betvictor.com/sports/en/football' -H 'Connection: keep-alive'
-H 'Accept-Encoding: gzip,deflate' -H 'Accept-Language: en'
-H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
-H 'Referer: http://www.betvictor.com/sports/en/football' -H 'User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0'
--data
'TS644333_id=3&
TS644333_75=286800b2a80cd3334cd2895e42e67031%3Ayxxy%3A3N6QfX3q%3A1685704694&
TS644333_md=1&
TS644333_rf=0&
TS644333_ct=0&
TS644333_pd=0' --compressed

从哪里得到TS644333_75 我只是简单地复制并粘贴了我的python代码在模拟js时计算的结果。

在 wireshark 中监控数据包显示此 POST,如图 here (我添加了一些行空间以使 POST 数据更具可读性,但除此之外它与 wireshark 中的一样)。

但是,如果我启动一个 scrapy shell:

1) scrapy shell "http://www.betvictor.com/sports/en/football"

并构造一个表单请求:

2) from scrapy.http import FormRequest

req=FormRequest(
url='http://www.betvictor.com/sports/en/football',
formdata={
'TS644333_id': '3',
'TS644333_75': '286800b2a80cd3334cd2895e42e67031:yxxy:3N6QfX3q:1685704694',
'TS644333_md': '1',
'TS644333_rf': '0',
'TS644333_ct': '0',
'TS644333_pd': '0'
},
headers={
'Referer': 'http://www.betvictor.com/sports/en/football',
'Connection': 'keep-alive'
}
)

然后获取它

3) fetch(req)

我返回的响应正文只是另一个 javascript 挑战,而不是所需的服务内容。

然而,在 wireshark 中看到的数据包是(为了 POST 参数的可读性,再次使用了一些换行符)显示here ,在我看来完全相同.

出了什么问题?看起来相同的数据包如何导致不同的服务器响应?为什么这不适用于 scrapy?

它可能是我 POST 计算的参数中“:”的编码,但它看起来编码正确,并且两者在 wireshark 中匹配,所以我不认为这是问题所在。

最佳答案

如果你在你的 URL 上附加一个斜杠,它似乎可以工作 - 同样的 scrapy 请求,但 URL 更改为:

http://www.betvictor.com/sports/en/football/

附加示例:

我在测试另一个网站时遇到了同样的问题,该网站的页面在 curl 上运行良好,但在 requests 上运行不佳。与它战斗了一段时间后,这个带有额外斜线的答案解决了这个问题。

import requests
import json


r = requests.get(r'https://bet.hkjc.com/marksix/getJSON.aspx/?sd=20190101&ed=20190331&sb=0')

pretty_json = json.loads(r.text)
print (json.dumps(pretty_json, indent=2))

返回这个:

[
{
"id": "19/037",
"date": "30/03/2019",
"no": "15+17+18+37+39+49",
"sno": "31",
"sbcode": "",
...
...

.aspx 后面的斜线很重要。没有它是行不通的。如果没有斜线,页面将返回一个空的 javascript 质询。

import requests
import json

#no slash
r = requests.get(r'https://bet.hkjc.com/marksix/getJSON.aspx?sd=20190101&ed=20190331&sb=0')

print(r.text)

返回这个:

<HTML>
<head>
<script>
Challenge=341316;
ChallengeId=49424326;
GenericErrorMessageCookies="Cookies must be enabled in order to view this page.";
</script>
<script>
function test(var1)
{
var var_str=""+Challenge;
var var_arr=var_str.split("");
var LastDig=var_arr.reverse()[0];
var minDig=var_arr.sort()[0];
var subvar1 = (2 * (var_arr[2]))+(var_arr[1]*1);
var subvar2 = (2 * var_arr[2])+var_arr[1];
var my_pow=Math.pow(((var_arr[0]*1)+2),var_arr[1]);
var x=(var1*3+subvar1)*1;
var y=Math.cos(Math.PI*subvar2);
var answer=x*y;
answer-=my_pow*1;
answer+=(minDig*1)-(LastDig*1);
answer=answer+subvar2;
return answer;
}
</script>
<script>
client = null;
if (window.XMLHttpRequest)
{
var client=new XMLHttpRequest();
}
else
{
if (window.ActiveXObject)
{
client = new ActiveXObject('MSXML2.XMLHTTP.3.0');
};
}
if (!((!!client)&&(!!Math.pow)&&(!!Math.cos)&&(!![].sort)&&(!![].reverse)))
{
document.write("Not all needed JavaScript methods are supported.<BR>");

}
else
{
client.onreadystatechange = function()
{
if(client.readyState == 4)
{
var MyCookie=client.getResponseHeader("X-AA-Cookie-Value");
if ((MyCookie == null) || (MyCookie==""))
{
document.write(client.responseText);
return;
}

var cookieName = MyCookie.split('=')[0];
if (document.cookie.indexOf(cookieName)==-1)
{
document.write(GenericErrorMessageCookies);
return;
}
window.location.reload(true);
}
};
y=test(Challenge);
client.open("POST",window.location,true);
client.setRequestHeader('X-AA-Challenge-ID', ChallengeId);
client.setRequestHeader('X-AA-Challenge-Result',y);
client.setRequestHeader('X-AA-Challenge',Challenge);
client.setRequestHeader('Content-Type' , 'text/plain');
client.send();
}
</script>
</head>
<body>
<noscript>JavaScript must be enabled in order to view this page.</noscript>
</body>
</HTML>

关于python - 为什么 cURL 给出正确的响应而 scrapy 没有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22532015/

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