刮擦/爬行检测蜘蛛陷阱或无限网站

2024-04-26 04:43:44 发布

您现在位置:Python中文网/ 问答频道 /正文

在阅读“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>
    <?
}

?>

在这里,你只需点击下一页和上一页来显示更多的页面。在


Tags: echoget网站链接count页面can例子
2条回答

我能想到的一件事就是把所有的项目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})

即使分页是无止境的,内容通常也不是。因此,当问题是无休止的分页时,您可以通过仅在当前页有内容时或(如果您想优化)仅当当前页具有已知的每页项目数时,才能通过获取下一页来防止无休止的循环。在

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

相关问题 更多 >