Scrapy / crawling - обнаружение ловушек пауков или бесконечных веб-сайтов - PullRequest
0 голосов
/ 29 октября 2018

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

Кроме того, некоторые веб-сайты устанавливают ловушки для пауков или могут непреднамеренно создать аналогичную систему (где ссылки на страницы никогда не заканчиваются).

Если я а) имею право владельца сайта свободно сканировать свой веб-сайт и б) желаю использовать scrapy, какой метод я могу использовать, чтобы определить, действительно ли я столкнулся с "бесконечным" веб-сайтом, а не конкретным к любому примеру?

Примечание. Я говорю не о «бесконечной» прокрутке, а о бесконечных страницах.

Примером бесконечного веб-сайта может быть (хотя и бессмысленно и тривиально):

<?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>
    <?
}

?>

, где вы просто продолжаете нажимать на следующую и предыдущую, чтобы открыть больше страниц.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

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

В других случаях, например при просмотре календаря, где некоторые даты могут иметь значения, а другие нет, вы можете жестко указать ограничение для вашего паука (если дата, указанная в следующем URL-адресе, - X или старше, не анализируйте дальше) .

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

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

def parse(self, response):

    this_page_items = []
    for item in response.css("li .items")
        this_page_items.extend([ item.css("any unique thing here").extract_first() ])


    if "prev_page_items" in response.meta:
        prev_page_items = response.meta['prev_page_items']
        if sorted(prev_page_items) == sorted(this_page_items):
            return #ternimate next page calls

    #go to next page
    yield Request(url, callback=self.parse, meta={"prev_page_items": this_page_items})
...