• Python3标准库:urllib.robotparser Internet蜘蛛访问控制


    1. urllib.request网络资源访问

    robotparser为robots.txt文件格式实现一个解析器,提供了一个函数来检查给定的用户代理是否可以访问一个资源。这个模块可以用于合法蜘蛛或者需要抑制或限制的其他爬虫应用中。

    1.1 robots.txt

    robots.txt文件格式是一个基于文本的简单访问控制系统,用于自动访问Web资源的计算机程序(如“蜘蛛”“爬虫”等)。这个文件由记录构成,各记录会指定程序的用户代理标识符,后面是该代理不能访问的一个URL(或URL前缀)列表。
    以下代码清单显示了https://pymotw.com/的robots.txt文件。

    Sitemap: https://pymotw.com/sitemap.xml
    User-agent: *
    Disallow: /admin/
    Disallow: /downloads/
    Disallow: /media/
    Disallow: /static/
    Disallow: /codehosting/

    这个文件会阻止访问网站中某些计算资源代价昂贵的部分,如果搜索引擎试图索引这些部分,那么可能会让服务器负载过重。要得到更完整的robots.txt示例集,可以参考Web Robots页面。

    1.2 测试访问权限

    基于之前提供的数据,一个简单的爬虫应用可以使用RobotFileParser.can_fetch()测试是否允许下载一个页面。

    from urllib import parse
    from urllib import robotparser
    
    AGENT_NAME = 'PyMOTW'
    URL_BASE = 'https://pymotw.com/'
    parser = robotparser.RobotFileParser()
    parser.set_url(parse.urljoin(URL_BASE, 'robots.txt'))
    parser.read()
    
    PATHS = [
        '/',
        '/PyMOTW/',
        '/admin/',
        '/downloads/PyMOTW-1.92.tar.gz',
    ]
    
    for path in PATHS:
        print('{!r:>6} : {}'.format(
            parser.can_fetch(AGENT_NAME, path), path))
        url = parse.urljoin(URL_BASE, path)
        print('{!r:>6} : {}'.format(
            parser.can_fetch(AGENT_NAME, url), url))
        print()

    can_fetch()的URL参数可以是一个相对于网站根目录的相对路径,也可以是一个完全URL。

    1.3 长寿命蜘蛛

    如果一个应用需要花很长时间来处理它下载的资源,或者受到抑制,需要在下载之间暂停,那么这样的应用应当以它已下载内容的寿命为根据,定期检查新的robots.txt文件。这个寿命并不是自动管理的,不过有一些简便方法可以方便地跟踪其寿命。

    from urllib import robotparser
    import time
    
    AGENT_NAME = 'PyMOTW'
    parser = robotparser.RobotFileParser()
    # Using the local copy
    parser.set_url('file:robots.txt')
    parser.read()
    parser.modified()
    
    PATHS = [
        '/',
        '/PyMOTW/',
        '/admin/',
        '/downloads/PyMOTW-1.92.tar.gz',
    ]
    
    for path in PATHS:
        age = int(time.time() - parser.mtime())
        print('age:', age, end=' ')
        if age > 1:
            print('rereading robots.txt')
            parser.read()
            parser.modified()
        else:
            print()
        print('{!r:>6} : {}'.format(
            parser.can_fetch(AGENT_NAME, path), path))
        # Simulate a delay in processing
        time.sleep(1)
        print()

    这个例子有些极端,如果已下载的文件寿命超过一秒,那么它就会下载一个新的robots.txt文件。

    作为一个更好的长寿命应用,在下载整个文件之前可能会请求文件的修改时间。另一方面,robots.txt文件通常很小,所以在此获取整个文档的开销并不昂贵。 

  • 相关阅读:
    uva10986 堆优化单源最短路径(pas)
    动态规划②——线性动态规划(背包)
    UVA567
    动态规划①——记忆化搜索
    网络号与主机号的区分与计算(转)
    故障处理-ORA-00376/ORA-01110
    Oracle的自动统计信息不收集直方图的信息
    Oracle 11g的Redo Log和Archive Log的分析方法
    SQL优化 1
    oracle 11g 通过在线重定义方式修改表结构
  • 原文地址:https://www.cnblogs.com/liuhui0308/p/12638354.html
Copyright © 2020-2023  润新知