美文网首页Python爬虫
人生不得已——Python爬虫 robots协议

人生不得已——Python爬虫 robots协议

作者: 阿猫阿狗py | 来源:发表于2018-11-03 16:27 被阅读9次

关于robots协议

Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。

Robots协议是国际互联网界通行的道德规范,基于以下原则建立:1、搜索技术应服务于人类,同时尊重信息提供者的意愿,并维护其隐私权;2、网站有义务保护其使用者的个人信息和隐私不被侵犯。

Robots协议用来告知搜索引擎哪些页面能被抓取,哪些页面不能被抓取;可以屏蔽一些网站中比较大的文件,如:图片,音乐,视频等,节省服务器带宽;可以屏蔽站点的一些死链接。方便搜索引擎抓取网站内容;设置网站地图连接,方便引导蜘蛛爬取页面。

robots.txt文件应该放置在网站根目录下。举例来说,当spider访问一个网站时,首先会检查该网站中是否存在robots.txt这个文件,如果 Spider找到这个文件,它就会根据这个文件的内容,来确定它访问权限的范围。

如今,在中国国内互联网行业,正规的大型企业也都将Robots协议当做一项行业标准,国内使用Robots协议最典型的案例,就是淘宝网拒绝百度搜索、京东拒绝一淘搜索。不过,绝大多数中小网站都需要依靠搜索引擎来增加流量,因此通常并不排斥搜索引擎,也很少使用Robots协议。

robots语法

语法 描述
User-agent: * 这里的代表的所有的搜索引擎种类,是一个通配符
Disallow: /admin/ 这里定义是禁止爬寻admin目录下面的目录
Disallow: /require/ 这里定义是禁止爬寻require目录下面的目录
Disallow: /ABC/ 这里定义是禁止爬寻ABC目录下面的目录
Disallow: /cgi-bin/*.htm 禁止访问/cgi-bin/目录下的所有以".htm"为后缀的URL(包含子目录)。
Disallow: /? 禁止访问网站中所有包含问号 (?) 的网址
Disallow: /.jpg$ 禁止抓取网页所有的.jpg格式的图片
Disallow:/ab/adc.html 禁止爬取ab文件夹下面的adc.html文件。
Allow: /cgi-bin/ 这里定义是允许爬寻cgi-bin目录下面的目录
Allow: /tmp 这里定义是允许爬寻tmp的整个目录
Allow: .htm$ 仅允许访问以".htm"为后缀的URL。
Allow: .gif$ 允许抓取网页和gif格式图片Sitemap: 网站地图 告诉爬虫这个页面是网站地图

解析robot

用法:
1、rp = robotparser.RobotFileParser() 获取一个解析器对象。
2、rp.set_url("robot file url") 设置robot文件的地址。
3、rp.read() 从网上下载robot文件。
4、rp.can_fetch(user_agent, url) 返回某个user_agent是否有url的访问权限,若无权限,则不能爬取该url。

import urllib.request
import urllib.parse
import re
import urllib.robotparser


def download(url, headers={}, retryCount=5):
    """
    下载页面
    :param url: 要下载的链接
    :param headers: 伪造头
    :param retryCount: 如果是服务器错误,需要尝试的次数
    :return:
    """
    # 请求头对象
    request = urllib.request.Request(url, headers=headers)

    try:
        # 返回数据
        response = urllib.request.urlopen(request)
    except urllib.error.URLError as e:
        # 判断是否为服务器错误
        if hasattr(e, 'code') and 500 <= e.code < 600:
            # 重试几次
            if retryCount > 0:
                return download(url, headers, retryCount-1)
            # 最终下载失败
            return None
    return response.read()


def get_link(html):
    """
    得到页面中的链接
    :param html: 页面数据
    :return: 返回链接列表
    """
    webpage_regex = re.compile('<a[^>]+href=["\'](.*?)["\']', re.IGNORECASE)
    return webpage_regex.findall(html)


def link_spider(start_link, link_regex):
    """
    链接爬虫函数
    :param start_link: 开始下载的链接
    :param link_regex: 需要的部分链接
    :return:
    """
    # 等待下载的链接的列表
    wait_download_link = [start_link]
    # 解析链接,分析域名
    urlObj = urllib.parse.urlparse(start_link)
    
    
    # 判断是否满足robot协议,获取一个解析器对象
    rp = urllib.robotparser.RobotFileParser()
    # 设置robot文件的地址
    rp.set_url('http://127.0.0.1:8080/robots.txt')
    # 从网上下载robot文件
    rp.read()
    
    
    
    # 定义一个集合,用来过滤掉重复的链接
    crawled_link = set()
    while wait_download_link:
        # 从所有等待下载的连接列表中弹出一个链接
        url = wait_download_link.pop()
            
            
        # 返回某个user-agent是否有url的访问权限,若没有权限,则不能爬取
        if rp.can_fetch('myspider', url):
            # 下载url链接的页面
            html = download(url)
           # 如果没有页面数据,则跳出本次循环重新开始
            if html is None:
                continue
            # 将下载过的链接放入已经下载过的链接集合中
            crawled_link.add(url)
            # 利用正则表达式筛选出页面所有的链接
            all_link = get_link(html.decode('utf-8'))
            # 遍历链接
            for link in all_link:
                # 筛选出自己需要的链接
                if re.match(link_regex, link):
                    # 得到完整的有用链接
                    realUrl = urlObj.scheme + '://' + urlObj.netloc + link
                    # 判断链接是否已经下载过
                    if realUrl not in crawled_link:
                        wait_download_link.append(realUrl)
        else:
            print('不能爬取该网页!!')
            continue


link_spider('http://127.0.0.1:8080/places/default/index', '/places/default/view/|/places/default/index/')

相关文章

  • 人生不得已——Python爬虫 robots协议

    关于robots协议 Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots ...

  • 亚马逊robots协议解析

    1.robots协议 Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots ...

  • 网络爬虫排除标准——robots协议

    Robots协议 “网络爬虫排除标准”(Robots Exclusion Protocol)也称为爬虫协议、机器人...

  • Robots协议

    好的网络爬虫,首先需要遵守Robots协议。Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除...

  • 认识robots协议

    robots协议的作用: Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robot...

  • 关于购物网站及网页小游戏的robots协议

    Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion P...

  • robots

    Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion P...

  • 谷歌:爬虫协议与标准规范

    Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion P...

  • Robots.txt详解

    Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion P...

  • 亚马逊 robots.txt 文件解析

    一、robots协议 robots协议,也称爬虫协议,网站会在 robots.txt 文件中声明哪些内容可以爬取,...

网友评论

    本文标题:人生不得已——Python爬虫 robots协议

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