美文网首页
4. Urllib -- urllib.robotparser

4. Urllib -- urllib.robotparser

作者: 江湖十年 | 来源:发表于2018-06-14 11:26 被阅读28次
    • 利用 urllib.robotparser 模块可以对网站的 Robots 协议进行分析
    • Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。robots.txt文件是一个文本文件,放在站点的根目录下。
    • 当一个搜索蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在,搜索机器人就会按照该文件中的内容来确定访问的范围;如果该文件不存在,所有的搜索蜘蛛将能够访问网站上所有没有被口令保护的页面。

    禁止所有爬虫访问任何内容

    User-Agent:  *
    Disallow:  /
    

    允许所有爬虫访问任何内容

    User-Agent:  *
    Disallow: 
    

    只允许爬虫访问 public/ 目录

    User-agent: *
    Disallow: /
    Allow: /public/
    

    允许某些爬虫访问某些目录

    User-agent:  Baiduspider
    Allow:  /article
    Allow:  /oshtml
    Disallow:  /product/
    Disallow:  /
    
    User-Agent:  Googlebot
    Allow:  /article
    Allow:  /oshtml
    Allow:  /product
    Allow:  /spu
    Allow:  /dianpu
    Allow:  /oversea
    Allow:  /list
    Disallow:  /
    
    User-Agent:  *
    Disallow:  /
    
    # 淘宝 robots 协议示例网址
    https://www.taobao.com/robots.txt
    
    • 关于爬虫名称
    爬虫名称 所属公司 网址
    Baiduspider 百度 www.baidu.com
    Googlebot 谷歌 www.google.com
    Bingbot 微软必应 cn.bing.com
    360Spider 360搜索 www.so.com
    Yisouspider 神马搜索 http://m.sm.cn/
    Sogouspider 搜狗搜索 https://www.sogou.com/
    Yahoo! Slurp 雅虎 https://www.yahoo.com/
    ... ... ...

    urllib.robotparser.RobotFileParser(url='')

    • robotpaser 模块提供一个类 RobotFileParser 专门用来解析 robots.txt,通过解析来判断是否允许爬取网站的某一目录

    • 使用时可以直接传入 url 即可

    urllib.robotparser.RobotFileParser(url='https://www.taobao.com/robots.txt')
    
    • 当然也可以在实例化的时候不传入 url,稍后通过 set_url() 方法传入也是可以的

    常用方法:

    • set_url(url):用来设置 robots.txt 文件链接,如果在初次实例化 RobotFileParser 类的时候传入了 url 参数,那么就不需要再次调用此方法设置了
    • read():读取 robots.txt 文件并将读取结果交给 parse() 解析器进行解析
    • parse(lines):用来解析 robots.txt 文件内容,分析传入的某些行的协议内容
    • can_fetch(useragent, url):需要两个参数,User-Agent、所要抓取的 URL 链接,返回此搜索引擎是否允许抓取此 URL,返回结果为 True、False
    • mtime():返回上次抓取分析 robots.txt 文件的时间,这对于需要对 robots.txt 进行定期检查更新的长时间运行的网络爬虫非常有用 。
    • modified():同样的对于长时间分析和抓取的搜索爬虫很有帮助,将当前时间设置为上次抓取和分析 robots.txt 的时间。
    • crawl_delay(useragent):返回抓取延迟时间的值,从相应的 User-Agent 的 robots.txt 返回 Crawl-delay 参数的值。 如果没有这样的参数,或者它不适用于指定的 User-Agent,或者此参数的 robots.txt 条目语法无效,则返回 None。
    • request_rate(useragent):从robots.txt返回Request-rate参数的内容,作为命名元组RequestRate(requests,seconds)。 如果没有这样的参数,或者它不适用于指定的useragent,或者此参数的robots.txt条目语法无效,则返回None。(Python3.6新增方法)

    关于 Request-rate 和 Crawl-delay 都是对爬虫爬取频率做限制的,知乎的 robots.txt 协议中就有这两个参数(https://www.zhihu.com/robots.txt),关于这两个参数可以参考知乎问答:https://www.zhihu.com/question/264161961/answer/278828570

    • 实例1:
    """
    分析知乎 Robots 协议
    """
    import urllib.robotparser
    
    
    rp = urllib.robotparser.RobotFileParser()
    
    # 设置 robots.txt 文件 URL
    rp.set_url('https://www.zhihu.com/robots.txt')
    
    # 读取操作必须有, 不然后面解析不到
    rp.read()
    
    # 判断网址是否运行爬取
    print(rp.can_fetch('Googlebot', 'https://www.zhihu.com/question/264161961/answer/278828570'))
    print(rp.can_fetch('*', 'https://www.zhihu.com/question/264161961/answer/278828570'))
    
    # 返回上次抓取分析 robots.txt 时间
    print(rp.mtime())
    
    # 将当前时间设置为上次抓取和分析 robots.txt 的时间
    rp.modified()
    print(rp.mtime())  # 再次打印时间会有变化
    
    # 返回 robots.txt 文件对请求速率限制的值
    print(rp.request_rate('*'))
    print(rp.request_rate('MSNBot').requests)
    
    # 返回 robotx.txt 文件对抓取延迟限制的值
    print(rp.crawl_delay('*'))
    print(rp.crawl_delay('MSNBot'))
    
    True
    False
    1525659777.562644
    1525659777.5746505
    None
    1
    None
    10
    
    • 实例2:
    """
    使用 parser() 方法执行读取和分析
    """
    import urllib.robotparser
    import urllib.request
    
    
    rp = urllib.robotparser.RobotFileParser()
    rp.parse(urllib.request.urlopen('https://www.zhihu.com/robots.txt').read().decode('utf-8').split('\n'))
    
    print(rp.can_fetch('Googlebot', 'https://www.zhihu.com/question/264161961/answer/278828570'))
    print(rp.can_fetch('*', 'https://www.zhihu.com/question/264161961/answer/278828570'))
    
    True
    False
    

    知乎 robots.txt 文件

    User-agent: Googlebot
    Disallow: /login
    Disallow: /logout
    Disallow: /resetpassword
    Disallow: /terms
    Disallow: /search
    Disallow: /notifications
    Disallow: /settings
    Disallow: /inbox
    Disallow: /admin_inbox
    Disallow: /*?guide*
    Disallow: /people/*
    
    User-agent: Googlebot-Image
    Disallow: /login
    Disallow: /logout
    Disallow: /resetpassword
    Disallow: /terms
    Disallow: /search
    Disallow: /notifications
    Disallow: /settings
    Disallow: /inbox
    Disallow: /admin_inbox
    Disallow: /*?guide*
    Disallow: /people/*
    
    User-agent: Baiduspider-news
    Disallow: /login
    Disallow: /logout
    Disallow: /resetpassword
    Disallow: /terms
    Disallow: /search
    Disallow: /notifications
    Disallow: /settings
    Disallow: /inbox
    Disallow: /admin_inbox
    Disallow: /*?guide*
    Disallow: /people/*
    
    User-agent: Baiduspider
    Disallow: /login
    Disallow: /logout
    Disallow: /resetpassword
    Disallow: /terms
    Disallow: /search
    Disallow: /notifications
    Disallow: /settings
    Disallow: /inbox
    Disallow: /admin_inbox
    Disallow: /*?guide*
    Disallow: /people/*
    
    User-agent: Baiduspider-image
    Disallow: /login
    Disallow: /logout
    Disallow: /resetpassword
    Disallow: /terms
    Disallow: /search
    Disallow: /notifications
    Disallow: /settings
    Disallow: /inbox
    Disallow: /admin_inbox
    Disallow: /*?guide*
    Disallow: /people/*
    
    User-agent: Sosospider
    Disallow: /login
    Disallow: /logout
    Disallow: /resetpassword
    Disallow: /terms
    Disallow: /search
    Disallow: /notifications
    Disallow: /settings
    Disallow: /inbox
    Disallow: /admin_inbox
    Disallow: /*?guide*
    Disallow: /people/*
    
    User-agent: bingbot
    Disallow: /login
    Disallow: /logout
    Disallow: /resetpassword
    Disallow: /terms
    Disallow: /search
    Disallow: /notifications
    Disallow: /settings
    Disallow: /inbox
    Disallow: /admin_inbox
    Disallow: /*?guide*
    Disallow: /people/*
    
    User-agent: 360Spider
    Disallow: /login
    Disallow: /logout
    Disallow: /resetpassword
    Disallow: /terms
    Disallow: /search
    Disallow: /notifications
    Disallow: /settings
    Disallow: /inbox
    Disallow: /admin_inbox
    Disallow: /*?guide*
    Disallow: /people/*
    
    User-agent: HaosouSpider 
    Disallow: /login
    Disallow: /logout
    Disallow: /resetpassword
    Disallow: /terms
    Disallow: /search
    Disallow: /notifications
    Disallow: /settings
    Disallow: /inbox
    Disallow: /admin_inbox
    Disallow: /*?guide*
    Disallow: /people/*
    
    User-agent: yisouspider
    Disallow: /login
    Disallow: /logout
    Disallow: /resetpassword
    Disallow: /terms
    Disallow: /search
    Disallow: /notifications
    Disallow: /settings
    Disallow: /inbox
    Disallow: /admin_inbox
    Disallow: /*?guide*
    Disallow: /people/*
    
    User-agent: YoudaoBot
    Disallow: /login
    Disallow: /logout
    Disallow: /resetpassword
    Disallow: /terms
    Disallow: /search
    Disallow: /notifications
    Disallow: /settings
    Disallow: /inbox
    Disallow: /admin_inbox
    Disallow: /*?guide*
    Disallow: /people/*
    
    User-agent: Sogou Orion spider
    Disallow: /login
    Disallow: /logout
    Disallow: /resetpassword
    Disallow: /terms
    Disallow: /search
    Disallow: /notifications
    Disallow: /settings
    Disallow: /inbox
    Disallow: /admin_inbox
    Disallow: /*?guide*
    Disallow: /people/*
    
    User-agent: Sogou News Spider
    Disallow: /login
    Disallow: /logout
    Disallow: /resetpassword
    Disallow: /terms
    Disallow: /search
    Disallow: /notifications
    Disallow: /settings
    Disallow: /inbox
    Disallow: /admin_inbox
    Disallow: /*?guide*
    Disallow: /people/*
    
    User-agent: Sogou blog
    Disallow: /login
    Disallow: /logout
    Disallow: /resetpassword
    Disallow: /terms
    Disallow: /search
    Disallow: /notifications
    Disallow: /settings
    Disallow: /inbox
    Disallow: /admin_inbox
    Disallow: /*?guide*
    Disallow: /people/*
    
    User-agent: Sogou spider2
    Disallow: /login
    Disallow: /logout
    Disallow: /resetpassword
    Disallow: /terms
    Disallow: /search
    Disallow: /notifications
    Disallow: /settings
    Disallow: /inbox
    Disallow: /admin_inbox
    Disallow: /*?guide*
    Disallow: /people/*
    
    User-agent: Sogou inst spider
    Disallow: /login
    Disallow: /logout
    Disallow: /resetpassword
    Disallow: /terms
    Disallow: /search
    Disallow: /notifications
    Disallow: /settings
    Disallow: /inbox
    Disallow: /admin_inbox
    Disallow: /*?guide*
    Disallow: /people/*
    
    User-agent: Sogou web spider
    Disallow: /login
    Disallow: /logout
    Disallow: /resetpassword
    Disallow: /terms
    Disallow: /search
    Disallow: /notifications
    Disallow: /settings
    Disallow: /inbox
    Disallow: /admin_inbox
    Disallow: /*?guide*
    Disallow: /people/*
    
    User-agent: EasouSpider
    Request-rate: 1/2 # load 1 page per 2 seconds
    Crawl-delay: 10
    Disallow: /login
    Disallow: /logout
    Disallow: /resetpassword
    Disallow: /terms
    Disallow: /search
    Disallow: /notifications
    Disallow: /settings
    Disallow: /inbox
    Disallow: /admin_inbox
    Disallow: /*?guide*
    Disallow: /people/*
    
    User-agent: MSNBot
    Request-rate: 1/2 # load 1 page per 2 seconds
    Crawl-delay: 10
    Disallow: /login
    Disallow: /logout
    Disallow: /resetpassword
    Disallow: /terms
    Disallow: /search
    Disallow: /notifications
    Disallow: /settings
    Disallow: /inbox
    Disallow: /admin_inbox
    Disallow: /*?guide*
    Disallow: /people/*
    
    User-Agent: *
    Disallow: /
    

    相关文章

      网友评论

          本文标题:4. Urllib -- urllib.robotparser

          本文链接:https://www.haomeiwen.com/subject/ctqjrftx.html