Python 为asp doPostBack()函数生成正确的scrapy隐藏输入表单值
tldr我试图覆盖服务器返回新的地理缓存页所需的隐藏字段失败(\uu EVENTTARGET属性),因此服务器返回空页 Ps:我原来的帖子因为投票放弃而关闭了,所以我在第一篇帖子上做了大量编辑后,在这里重新发布Python 为asp doPostBack()函数生成正确的scrapy隐藏输入表单值,python,asp.net,web-scraping,scrapy,Python,Asp.net,Web Scraping,Scrapy,tldr我试图覆盖服务器返回新的地理缓存页所需的隐藏字段失败(\uu EVENTTARGET属性),因此服务器返回空页 Ps:我原来的帖子因为投票放弃而关闭了,所以我在第一篇帖子上做了大量编辑后,在这里重新发布 我尝试使用scrapy1.5.0在一个著名的地理缓存网站上删除一些包含缓存的网页 因为如果你想运行这个,你需要一个帐户,所以我在网站上创建了一个新的临时免费帐户来做一些测试:dumbuserwith passwordstackoverflow A)流程的实际工作部分: 首先,我通过
我尝试使用
scrapy1.5.0
在一个著名的地理缓存网站上删除一些包含缓存的网页
因为如果你想运行这个,你需要一个帐户,所以我在网站上创建了一个新的临时免费帐户来做一些测试:dumbuser
with passwordstackoverflow
A)流程的实际工作部分:
- 首先,我通过登录页面进入网站(需要搜索页面):
https://www.geocaching.com/account/login
- 成功登录后,我在一些地理位置(例如
)搜索项目()法国、上诺曼底
\u VIEWSTATE
变量(隐藏输入)
每个数字的链接(参见图片)调用一个带有javascript函数的链接javascript:u doPostBack(…)
,该函数在提交整个表单之前将内容注入已经存在的隐藏字段
正如您在\u doPostBack
功能中所看到的:
<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['aspnetForm'];
if (!theForm) {
theForm = document.aspnetForm;
}
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
//]]>
</script>
D)后果:
服务器返回的页面是空的,所以我的策略有问题
当我查看服务器在表单发布后返回的生成html代码时,\uu EVENTTARGET
不会被scrapy覆盖:
<input id="__EVENTTARGET" name="__EVENTTARGET" type="hidden" value=""/>
<input id="__EVENTARGUMENT" name="__EVENTARGUMENT" type="hidden" value=""/>
解决了使用大量耐心和工具调试并将POST查询重新发送到服务器 与更新1类似,在我的原始问题中,问题来自表单中的输入
ctl00$ContentBody$chkAll
从FormRequest
发送的POST表单中删除输入的方法很简单,我在。在formdata
dictionnary中将属性设置为None
result = scrapy.FormRequest.from_response(
response,
formname="aspnetForm",
formxpath="//form[@id='aspnetForm']",
formdata={'ctl00$ContentBody$chkAll':None,
'__EVENTTARGET':'ctl00$ContentBody$pgrTop$lbGoToPage_2',},
dont_click=True,
callback=self.parse_cachesList,
dont_filter=True
)
result = scrapy.FormRequest.from_response(
response,
formname="aspnetForm",
formxpath="//form[@id='aspnetForm']",
formdata={'ctl00$ContentBody$chkAll':'',
'__EVENTTARGET':'ctl00$ContentBody$pgrTop$lbGoToPage_2',},
dont_click=True,
callback=self.parse_cachesList,
dont_filter=True,
meta={'proxy': 'http://localhost:8888'}
)
result = scrapy.FormRequest.from_response(
response,
formname="aspnetForm",
formxpath="//form[@id='aspnetForm']",
formdata={'ctl00$ContentBody$chkAll':None,
'__EVENTTARGET':'ctl00$ContentBody$pgrTop$lbGoToPage_2',},
dont_click=True,
callback=self.parse_cachesList,
dont_filter=True
)