我正在玩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的年龄并在每个单独的请求中传递它,这样就可能完全忽略了年龄检查?
谢谢!