scrapy - прекращение сканирования при переходе на бесконечный веб-сайт - PullRequest
0 голосов
/ 28 октября 2018

Давайте представим, что у меня есть веб-страница вроде this .

counter.php

if(isset($_GET['count'])){
    $count = intval($_GET['count']);
    $previous = $count - 1;
    $next = $count + 1;
    ?>
    <a href="?count=<?php echo $previous;?>">< Previous</a>

    Current: <?php echo $count;?>

    <a href="?count=<?php echo $next;?>">Next ></a>
    <?
}

?>

Это «бесконечный» веб-сайт, потому что вы можете просто нажимать кнопку «Далее», чтобы перейти кследующая страница (счетчик просто увеличится) или предыдущая и т. д.

Однако, если я захочу просканировать эту страницу и перейти по ссылкам, используя подобную скрапировку, скрапинг никогда не прекратит ползти.

Пример паука:

urls = []  
class TestSpider(CrawlSpider):
        name = 'test'
        allowed_domains = ['example.com']
        start_urls = ['http://example.com/counter?count=1']


        rules = (
            Rule(LinkExtractor(), callback='parse_item', follow=True),
            )

        def parse_item(self, response):
            urls.append(response.url)

Какой механизм я могу использовать, чтобы определить, действительно ли я застрял на бесконечном веб-сайте и мне нужно вырваться из него?

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Вы всегда можете отключиться, если на странице нет ЭЛЕМЕНТОВ на этой странице или нет кнопки СЛЕДУЮЩАЯ СТРАНИЦА, это означает, что разбиение на страницы закончено

class TestSpider(CrawlSpider):
        name = 'test'
        allowed_domains = ['example.com']

        def start_requests(self):
            page = 1
            yield Request("http://example.com/counter?page=%s" % (page), meta={"page": page}, callback=self.parse_item)

        def parse_item(self, response):

            #METHOD 1: check if items availble on this page         
            items = response.css("li.items")

            if items:
                #Now go to next page
                page = int(response.meta['page']) + 1
                yield Request("http://example.com/counter?page=%s" % (page), meta={"page": page}, callback=self.parse_item)
            else:
                logging.info("%s was last page" % response.url)

            #METHOD 2: check if this page has NEXT PAGE button, most websites has that          
            nextPage = response.css("a.nextpage")

            if nextPage:
                #Now go to next page
                page = int(response.meta['page']) + 1
                yield Request("http://example.com/counter?page=%s" % (page), meta={"page": page}, callback=self.parse_item)
            else:
                logging.info("%s was last page" % response.url)
0 голосов
/ 28 октября 2018

Вам не нужно использовать правило в скрапе.Вы можете сначала проанализировать страницу за страницей, а затем выполнить итерации всех элементов на каждой странице.Или вы можете собрать все ссылки на элементы на каждой странице.Например:

urls = []
class TestSpider(CrawlSpider):
    name = 'test'
    allowed_domains = ['example.com']
    start_urls = ['http://example.com/counter?count=1']

    def parse(self, response):
        links = response.xpath('//a[@class="item"]/@href').extract()
        for link in links:
            yield Request(link, self.parse_item)
            # you can insert the item 's url here, so you dont have to yield to parse_item
            # urls.append(link)

        url, pg = response.url.split("=")# you can break infinite loop here
        if int(pg) <= 10: #We loop by page #10
            yield Request(url + "=" + str(int(pg) + 1), self.parse)

    def parse_item(self, response):
        urls.append(response.url)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...