使Scrapy从Javascript函数发送POST数据

时间:2019-01-02 19:42:17

标签: scrapy

我正在玩Scrapy,并且正在玩这个tutorial。情况看起来不错,但我注意到Steam更改了他们的年龄检查,因此DOM中不再有表格。因此建议的解决方案将不起作用:

form = response.css('#agegate_box form')

action = form.xpath('@action').extract_first()

name = form.xpath('input/@name').extract_first()

value = form.xpath('input/@value').extract_first()

formdata = {

        name: value,

        'ageDay': '1',

        'ageMonth': '1',

        'ageYear': '1955'

}

yield FormRequest(

        url=action,

        method='POST',

        formdata=formdata,

        callback=self.parse_product

    )

检查示例game强制进行年龄检查;我注意到“查看页面”按钮不再是表单:

<a class="btnv6_blue_hoverfade btn_medium" href="#" onclick="ViewProductPage()"><span>View Page</span></a>

被调用的函数最终将调用此函数:

function CheckAgeGateSubmit( callbackFunc )
    {
                    if ( $J('#ageYear').val() == 2019 )
        {
            ShowAlertDialog( '', 'Please enter a valid date' );
            return false;
        }

        $J.post(
            'https://store.steampowered.com/agecheckset/' + "app" + '/9200/',
            {
                sessionid: g_sessionID,
                ageDay: $J('#ageDay').val(),
                ageMonth: $J('#ageMonth').val(),
                ageYear: $J('#ageYear').val()
            }
        ).done( function( response ) {
            switch ( response.success )
            {
                case 1:
                    callbackFunc();
                    break;
                case 24:
                    top.location.reload();
                    break;
                case 15:
                case 2:
                    ShowAlertDialog( 'Error', 'There was a problem verifying your age.  Please try again later.' );
                    break;
            }
        } );

}

所以基本上这就是用一些数据进行POST ...在Scrapy中做这件事的最好方法是什么,因为这不再是一种形式了?我只是在考虑忽略获取表单的代码,而只是使用FormRequest对象发送请求...但这是要走的路吗?另一种选择是设置cookie的年龄并在每个单独的请求中传递它,这样就可能完全忽略了年龄检查?

谢谢!

1 个答案:

答案 0 :(得分:1)

您可能应该只设置一个适当的cookie,这样您就可以通过!

如果您查看进入页面时浏览器的功能:

enter image description here

并草率地复制它:

cookies = {
    'wants_mature_content':'1',
    'birthtime':'189302401',
    'lastagecheckage': '1-January-1976',
}
url = 'https://store.steampowered.com/app/9200/RAGE/'
Request(url, cookies)

lastagecheckage本身应该就足够了,但我尚未对其进行测试。