我在动态创建的页面上有一个可点击的链接,如下所示:
<td align="left"><a id="ucResultsGrid_X77" href="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ucResultsGrid$X77", "", false, "", "webProperty.aspx?stype=id&s=67&time=201606071553023&id=X77", false, true))" style="text-decoration:underline;">View Property</a></td><td align="right">X77</td>
检查页面源后,似乎提交:
<form name="searchForm" method="post" action="./webSearch.aspx?cad&stype=id&s=67&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.php和http://cpuknows.com/2015/09/12/scrapy/。来自这些和其他来源(http://doc.scrapy.org/en/latest/faq.html#what-s-this-huge-cryptic-viewstate-parameter-used-in-some-forms和https://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字典。在这种情况下,我点击了一个没有填写表格的链接。
答案 0 :(得分:1)
最后的想法是复制一个请求,而不是真正复制一个“点击”,这可能涉及多个请求或只是内部javascript处理与实际响应。
formdata
只是你可以填写FormRequest的另一个参数,from_response
背后的最后一个想法是创建在你设置的Form上指定的请求,默认情况下获取所有已设置的使用input
和name
标记value
标记(就像普通表单请求一样)。
有些input
个标签没有value
属性的信息,通常后来由用户输入填充,您需要检查一旦您尝试将哪些特定参数发送复制该请求,并在formdata
字典上传递这些参数。