欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-10 13:12:06
1. urllib.request网络资源访问 robotparser为robots.txt文件格式实现一个解析器,提供了一个函数来检查给定的用户代理是否可以访问一个资源。这个模块可以用于合法蜘蛛或者需要抑制或限制的其他爬虫应用中。 1.1 robots.txt robots.txt文件格式是一个基 ......

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。

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

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文件。

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

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