上一篇文章: Python3网络爬虫实战---1六、Web网页基础
下一篇文章: Python3网络爬虫实战---1八、Session和Cookies
爬虫,即网络爬虫,咱们能够把互联网就比做一张大网,而爬虫即是在网上爬行的蜘蛛,咱们能够把网的节点比作一个个网页,爬虫爬到这就至关于访问了该页面获取了其信息,节点间的连线能够比作网页与网页之间的连接关系,这样蜘蛛经过一个节点后能够顺着节点连线继续爬行到达下一个节点,即经过一个网页继续获取后续的网页,这样整个网的节点即可以被蜘蛛所有爬行到,这样网站的数据就能够被抓取下来了。html
可能上面的说明仍是难以具体地描述爬虫到底是个什么,简单来讲,爬虫就是获取网页并提取和保存信息的自动化程序,接下来对各个点进行说明:前端
爬虫首先要作的工做就是获取网页,在这里获取网页即获取网页的源代码,源代码里面必然包含了网页的部分有用的信息,因此只要把源代码获取下来了,就能够从中提取咱们想要的信息了。正则表达式
在前面咱们讲到了 Request 和 Response 的概念,咱们向网站的服务器发送一个 Request,返回的 Response 的 Body 即是网页源代码。因此最关键的部分就是构造一个 Request 并发送给服务器,而后接收到 Response 并将其解析出来,那这个流程能够怎样来实现呢?总不能手工去截取网页源码把?数据库
不用担忧,Python 里面提供了许多库来帮助咱们实现这个操做,如 Urllib、Requests 等,咱们能够用这些库来帮助咱们实现 HTTP 请求操做,Request 和 Response 均可以用类库提供的数据结构来表示,获得 Response 以后只须要解析数据结构中的 Body 部分便可,即获得网页的源代码,这样咱们能够用程序来实现获取网页的过程了。
提取信息segmentfault
咱们在第一步获取了网页源代码以后,接下来的工做就是分析网页源代码,从中提取咱们想要的数据,首先最通用的方法即是采用正则表达式提取,这是一个万能的方法,可是在构造正则表达式的时候比较复杂且容易出错。浏览器
另外因为网页的结构是有必定规则的,因此还有一些根据网页节点属性、CSS 选择器或 XPath 来提取网页信息的库,如 BeautifulSoup、PyQuery、LXML 等,使用这些库能够高效快速地从中提取网页信息,如节点的属性、文本值等内容。服务器
提取信息是爬虫很是重要的部分,它可使杂乱的数据变得清晰条理,以便于咱们后续在对数据进行处理和分析。网络
提取信息以后咱们通常会将提取到的数据保存到某处以便后续数据处理使用。保存形式有多种多样,如能够简单保存为 TXT 文本或 Json 文本,也能够保存到数据库,如 MySQL、MongoDB 等,也可保存至远程服务器,如借助 Sftp 进行操做等。数据结构
说到自动化程序,意思便是说爬虫能够代替人来完成这些操做。首先咱们手工固然是能够提取这些信息的,可是当量特别大或者想快速获取大量数据的话,确定仍是借助于程序。因此爬虫就是代替咱们来完成这份爬取数据的工做的自动化程序,它能够在抓取过程当中进行各类异常处理、错误重试等操做,确保爬取持续高效地运行。并发
在网页中咱们能看到各类各样的信息,最多见的即是常规网页,其都对应着 HTML 代码,而最多见的抓取即是抓取 HTML 源代码。
另外可能有些网页返回的不是 HTML 代码,而是返回一个 Json 字符串,API 接口大多采用这样的形式,方便数据的传输和解析,这种数据一样能够抓取,并且数据提取更加方便。
此外咱们还能够看到各类二进制数据,如图片、视频、音频等等,咱们能够利用爬虫将它们的二进制数据抓取下来,而后保存成对应的文件名便可。
另外咱们还能够看到各类扩展名的文件,如 CSS、JavaScript、配置文件等等,这些其实也是最普通的文件,只要在浏览器里面访问到,咱们就能够将其抓取下来。
以上的内容其实都对应着各自的URL,是基于 HTTP 或 HTTPS 协议的,只要是这种数据爬虫均可以进行抓取。
有时候咱们在用 Urllib 或 Requests 抓取网页时,获得的源代码实际和浏览器中看到的是不同的。
这个问题是一个很是常见的问题,如今网页愈来愈多地采用 Ajax、前端模块化工具来构建网页,整个网页可能都是由 JavaScript 渲染出来的,意思就是说原始的 HTML 代码就是一个空壳,例如:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>This is a Demo</title> </head> <body> <div id="container"> </div> </body> <script src="app.js"></script> </html>
body 节点里面只有一个 id 为 container 的节点,可是注意到在 body 节点后引入了一个 app.js,这个便负责了整个网站的渲染。
在浏览器打开这个页面时,首先会加载这个 HTML 内容,接着浏览器会发现其中里面引入了一个 app.js 文件,而后浏览器便会接着去请求这个文件,获取到该文件以后便会执行其中的 JavaScript 代码,而 JavaScript 则会改变 HTML 中的节点,向内添加内容,最后获得完整的页面。
可是在用 Urllib 或 Requests 等库来请求当前页面时,咱们获得的只是这个 HTML 代码,它不会帮助咱们去继续加载这个 JavaScript 文件,这样也就看不到浏览器中看到的内容了。
这也解释了为何有时咱们获得的源代码和浏览器中看到的是不同的。
因此使用基本 HTTP 请求库获得的结果源代码可能跟浏览器中的页面源代码不太同样。对于这样的状况,咱们能够分析其后台 Ajax 接口,也可以使用 Selenium、Splash 这样的库来实现模拟 JavaScript 渲染,这样咱们即可以爬取 JavaScript 渲染的网页的内容了。
在后文咱们会详细介绍对于 JavaScript 渲染的网页的采集方法。
本节介绍了爬虫的一些基本原理,了解了如上内容能够帮助咱们在后面编写爬虫的时候更加驾轻就熟。
上一篇文章: Python3网络爬虫实战---1六、Web网页基础
下一篇文章: Python3网络爬虫实战---1八、Session和Cookies