一、爬虫协议

  与其它爬虫不同,全站爬虫意图爬取网站所有页面,由于爬虫对网页的爬取速度比人工浏览快几百倍,对网站服务器来说压力山大,很容易造成网站崩溃。 为了避免双输的场面,大家约定,如果网站建设者不愿意爬虫访问某些页面,他就按照约定的格式,把这些页面添加到 robots.txt 文件中,爬虫应该主动避免访问这些页面。除此之外,作为爬虫编写者也应该主动控制爬虫访问速度。

  访问 robots 协议的方式是:网站域名+'/robots.txt'。

二、处理爬虫协议

import urllib.robotparser

url = 'https://ai.baidu.com'
rp = urllib.robotparser.RobotFileParser()
rp.set_url(url + '/robots.txt')
rp.read()
info = rp.can_fetch("*", 'https://ai.baidu.com/product/minos')
print(info)

三、全站爬虫的基本架构

  爬虫从一个 URL 开始访问,通常是网站的域名,并将获得网页中的链接提取出来,去重后放入待访问列表。重复此操作,知道访问完网站内全部网页。

  需要注意的是,全站爬虫通常只爬取网站的内部链接

四、网页链接提取

from requests_html import HTMLSession
session = HTMLSession()
origin = 'https://ai.baidu.com'
r = session.get(origin)
print(r.html.links)

五、链接过滤

  使用 urllib 库过滤所有非内部链接,继续运行下面的代码,观察结果:

from urllib.parse import urlparse
from requests_html import HTMLSession
session = HTMLSession()
origin = 'https://ai.baidu.com'
r = session.get(origin)
print(r.html.links) domain = 'ai.baidu.com' def is_inner_link(link):
netloc = urlparse(link).netloc
return (not netloc) or (netloc == domain) for link in r.html.links:
print(is_inner_link(link), link)

  除了过滤非内部链接外,还需要把已经访问过的链接、爬虫协议不允许的链接 和 你不想访问的链接都过滤掉。

六、百度AI爬虫实现

from requests_html import HTMLSession
import urllib.robotparser
from urllib.parse import urlparse session=HTMLSession()
origin= 'https://www.xuexi.cn/'
domain=urlparse(origin).netloc def is_inner_link(link):
netloc=urlparse(link).netloc
return (not netloc) or (netloc==domain) visited = [] # 已访问链接列表
unvisited = [origin] # 待访问链接列表 # 解析爬虫协议
rp = urllib.robotparser.RobotFileParser()
rp.set_url(origin + '/robots.txt')
rp.read() def add_unvisited(link):
# 过滤1:判断爬虫协议是否允许
allow = rp.can_fetch('*', link)
if not allow:
return # 过滤2:判断是否为内链
if not is_inner_link(link):
return # 过滤3:去掉非法链接
path = urlparse(link).path
if not path.startswith('/'):
return # 过滤4:自定义过滤
if urlparse(link).path.startswith(('/file', '/docs', '/support', '/forum', '/broad', '/paddlepaddle', '/market',
'/download', '/facekit', '/sdk', '/customer', '/easydl', '//')):
return # 将 /tech/123 转换为 https://ai.baidu.com/tech/123 的形式
if link.startswith('/'):
link = origin + link # 过滤5:判断是否访问过,或已经添加到待访问列表
if (link in visited) or (link in unvisited):
return unvisited.append(link) while len(unvisited):
link=unvisited.pop() #用于移除列表中的一个元素
r=session.get(link)
visited.append(link)
if r.html and r.html.links and len(r.html.links):
for url in r.html.links:
add_unvisited(url) if r.html.find('head title')[0]:
print(r.html.find('head title')[0].text,link) print('共爬取{}个链接'.format(len(visited)))

百度AI搜索引擎的更多相关文章

  1. 百度AI认为最漂亮的中国女星是----范冰冰

    一.程序说明 1.1 程序说明 之前写调用百度AI接口的程序,然后刷到了两条明星的新闻,就想到了写个给明星颜值排下名的程序. 程序的关键点是两个,第一个是百度AI接口的调用这点其实直接使用早前实现的类 ...

  2. 百度AI开放平台- API实战调用

    百度AI开放平台- API实战调用 一.      前言 首先说一下项目需求. 两个用户,分别上传了两段不同的文字,要计算两段文字相似度有多少,匹配数据库中的符合条件的数据,初步估计列出来会有60-1 ...

  3. 百度AI技术QQ群

    百度语音QQ群 648968704 视频分析QQ群 632473158 DuerOSQQ群 604592023 图像识别QQ群 649285136 文字识别QQ群 631977213 理解与交互技术U ...

  4. 初探机器学习之使用百度AI服务实现图片识别与相似图片

    一.百度云AI服务 最近在调研一些云服务平台的AI(人工智能)服务,了解了一下阿里云.腾讯云和百度云.其中,百度云提供了图像识别及图像搜索,而且还细分地提供了相似图片这项服务,比较符合我的需求,且百度 ...

  5. 基于百度AI开放平台的人脸识别及语音合成

    基于百度AI的人脸识别及语音合成课题 课题需求 (1)人脸识别 在Web界面上传人的照片,后台使用Java技术接收图片,然后对图片进行解码,调用云平台接口识别人脸特征,接收平台返回的人员年龄.性别.颜 ...

  6. 人工智能-调百度AI接口+图灵机器人

    1.登陆百度AI的官网 1.注册:没有账号注册 2.创建应用 3.创建应用 4.查看应用的ID 5.Python代码 from aip import AipSpeech APP_ID = " ...

  7. PHP百度AI的OCR图片文字识别

    第一步可定要获取百度的三个东西 要到百度AI网站(http://ai.baidu.com/)去注册 然后获得 -const APP_ID = '请填写你的appid'; -const API_KEY ...

  8. Python通过百度Ai识别图片中的文字

    版本:python3.7 工作中有需要识别图片中的汗字,查看了半天大神们的博客,但没找到完全可以用的源码,经过自己的实践,以下源码可以实现: 创建应用 首先你需要登录百度AI,选择文字识别,创建一个应 ...

  9. java通过百度AI开发平台提取身份证图片中的文字信息

    废话不多说,直接上代码... IdCardDemo.java package com.wulss.baidubce; import java.io.BufferedReader; import jav ...

随机推荐

  1. N - Asteroids

    Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape of an N x N g ...

  2. 使用soap遇到的缓存问题

  3. hibernate08--OpenSessionInView

    创建一个web项目,然后生成HibernateSessionFactory文件! package cn.bdqn.util; import org.hibernate.HibernateExcepti ...

  4. PHP7.1安装xdebug

    一.前言1. Xdebug 简介Xdebug 是一个开放源代码的 PHP 程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况.当前最新版本为 Xdebug 2.5.0. ...

  5. kafka的一些参数

    参考文档: https://blog.csdn.net/fengzheku/article/details/50585972 http://kafka.apache.org/documentation ...

  6. linux--- python3环境部署篇

    环境部署 我们在pycharm上都是自己设置的python3解释器的环境变量,使得代码能够正常执行!可是怎么能让我们的python代码在LINUX上跑起来呢? linux是内置python,可是内置的 ...

  7. 2018-2019-2 网络对抗技术 20165318 Exp2 后门原理与实践

    2018-2019-2 网络对抗技术 20165318 Exp2 后门原理与实践 后门的基本概念及基础问题回答 常用后门工具 netcat Win获得Linux Shell Linux获得Win Sh ...

  8. Spark Streaming实战演练

    一.spark streaming简介 Streaming是一种数据传输技术,它把客户机收到的数据变成一个稳定连续的流,源源不断的输出,使用户听到的声音和图像十分稳定,而用户在整个文件传输完成开始前就 ...

  9. ES6 数组

    数组创建 Array.of() 将参数中所有值作为元素形成数组. console.log(Array.of(1, 2, 3, 4)); // [1, 2, 3, 4] // 参数值可为不同类型 con ...

  10. CSS弹性盒布局(display:flex)

    CSS弹性布局(display:flex) 参考: http://www.runoob.com/w3cnote/flex-grammar.html https://www.jianshu.com/p/ ...