我正在尝试编写一个自动登录此网站的蜘蛛。但是,当我尝试在 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,
)