Python 为什么卷发能给出正确的反应,而刮痧却不能?
为什么卷发能给出正确的反应,而刮痧却不能 我想使用javascript来填充表单,然后发布并验证该表单,然后再提供内容 我在python中复制了这个js,在初始GET请求中从javascript中删除了参数。我的“TS644333_75”值与js值匹配(通过编写文档进行测试。将(..)写出来,而不是让它像正常一样提交),如果您将结果复制并粘贴到cURL中,也可以。例如:Python 为什么卷发能给出正确的反应,而刮痧却不能?,python,curl,scrapy,Python,Curl,Scrapy,为什么卷发能给出正确的反应,而刮痧却不能 我想使用javascript来填充表单,然后发布并验证该表单,然后再提供内容 我在python中复制了这个js,在初始GET请求中从javascript中删除了参数。我的“TS644333_75”值与js值匹配(通过编写文档进行测试。将(..)写出来,而不是让它像正常一样提交),如果您将结果复制并粘贴到cURL中,也可以。例如: curl --http1.0 'http://www.betvictor.com/sports/en/football' -
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我只需复制并粘贴模拟js时计算的python代码的结果
wireshark中的监控数据包显示了如图所示的这篇文章(我添加了一些行空格以使文章数据更具可读性,但在其他方面,它与wireshark中所示的一样)
但是,如果我启动一个刮擦壳:
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 params中为可读性添加了一些新行)
如图所示,在我看来是一致的
出什么事了?看起来相同的数据包如何导致不同的服务器响应?为什么这不适用于scrapy
这可能是我发布的计算参数中“:”的编码,但它似乎编码正确,并且两者在wireshark中都匹配,所以我看不出这是问题所在。如果在URL中添加斜杠,似乎可以工作-同样的刮擦请求,但URL更改为:
http://www.betvictor.com/sports/en/football/
附加示例:
在测试另一个网站时,我遇到了同样的问题,该网站的页面在curl
上运行得很好,但在请求中却无法运行。经过一段时间的斗争,这个答案用额外的斜杠解决了问题
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": "",
...
...
<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>
.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)
返回以下内容:
[
{
"id": "19/037",
"date": "30/03/2019",
"no": "15+17+18+37+39+49",
"sno": "31",
"sbcode": "",
...
...
<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>
挑战=341316;
ChallengeId=49424326;
GenericErrorMessageCookies=“必须启用Cookies才能查看此页面。”;
功能测试(var1)
{
var var_str=”“+挑战;
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;
答案-=我的战力*1;
答案+=(minDig*1)-(LastDig*1);
答案=答案+子变量2;
返回答案;
}
client=null;
if(window.XMLHttpRequest)
{
var client=new XMLHttpRequest();
}
其他的
{
if(window.ActiveXObject)
{
client=newActiveXObject('MSXML2.XMLHTTP.3.0');
};
}
如果(!(!!客户端)和(!!Math.pow)和(!!Math.cos)和(!![].sort)和(!![].reverse)))
{
write(“并非所有需要的JavaScript方法都受支持。
”;
}
其他的
{
client.onreadystatechange=函数()
{
if(client.readyState==4)
{
var MyCookie=client.getResponseHeader(“X-AA-Cookie-Value”);
if((mycokie==null)| |(mycokie==“”)
{
document.write(client.responseText);
返回;
}
var cookieName=MyCookie.split('=')[0];
if(document.cookie.indexOf(cookieName)=-1)
{
编写(一般错误消息cookies);
返回;
}
window.location.reload(true);
}
};
y=测试(挑战);
客户端。打开(“POST”,窗口。位置,true);
client.setRequestHeader('X-AA-Challenge-ID',ChallengeId);
client.setRequestHeader('X-AA-Challenge-Result',y);
client.setRequestHeader('X-AA-Challenge',Challenge);
setRequestHeader('Content-Type','text/plain');
client.send();
}
必须启用JavaScript才能查看此页面。
结果表明,参数的顺序对该服务器来说非常重要(我猜是因为它模拟了一个带有有序输入的隐藏表单,这是一个额外的验证检查)。在python请求中,手动使用POST str和url编码(即:'-->“%3A”
)可以使事情正常进行。因此,尽管wireshark数据包几乎完全相同,但它们唯一不同的方式是参数字符串顺序,实际上这是关键
在Scrapy
中传递一个元组,如下所示:
ot= ( ('TS644333_id', '3'),
('TS644333_75', value),
('TS644333_md', '1'),
('TS644333_rf', '0'),
('TS644333_ct', '0'),
('TS644333_pd', '0')
)
要formdata=
而不是字典,这样也可以保持顺序
还需要标题{'Content-Type':'application/x-www-form-urlencoded'}
正如anana在他的回答中指出的那样,在所有请求URL后面添加一个“/”也可以解决问题,事实上,如果你这样做,你只需要获取请求就可以了,没有js模拟,也没有表单发布 非常感谢。如果有人知道为什么python请求库和scrapy而不是cURL中需要最后的“/”,我真的很想听听解释。