Scrapy与Javascript分页

时间:2018-12-31 17:11:03

标签: javascript pagination scrapy

编辑:

我通过使用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>

如果有人可以向我指出正确的方法,那将是很好的。谢谢。

2 个答案:

答案 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()
            }