刮擦在页面上找不到表单



我正在尝试编写一个自动登录此网站的蜘蛛。但是,当我尝试在 shell 中使用scrapy.FormRequest.from_response时,出现错误:

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

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

表单是使用 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.

由于他们在前端大量使用 Javascript,因此您也不能使用页面的源代码来查找这些参数。相反,我使用了浏览器的开发人员控制台,并检查了尝试使用无效凭据登录时发生的请求/响应。

这给了我:

General:
Request URL: https://www.athletic.net/account/auth.ashx
[...]
Request Payload:
{e: "foo@example.com", pw: "secret"}

Scrapy 有一个 JsonRequest 类来帮助发布 JSON。看这里 [https://docs.scrapy.org/en/latest/topics/request-response.html]

所以像下面这样的东西应该有效

data = {"password": "pword", "username": "user"}
# JSON POST to API login URL
return JsonRequest( 
url=url,
callback=self.after_login,
data=data,
)

最新更新