Scrapy vs Javascript Pagination - PullRequest
       10

Scrapy vs Javascript Pagination

0 голосов
/ 31 декабря 2018

Редактировать:

Мне удалось добиться некоторого прогресса с помощью Scare 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 голосов
/ 02 января 2019

Методом проб и ошибок я понял, что итерация должна быть внутри части '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()
            } 
0 голосов
/ 31 декабря 2018

Обычно существует два подхода для решения этой проблемы:

Первый,

Используйте splash для визуализации JavaScript.

Второй,

Найдите network call, когда вы нажмете next, а затем выполните этот вызов, чтобы извлечь нужные данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...