【问题标题】:Generate a correct scrapy hidden input form values for asp doPostBack() function为 asp doPostBack() 函数生成正确的scrapy隐藏输入表单值
【发布时间】:2018-01-31 14:12:35
【问题描述】:

tldr; 我试图覆盖服务器所需的隐藏字段以向我返回一个新的 geocaches 页面失败(__EVENTTARGET 属性),所以服务器返回一个空页面.

Ps : 我的原始帖子因投票放弃而关闭,所以我在对第一个帖子进行大量编辑后重新发布。


我尝试使用Scrapy 1.5.0 在著名的寻宝网站上废弃一些包含缓存的网页。

因为如果你想运行这个code,你需要一个帐户,我在网站上创建一个新的临时免费帐户进行一些测试:dumbuser,密码为stackoverflow


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

  • 首先,我通过登录页面进入网站(需要搜索页面):https://www.geocaching.com/account/login
  • 登录成功后,在某些地理位置(例如France, Haute-Normandie)搜索项目(geocaches)。

第一次搜索没有问题,解析第一个 geocaches 没有任何困难。

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

当我尝试模拟点击进入地理藏宝的下一页时。例如转到第 1 页到第 2 页。

网站使用ASP with synchronised state between client and server,所以我们需要在报废期间转到第1页然后第2页然后第3页等等,以便在每个FORM查询之间维护服务器生成的__VIEWSTATE变量(隐藏输入)。

每个数字的链接(见图)调用一个带有javascript函数javascript:__doPostBack(...)的链接,在提交整个表单之前将内容注入到已经存在的隐藏字段中。

正如您在 __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>

示例: 因此,当您单击第 2 页链接时,javascript 运行为 javascript:__doPostBack('ctl00$ContentBody$pgrTop$lbGoToPage_2','')。表单是用

提交的
  • __EVENTTARGET = ctl00$ContentBody$pgrTop$lbGoToPage_2
  • __EVENTARGUMENT = ''

C) 首先尝试模仿这种行为:

为了删除许多页面(这里限制为五个第一页),我在这里尝试yield 五个formRequest.from_response 查询,它只是手动覆盖这个__EVENTTARGET__EVENTARGUMENT 属性:

def parse_pages(self,response):

    self.parse_cachesList(response)

    ## EXTRACT NUMBER OF PAGES
    links = response.xpath('//td[@class="PageBuilderWidget"]/span/b[3]')
    print(links.extract_first())

    ## Try to extract page 1 to 5 for exemple
    for page in range(1,5):
        yield scrapy.FormRequest.from_response(
            response,
            formxpath="//form[@id='aspnetForm']",
            formdata=
{'__EVENTTARGET':'ctl00$ContentBody$pgrTop$lbGoToPage_'+str(page),
'__EVENTARGUMENT': '',
                      '__LASTFOCUS': ''},
            dont_click=True,
            callback=self.parse_cachesList,
            dont_filter=True
        )

D) 后果:

服务器返回的页面是空的,所以我的策略有问题。

当我查看表单发布后服务器返回的生成的html代码时,__EVENTTARGET 永远不会被scrapy覆盖

<input id="__EVENTTARGET" name="__EVENTTARGET" type="hidden" value=""/>
<input id="__EVENTARGUMENT" name="__EVENTARGUMENT" type="hidden" value=""/>

E) 问题:

你能帮我理解为什么scrapy不在这里替换/覆盖__EVENTTARGET的值吗?我模拟点击关注每个新页面的用户的策略中的问题在哪里?

完整代码可在此处下载code


更新 1:

使用fiddler,我终于发现问题与一个输入有关:ctl00$ContentBody$chkAll=Check All这个输入是通过scrapy.FormRequest.from_response方法自动复制的。如果我从 POST 请求中删除此属性,它会起作用。那么,如何删除此字段,我尝试为空而没有结果:

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'}
            )

【问题讨论】:

    标签: python asp.net web-scraping scrapy


    【解决方案1】:

    已解决,请耐心等待,并使用fiddler 工具调试并将 POST 查询重新发送到服务器!

    就像 update 1 在我原来的问题中所说,问题来自表单中的输入 ctl00$ContentBody$chkAll

    删除FormRequest 发送的POST 表单中的输入的方法很简单,我在commit here 中找到了它。在formdata 字典中将属性设置为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
            )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-07
      • 1970-01-01
      • 1970-01-01
      • 2011-05-28
      • 1970-01-01
      相关资源
      最近更新 更多