编辑:
我通过使用Scrapy的FormRequest取得了一些进展,现在希望了解如何遍历所有页面。不幸的是,下面的代码仅返回页面209的内容:
for i in range (1, 210):
formdata = {'pageNumber': str(i)}
def parse(self, response):
return scrapy.FormRequest.from_response(
response, formdata=self.formdata, callback=self.after_post)
def after_post(self, response):
for link in response.css('div.AL'):
yield{
'link': link.css('div.AL').extract()
}
看起来好像我的循环在``def parse(self,response)''部分发生之前就运行了(即在继续之前我运行到209)。任何关于如何构造迭代并使其工作的想法都将受到高度赞赏。谢谢。
原始帖子:
我正在尝试使用Scrapy爬网网站,但由于该页面在表单中显示数据并使用JavaScript进行分页而被卡住了。
这是分页的html部分:
<div id="dvPager" class="AList-GridPagingArea">
<div class="seperator20"></div>
<div class="AList-GridPageStart" id="pagerFirst">First</div>
<div class="AList-GridPagePrev" id="pagerPrevious">Previous</div>
<div class="AList-GridPageCurrent">Page 1 of 211</div>
<div class="AList-GridPageNext" id="pagerNext">Next</div>
<div class="AList-GridPageEnd" id="pagerLast">Last</div>
<div class="seperator20"></div>
</div>
<input data-val="true" data-val-number="The field PageNumber must be a
number." data-val-required="The PageNumber field is required."
id="pageNumber" name="pageNumber" type="hidden" value="1" />
这是对应的javascript:
<script type="text/javascript">
$(document).ready(function() {
$("#pagerFirst").bind('click', function(){GoToPage(1)});
$("#pagerPrevious").bind('click', function(){GoToPage(1)});
$("#pagerNext").bind('click', function(){GoToPage(2)});
$("#pagerLast").bind('click', function(){GoToPage(211)});
$('#pagerFirst, #pagerPrevious, #pagerNext, #pagerLast').hover(function() {
$(this).css('cursor','pointer');
});
if(1 == 1 || 211 == 0){
$("#pagerFirst").unbind('click');
$('#pagerFirst').hover(function() {
$(this).css('cursor','default');
});
}
if(1 == 1 || 211 == 0) {
$("#pagerPrevious").unbind('click');
$('#pagerPrevious').hover(function() {
$(this).css('cursor','default');
});
}
if(1 == 211 || 211 == 0) {
$("#pagerNext").unbind('click');
$('#pagerNext').hover(function() {
$(this).css('cursor','default');
});
}
if(1 == 211 || 211 == 0) {
$("#pagerLast").unbind('click');
$('#pagerLast').hover(function() {
$(this).css('cursor','default');
});
}
});
function GoToPage(page) {
$("#pageNumber").val(page);
CollectAuctionObjectsFilters();
$("#dvPager").parent("form").submit();
}
</script>
如果有人可以向我指出正确的方法,那将是很好的。谢谢。
答案 0 :(得分:1)
通常有两种方法可以解决此问题,
首先
使用splash
来呈现javascript。
第二,
在按network call
时找到next
,然后按照该呼叫提取所需的数据。
答案 1 :(得分:0)
通过反复试验,我发现迭代必须在“ def parse”部分内。解决方法如下:
def parse(self, response):
for i in range (1, 210):
yield scrapy.FormRequest.from_response(
response,
formdata ={
'pageNumber': str(i)
},
callback = self.after_post
)
def after_post(self, response):
for link in response.css('div.AL'):
yield{
'link': link.css('div.AL').extract()
}