Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为asp doPostBack()函数生成正确的scrapy隐藏输入表单值_Python_Asp.net_Web Scraping_Scrapy - Fatal编程技术网

Python 为asp doPostBack()函数生成正确的scrapy隐藏输入表单值

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)流程的实际工作部分: 首先,我通过

tldr我试图覆盖服务器返回新的地理缓存页所需的隐藏字段失败(\uu EVENTTARGET属性),因此服务器返回空页

Ps:我原来的帖子因为投票放弃而关闭了,所以我在第一篇帖子上做了大量编辑后,在这里重新发布


我尝试使用
scrapy1.5.0
在一个著名的地理缓存网站上删除一些包含缓存的网页

因为如果你想运行这个,你需要一个帐户,所以我在网站上创建了一个新的临时免费帐户来做一些测试:
dumbuser
with password
stackoverflow


A)流程的实际工作部分:

  • 首先,我通过登录页面进入网站(需要搜索页面):
    https://www.geocaching.com/account/login
  • 成功登录后,我在一些地理位置(例如
    法国、上诺曼底
    )搜索项目()
第一次搜索没有任何问题,我也不难解析第一个地理缓存

B)流程中的问题部分:请求下一页

当我尝试模拟单击以转到地理缓存的下一页时。例如,转到第1页到第2页

网站使用,因此我们需要在报废过程中转到第1页、第2页、第3页等,以维护服务器在每个表单查询之间生成的
\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
        )