首先,「爬虫」到底是什么?我们又可以用「爬虫」来做什么呢?
「爬虫」(又叫蜘蛛、网络机器人),是一种按照一定规则,自动地抓取网络信息的程序或者脚本,它另外还有一些不常使用的名字:蚂蚁、自动索引、模拟程序、蠕虫。
从本质上来说,「爬虫」就是利用自动化程序从网上获取我们需要的数据。
我们常用的百度,就是一个很大的「爬虫」。你有没有想过为什么百度搜索会这么强大?
这是因为百度会把各个网站的数据爬取下来,存储在自己的服务器上。
而检索之后会得到一些超链接,点击各个超链接跳转,就可以访问其他网站了。
如今正是互联网高速发展时期,「大数据」这个词你应该都不陌生了。那什么是「大数据」呢?
「大数据」是一个体量巨大,数据类别巨大的数据集。
亚马逊网络服务(AWS)的「大数据」科学家JohnRauser,给「大数据」的定义是这样的“大数据就是任何超过了一台计算机处理能力的庞大数据量。”
「大数据」与「爬虫」之间的关系非常密切,「爬虫」可以从庞大的数据中,获取对我们有价值的数据。
1、用户界面(User Interface)
(1)用户界面主要包括工具栏、地址栏、前进/后退按钮、书签菜单、可视化页面加载进度、智能下载处理、首选项、打印等。除了浏览器主窗口显示请求的页面之外,其他显示的部分都属于用户界面。
(2)用户界面还可以与桌面环境集成,以提供浏览器会话管理或与其他桌面应用程序的通信。
2、浏览器引擎(Browser Engine)
(1)浏览器引擎是一个可嵌入的组件,其为渲染引擎提供高级接口。
(2)浏览器引擎可以加载一个给定的URI,并支持诸如:前进/后退/重新加载等浏览操作。
(3)浏览器引擎提供查看浏览会话的各个方面的挂钩,例如:当前页面加载进度、JavaScript alert。
(4)浏览器引擎还允许查询/修改渲染引擎设置。
3、渲染引擎(Rendering Engine)
(1)渲染引擎为指定的URI生成可视化的表示。
(2)渲染引擎能够显示【HTML】和【XML】文档,可选择【CSS】样式,以及嵌入式内容(如图片)。
(3)渲染引擎能够准确计算页面布局,可使用“回流”算法逐步调整页面元素的位置。
(4)渲染引擎内部包含【HTML】解析器。
4、网络(Networking)
(1)网络系统实现【HTTP】和【FTP】等文件传输协议。 网络系统可以在不同的字符集之间进行转换,为文件解析【MIME】媒体类型。
网络系统可以实现最近检索资源的缓存功能。5、JavaScript解释器(JavaScript Interpreter)
(1)【JavaScript】解释器能够解释并执行嵌入在网页中的【JavaScript】(又称ECMAScript)代码。
为了安全起见,浏览器引擎或渲染引擎可能会禁用某些JavaScript功能,如弹出窗口的打开。6、XML解析器(XML Parser)
(1)【XML】解析器可以将【XML】文档解析成文档对象模型(Document Object Model,DOM)树。
(2)【XML】解析器是浏览器架构中复用最多的子系统之一,几乎所有的浏览器实现都利用现有的XML解析器,而不是从头开始创建自己的【XML】解析器。
7、显示后端(Display Backend)
(1)显示后端提供绘图和窗口原语,包括:用户界面控件集合、字体集合。
8、数据持久层(Data Persistence)
(1)数据持久层将与浏览会话相关联的各种数据存储在硬盘上。
这些数据可能是诸如:书签、工具栏设置等这样的高级数据,也可能是诸如:Cookie,安全证书、缓存等这样的低级数据。这里可能会产生一个疑问:功能相似的【HTML】解析器和【XML】解析器为什么前者划分在渲染引擎中,后者作为独立的系统?
原因:【XML】解析器对于系统来说,其功能并不是关键性的,但是从复用角度来说,【XML】解析器是一个通用的,可重用的组件,具有标准的,定义明确的接口。相比之下,【HTML】解析器通常与渲染引擎紧耦合。
当然,这些内容并不需要记忆,只要有大概的了解就行啦!
现在我们已经知道了浏览器的组成,那么浏览器又是如何工作的呢?
这其中会涉及到3个对象,人、浏览器、服务器。
1、人通过浏览器输入想要访问的网址(url),而后,浏览器向服务器传递我们想访问的网页需求,这个过程叫做‘请求’。
2、服务器收到了‘请求’,将人想要的数据发送给浏览器,这个过程叫做‘响应’。
3、浏览器获取到‘响应’,这时浏览器如果直接将‘响应’的数据丢给人,那人是一脸懵逼的,因为我们之前学过编码相关的知识,这里不难理解,所以在这时浏览器会将‘响应’进行‘数据解析’。
4、人可以正常的浏览数据,获取自己需要的数据。
5、将自己需要的数据进行存储记录。
这就是人、浏览器、服务器之间的交流过程啦。
下面我们再来看看,「爬虫」的工作原理是怎样的~
request.get()
通过调用【requests】中的【get()】方法,我们可以向服务器发送请求,括号内可以传入一个【url】参数来决定访问的网址。
这里以17k小说网的小说《中国制造》【书号2665322】为例,通过【request.get()】获取一个章节的小说内容。
可以看到这里的url为:https://www.17k.com/chapter/2665322/30029793.html
而获得的响应内容,其实保存在了【response】变量里。
1、response.status_code: 检查响应的状态码
2、response.content: 将response对象转换为二进制数据
3、response.text: 获取response的文本数据
4、response.encoding: 设置response的编码
用【response.encoding = ‘utf-8’】将编码转换成【utf-8】。
「爬虫」在某种情况下会给目标服务器造成很大的压力,甚至导致服务器崩溃。
因此部分服务器运行商,会想方设法防止「爬虫」访问自己的服务器。
这里就需要谈到【robots】协议!
【robots】协议是国际互联网界通行的道德规范,基于以下原则建立:
1、搜索技术应服务于人类,同时尊重信息提供者的意愿,并维护其隐私权;
2、网站有义务保护其使用者的个人信息和隐私不被侵犯。
简单来说,它告诉网络搜索引擎的漫游器(也就是我们的「爬虫」),此网站中的哪些内容是不应被搜索引擎的漫游器获取的,哪些是可以被漫游器获取的。
查看一个网站的【robots】协议只需要在该网站首页后添加【/robots.txt】就可以了。
各个参数的含义:Allow:可以访问
Disallow:禁止访问
这里只截取了对【百度爬虫】和【谷歌爬虫】的爬取要求。
允许Baiduspider爬寻article、oshtml、wenzhang整个目录,禁止爬寻product目录下面的目录。其它禁止访问。
允许Googlebot爬寻article、oshtml、product、spu、dianpu、wenzhang、oversea整个目录。其它禁止访问。
遵守【robots】协议的前提下对应的爬虫只能获取到允许爬取的内容。
【robots】协议只是一个道德规范,并不是强制要求。
但你需要明白,「爬虫」是一把双刃剑,我们可以利用它获取有价值的信息、数据。
另一方面它可能对数据源服务器造成巨大压力,从而导致服务器崩溃。而开发者也可能因此受到法律的仲裁。
所以我们在满足自己数据要求时,也要为对方服务器考虑,避免造成严重后果。
正确请求17k小说首页内容。
url:https://www.17k.com/
2做法讲解 1、requests.get()请求,获取到response
2、转码utf-8
3、打印网页内容response.text
import requests
url = 'https://www.17k.com/'
response = requests.get(url)
response.encoding = 'utf-8'
a = response.text
print(a)