为什么cURL给出了正确的答案,而scrapy没有呢?

2024-09-28 05:15:41 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么cURL给出了正确的答案,而scrapy没有呢?在

我想用javascript来填充表单的站点,然后发布它并在提供内容之前进行验证。在

在最初的GET请求中从javascript中获取参数之后,我用python复制了这个js。我的“TS644333_75”值与js值匹配(通过执行文档.写入(..)输出,而不是让它像正常一样提交),如果你把结果复制并粘贴到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中可以看到)。在

但是,如果我开始一个破壳:

^{pr2}$

并构造一个表单请求:

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中添加了一些可读性的新行) 显示了here,在我看来,一致的 . 在

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

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


Tags: comhttpwwwjscurljavascriptposten
2条回答

结果发现,参数的顺序对这个服务器非常重要(我猜是因为它用有序的输入模拟一个隐藏的表单,这是一个额外的验证检查)。在python请求中,手工使用POST str和url编码(即':' > '%3A')可以使事情正常进行。虽然这两个包的顺序是一样的,但它们的顺序确实是一样的。在

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后面加上一个“/”也可以解决问题,事实上,如果你这样做的话,你只需要get请求就可以逃脱惩罚,没有js模拟,也没有表单发布!在

如果你在你的网址上加上一个斜杠,这似乎是可行的-同样的废话请求,但网址改为:

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

其他示例:

我在测试另一个网站时也遇到了同样的问题,这个网页在curl上运行得很好,但却不能使用requests。在与之斗争了一段时间后,这个用额外斜杠表示的答案解决了这个问题。在

^{pr2}$

返回此:

[
  {
    "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>

相关问题 更多 >

    热门问题