Scrapy:使用FormRequests来处理javascript doPostBack函数

时间:2016-06-07 17:22:48

标签: python asp.net scrapy

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

<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字典。在这种情况下,我点击了一个没有填写表格的链接。

1 个答案:

答案 0 :(得分:1)

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

formdata只是你可以填写FormRequest的另一个参数,from_response背后的最后一个想法是创建在你设置的Form上指定的请求,默认情况下获取所有已设置的使用inputname标记value标记(就像普通表单请求一样)。

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