【问题标题】:Scrapy: Using FormRequests to handle javascript doPostBack functionsScrapy:使用 FormRequests 处理 javascript doPostBack 函数
【发布时间】:2016-06-07 17:22:47
【问题描述】:

我在动态创建的页面上有一个可点击的链接,如下所示:

<td align="left"><a id="ucResultsGrid_X77" href="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;ucResultsGrid$X77&quot;, &quot;&quot;, false, &quot;&quot;, &quot;webProperty.aspx?stype=id&amp;s=67&amp;time=201606071553023&amp;id=X77&quot;, false, true))" style="text-decoration:underline;">View Property</a></td><td align="right">X77</td>

在检查页面源之后,它似乎提交给:

<form name="searchForm" method="post" action="./webSearch.aspx?cad&amp;stype=id&amp;s=67&amp;time=201606071512012" id="searchForm">
<div>
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/really long string />
</div>

<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['searchForm'];
if (!theForm) {
    theForm = document.searchForm;
}
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}

我一直在阅读 http://harman-clarke.co.uk/answers/javascript-links-in-scrapy.phphttp://cpuknows.com/2015/09/12/scrapy/ 。来自这些和其他来源(http://doc.scrapy.org/en/latest/faq.html#what-s-this-huge-cryptic-viewstate-parameter-used-in-some-formshttps://blog.scrapinghub.com/2016/04/20/scrapy-tips-from-the-pros-april-2016-edition/

我已经制作了以下蜘蛛函数:

def parse_third_request(self, response):

    item = response.meta['item'] 
    yield FormRequest.from_response(response,formname='searchForm',callback=self.parse_detail_page,meta={'item': item})

但是我不清楚如何设置 http://doc.scrapy.org/en/latest/topics/request-response.html#request-subclasses 中提到的 formdata 字典。在这种情况下,我点击的不是填写表格的链接。

【问题讨论】:

    标签: python asp.net scrapy


    【解决方案1】:

    最终的想法是复制一个请求,而不是真正复制一个“点击”,这可能涉及多个请求或只是内部 javascript 处理与实际响应。

    formdata 只是您可以填写该 FormRequest 的另一个参数,from_response 背后的最终想法是仅创建在您设置的表单上指定的请求,默认情况下获取所有已设置的 input标签,带有namevalue(就像正常的表单请求一样)。

    有一些input标签没有value属性的信息,通常稍后由用户输入填充,一旦你尝试复制该请求,你需要检查正在发送哪些特定参数,并在formdata 字典中传递这些参数。

    【讨论】:

      猜你喜欢
      • 2019-07-16
      • 2011-09-25
      • 2015-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多