如何解决如何使用scrapy触发JS ASP.Net下一页事件?
我要从这website抓取内容,我首先发送一个FormRequest
,该搜索结果基于Wim Herman's对另一个问题here
我抓取了所需内容,并想转到下一个不包含URL的页面,它是由JS触发的。 html标记的外观如下:
<a href="javascript:__doPostBack('dgSearchResults$ctl24$ctl01','')">2</a>
我尝试了以下操作,但似乎无济于事:
In [18]: fr = FormRequest.from_response(response,formdata={"__EVENTTARGET": 'dg
...: SearchResults$ctl02$ctl03'})
In [19]: fetch(fr)
2020-08-24 16:47:06 [scrapy.core.engine] DEBUG: Crawled (200) <POST https://registers.maryland.gov/RowNetWeb/Estates/frmEstateSearch2.aspx> (referer: None)
In [20]: view(response)
Out[20]: True
这:
In [21]: fr = FormRequest.from_response(response,formdata={"__EVENTTARGET": 'dg
...: SearchResults$ctl02$ctl01'},clickdata={'type': 'submit'})
In [22]: fetch(fr)
2020-08-24 16:50:24 [scrapy.core.engine] DEBUG: Crawled (200) <POST https://registers.maryland.gov/RowNetWeb/Estates/frmEstateSearch2.aspx> (referer: None)
In [23]: view(response)
Out[23]: True
当我查看响应时,它要么使我登陆初始页面(包含初始表单的页面),要么什么也没发生,但页面号仍设置为1。
解决方法
正如我在评论中提到的,这是ASP Net页面上的常见问题。您可能现在知道,您提到的js将触发POST请求。此发布请求的正文可能包含您在搜索表单中填写的字段作为输入,以及由页面实例生成的一些隐藏输入(例如fields
或__VIEWSTATE
)。
当您使用__VIEWSTATEGENERATOR
方法时,它将搜索那些输入以填充请求正文,方法是选择页面中FormRequest.from_response()
元素内的所有输入元素。有时候没关系,有时候不是,那是你的情况。
当该方法选择所有输入时,它将获得原本用于其他用途的输入。您的情况就是此输入:
//form
您怎么知道?
如果您使用浏览器的开发工具并分析如何将请求从第1页更改为第2页,您将看到这是一个POST请求,它的主体是这样的:
<input id="cmdSearchNew" value="New Search" ... />
但是,如果您检查了请求请求的正文(,您可以在已经使用的shell中打印{
"__EVENTTARGET":"dgSearchResults$ctl24$ctl01","__EVENTARGUMENT":"","__VIEWSTATE":"jyAD4Bm...","__VIEWSTATEGENERATOR":"11C1F95B","__EVENTVALIDATION":"TmG0xFB..."
}
),您将看到类似以下内容:
fr.body
它将被urlencoded,这是一个已解析的视图
该{
"__EVENTTARGET":"dgSearchResults$ctl24$ctl01","cmdSearchNew": "New Search"
"__VIEWSTATE":"jyAD4Bm...","__EVENTVALIDATION":"TmG0xFB..."
}
字段不应该存在,它用于其他内容,但是scrapy不能知道它是在同一表格中。 (而且cmdSearchNew
不会出现,因为该值为空,因此Scrapy会忽略它)
一旦发现问题,可以通过将__EVENTARGUMENT
设置为from_response()
来告诉None
方法您不希望特定字段出现在正文中。
fr = FormRequest.from_response(response,formdata={
'__EVENTTARGET': 'dgSearchResults$ctl24$ctl01','cmdSearchNew': None
})
这应该足以让您获得第2页的答复。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。