关于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/')
网友评论