抓/爬-检测蜘蛛陷阱或无限的网站

时间:2018-10-29 12:34:36

标签: python scrapy web-crawler

已经阅读了“ Why Johnny Can’t Pentest: An Analysis of Black-box Web Vulnerability Scanners”,可以理解为某些网站,例如日历应用程序,爬网程序很难处理。它们似乎是“无限”网站,其中仅包含指向下一天/月/年等的链接。

此外,某些网站设置了蜘蛛陷阱或可能无意中创建了一个类似的系统(页面链接永无止境)。

如果我a)获得了网站所有者的许可,可以自由浏览其网站,并且b)希望使用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 :(得分:1)

即使分页是无止境的,内容通常也不是。因此,当问题是无休止的分页时,仅当当前页面具有内容时才获取下一页,或者如果要使其达到最佳状态,则仅当当前页面具有已知的每页项目数时才可以获取下一页来防止无休止的循环。 / p>

在其他情况下,例如浏览日历中某些日期可能具有其他日期没有的值,则可以对蜘蛛程序进行硬编码限制(如果下一个URL涵盖的日期是X或更旧的日期,请不要进一步解析)

答案 1 :(得分:-1)

我能想到的一件事是,将所有商品ID传递到您要抓取的下一页 然后检查下一页是否有相同的项目,这意味着分页已结束,没有新的记录

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