我正在尝试编写一个蜘蛛,它将自动登录到this website。但是,当我尝试在外壳中使用scrapy.FormRequest.from_response
时,出现错误:
No <form> element found in <200 https://www.athletic.net/account/login/?ReturnUrl=%2Fdefault.aspx>
当我检查站点上的元素时,我肯定可以看到表单,但是当我尝试使用response.xpath()
查找元素时,它也没有显示在Scrapy中。表单内容是否可能以某种方式对我的蜘蛛隐藏?如果是这样,我该如何解决?
答案 0 :(得分:0)
该表单是使用Javascript创建的,它不是静态HTML源代码的一部分。 Scrapy无法解析Javascript,因此无法找到它。
静态HTML(他们使用Javascript注入表单的地方)的相关部分是:
<div ng-controller="AppCtrl as appC" class="m-auto pt-3 pb-5 container" style="max-width: 425px;">
<section ui-view></section>
</div>
要找到这样的问题,我可以:
在这种情况下,您必须为此网页手动创建FormRequest。我无法在其形式上发现任何形式的CSRF保护,因此它可能很简单:
FormRequest(url='https://www.athletic.net/account/auth.ashx',
formdata={"e": "foo@example.com", "pw": "secret"})
但是,我认为您不能使用formdata
,但是他们希望您发送JSON。不确定FormRequest
是否可以解决这个问题,我想您只是想使用标准的Request
。
由于他们的前端大量使用Java脚本,因此您也无法使用页面的源代码来查找这些参数。相反,我使用浏览器的开发人员控制台,并检查了尝试使用无效凭据登录时发生的请求/响应。
这给了我
General:
Request URL: https://www.athletic.net/account/auth.ashx
[...]
Request Payload:
{e: "foo@example.com", pw: "secret"}