Scrapy在页面上找不到表格

时间:2018-06-29 23:37:08

标签: html python-3.x xpath scrapy web-crawler

我正在尝试编写一个蜘蛛,它将自动登录到this website。但是,当我尝试在外壳中使用scrapy.FormRequest.from_response时,出现错误:

No <form> element found in <200 https://www.athletic.net/account/login/?ReturnUrl=%2Fdefault.aspx>

当我检查站点上的元素时,我肯定可以看到表单,但是当我尝试使用response.xpath()查找元素时,它也没有显示在Scrapy中。表单内容是否可能以某种方式对我的蜘蛛隐藏?如果是这样,我该如何解决?

1 个答案:

答案 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>

要找到这样的问题,我可以:

  • 将“查看源代码”和“检查”中的源代码相互比较
  • 使用不带Javascript的浏览器浏览网页(当我开发抓取工具时,我通常会使用一个带Javascript的浏览器进行研究和文档编制,而使用另一个浏览器来检查不带Javascript的网页)

在这种情况下,您必须为此网页手动创建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"}