在这个大数据时期,尤其是人工智能浪潮兴起的时期,不论是工程领域还是研究领域,数据已经成为必不可少的一部分,而数据的获取很大程度上依赖于爬虫的爬取,以是爬虫变得越来越火爆。
什么是爬虫?
我们可以把互联网比作一张大网,而爬虫(即网络爬虫)便是在网上爬行的蜘蛛。把网的节点比作一个个网页,爬虫爬到这就相称于访问了该页面,获取了其信息。可以把节点间的连线比作网页与网页之间的链接关系,这样蜘蛛通过一个节点后,可以顺着节点连线连续爬行到达下一个节点,即通过一个网页连续获取后续的网页,这样全体网的节点便可以被蜘蛛全部爬行到,网站的数据就可以被抓取下来了。
怎么学爬虫?
在学习写爬虫之前,我们须要理解一些根本知识,如 HTTP 事理、网页的根本知识、爬虫的基本事理、Cookies 的基本事理等。本文,我们就对这些根本知识做一个大略的总结。
HTTP 基本事理在本节中,我们会详细理解 HTTP 的基本事理,理解在浏览器中敲入 URL 到获取网页内容之间发生了什么。理解了这些内容,有助于我们进一步理解爬虫的基本事理。
一、URI 和 URL
这里我们先理解一下 URI 和 URL,URI 的全称为 Uniform Resource Identifier,即统一资源标志符,URL 的全称为 Universal Resource Locator,即统一资源定位符。
举例来说,https://github.com/favicon.ico 是 GitHub 的网站图标链接,它是一个 URL,也是一个URI。即有这样的一个图标资源,我们用 URL/URI 来唯一指定了它的访问办法,这个中包括了访问协议 https、访问路径(/即根目录)和资源名称 favicon.ico。通过这样一个链接,我们便可以从互联网上找到这个资源,这便是 URL/URI。
URL 是 URI 的子集,也便是说每个 URL 都是 URI,但不是每个 URI 都是 URL。那么,若何的URI 不是 URL 呢?URI 还包括一个子类叫作 URN,它的全称为 Universal Resource Name,即统一资源名称。URN 只命名资源而不指定如何定位资源,比如 urn:isbn:0451450523 指定了一本书的 ISBN,可以唯一标识这本书,但是没有指定到哪里定位这本书,这便是 URN。URL、URN 和 URI 的关系可以用图 1 表示。
图1 URL、URN 和URI 关系图
但是在目前的互联网中,URN 用得非常少,以是险些所有的 URI 都是 URL,一样平常的网页链接我们既可以称为 URL,也可以称为 URI,我个人习气称为 URL。
二、超文本
接下来,我们再理解一个观点——超文本,其英文名称叫作 hypertext,我们在浏览器里看到的网页便是超文本解析而成的,其网页源代码是一系列 HTML 代码,里面包含了一系列标签,比如 img 显示图片,p 指定显示段落等。浏览器解析这些标签后,便形成了我们平常看到的网页,而网页的源代码 HTML 就可以称作超文本。
例如,我们在 Chrome 浏览器里面打开任意一个页面,如淘宝首页,右击任一地方并选择“检讨”项(或者直接按快捷键 F12),即可打开浏览器的开拓者工具,这时在 Elements 选项卡即可看到当前网页的源代码,这些源代码都是超文本,如图 2 所示。
图2 源代码
三、HTTP 和HTTPS
在淘宝的首页https://www.taobao.com/中,URL 的开头会有http 或https,这便是访问资源须要的协议类型。有时,我们还会看到ftp、sftp、smb 开头的URL,它们都是协议类型。在爬虫中,我们抓取的页面常日便是http 或https 协议的,这里首先理解一下这两个协议的含义。
HTTP 的全称是Hyper Text Transfer Protocol,中文名叫作超文本传输协议。HTTP 协议是用于从网络传输超文本数据到本地浏览器的传送协议,它能担保高效而准确地传送超文本文档。HTTP 由万维网协会(World Wide Web Consortium)和Internet 事情小组IETF(Internet Engineering Task Force)共同互助制订的规范,目前广泛利用的是HTTP 1.1 版本。
HTTPS 的全称是Hyper Text Transfer Protocol over Secure Socket Layer,因此安全为目标的HTTP通道,大略讲是HTTP 的安全版,即HTTP 下加入SSL 层,简称为HTTPS。
HTTPS 的安全根本是SSL,因此通过它传输的内容都是经由SSL 加密的,它的紧张浸染可以分为两种。
建立一个信息安全通道来担保数据传输的安全确认网站的真实性,凡是利用了HTTPS 的网站,都可以通过点击浏览器地址栏的锁头标志来查看网站认证之后的真实信息,也可以通过CA 机构颁发的安全签章来查询现在越来越多的网站和App 都已经向HTTPS 方向发展,例如:
苹果公司逼迫所有iOS App 在2017 年1 月1 日前全部改为利用HTTPS 加密,否则App 就无法在运用商店上架谷歌从2017 年1 月推出的Chrome 56 开始,对未进行HTTPS 加密的网址链接亮出风险提示,即在地址栏的显著位置提醒用户“此网页不屈安”腾讯微信小程序的官方需求文档哀求后台利用HTTPS 要求进行网络通信,不知足条件的域名和协议无法要求而某些网站虽然利用了HTTPS 协议,但还是会被浏览器提示不屈安,例如我们在Chrome 浏览器里面打开12306,链接为:https://www.12306.cn/,这时浏览器就会提示“您的连接不是私密连接”这样的话,如图3 所示。
图3 12306 页面
这是由于12306 的CA 证书是中国铁道部自行签发的,而这个证书是不被CA 机构信赖的,以是这里证书验证就不会通过而提示这样的话,但是实际上它的数据传输依然是经由SSL 加密的。如果要爬取这样的站点,就须要设置忽略证书的选项,否则会提示SSL 链接缺点。
四、HTTP 要求过程
我们在浏览器中输入一个URL,回车之后便会在浏览器中不雅观察到页面内容。实际上,这个过程是浏览器向网站所在的做事器发送了一个要求,网站做事器吸收到这个要求后进行处理和解析,然后返回对应的相应,接着传回给浏览器。相应里包含了页面的源代码等内容,浏览器再对其进行解析,便将网页呈现了出来,模型如图4 所示。
图4 模型图
此处客户端即代表我们自己的PC 或手机浏览器,做事器即要访问的网站所在的做事器。
为了更直不雅观地解释这个过程,这里用Chrome 浏览器的开拓者模式下的Network 监听组件来做下演示,它可以显示访问当前要求网页时发生的所有网络要乞降相应。
打开Chrome 浏览器,右击并选择“检讨”项,即可打开浏览器的开拓者工具。这里访问百度http://www.baidu.com/,输入该URL 后回车,不雅观察这个过程中发生了若何的网络要求。可以看到,在Network 页面下方涌现了一个个的条款,个中一个条款就代表一次发送要乞降吸收相应的过程,如图5 所示。
图5 Network 面板
我们先不雅观察第一个网络要求,即www.baidu.com。
个中各列的含义如下。
第一列Name:要求的名称,一样平常会将URL 的末了一部分内容当作名称。第二列Status:相应的状态码,这里显示为200,代表相应是正常的。通过状态码,我们可以判断发送了要求之后是否得到了正常的相应。第三列Type:要求的文档类型。这里为document,代表我们这次要求的是一个HTML文档,内容便是一些HTML 代码。第四列Initiator:要求源。用来标记要求是由哪个工具或进程发起的。第五列Size:从做事器下载的文件和要求的资源大小。如果是从缓存中取得的资源,则该列会显示from cache。第六列Time:发起要求到获取相应所用的总韶光。第七列Waterfall:网络要求的可视化瀑布流。点击这个条款,即可看到更详细的信息,如图6 所示。
图6 详细信息
首先是General 部分,Request URL 为要求的URL,Request Method 为要求的方法,Status Code为相应状态码,Remote Address 为远程做事器的地址和端口,Referrer Policy 为Referrer 判别策略。
再连续往下,可以看到,有Response Headers 和Request Headers,这分别代表相应头和要求头。要求头里带有许多要求信息,例如浏览器标识、Cookies、Host 等信息,这是要求的一部分,做事器会根据要求头内的信息判断要求是否合法,进而作出对应的相应。图中看到的Response Headers 便是相应的一部分,例如个中包含了做事器的类型、文档类型、日期等信息,浏览器接管到相应后,会解析相应内容,进而呈现网页内容。
下面我们分别来先容一下要乞降相应都包含哪些内容。
五、要求
要求,由客户端向做事端发出,可以分为4 部分内容:要求方法(Request Method)、要求的网址(Request URL)、要求头(Request Headers)、要求体(Request Body)。
1. 要求方法
常见的要求方法有两种:GET 和POST。
在浏览器中直接输入URL 并回车,这便发起了一个GET 要求,要求的参数会直接包含到URL里。例如,在百度中搜索Python,这便是一个GET 要求,链接为https://www.baidu.com/s?wd=Python,个中URL 中包含了要求的参数信息,这里参数wd 表示要征采的关键字。POST 要求大多在表单提交时发起。比如,对付一个登录表单,输入用户名和密码后,点击“登录”按钮,这常日会发起一个POST要求,其数据常日以表单的形式传输,而不会表示在URL 中。
GET 和POST 要求方法有如下差异。
GET 要求中的参数包含在URL 里面,数据可以在URL 中看到,而POST 要求的URL 不会包含这些数据,数据都是通过表单形式传输的,会包含在要求体中GET 要求提交的数据最多只有1024 字节,而POST 办法没有限定一样平常来说,登录时,须要提交用户名和密码,个中包含了敏感信息,利用GET 办法要求的话,密码就会暴露在URL 里面,造成密码透露,以是这里最好以POST 办法发送。上传文件时,由于文件内容比较大,也会选用POST 办法。
我们平常碰着的绝大部分要求都是GET 或POST 要求,其余还有一些要求方法,如GET、HEAD、POST、PUT、DELETE、OPTIONS、CONNECT、TRACE 等,我们大略将其总结为表1。
表1 其他要求方法
本表参考:http://www.runoob.com/http/http-methods.html。
2. 要求的网址
要求的网址,即统一资源定位符URL,它可以唯一确定我们想要求的资源。
3. 要求头
要求头,用来解释做事器要利用的附加信息,比较主要的信息有Cookie、Referer、User-Agent 等。下面简要解释一些常用的头信息。
Accept:要求报头域,用于指定客户端可接管哪些类型的信息Accept-Language:指定客户端可接管的措辞类型Accept-Encoding:指定客户端可接管的内容编码Host:用于指定要求资源的主机IP 和端口号,其内容为要求URL 的原始做事器或网关的位置。从HTTP 1.1 版本开始,要求必须包含此内容Cookie:也常用复数形式 Cookies,这是网站为了辨别用户进行会话跟踪而存储在用户本地的数据。它的紧张功能是坚持当前访问会话。例如,我们输入用户名和密码成功登录某个网站后,做事器会用会话保存登录状态信息,后面我们每次刷新或要求该站点的其他页面时,会创造都是登录状态,这便是Cookies 的功劳。Cookies 里有信息标识了我们所对应的做事器的会话,每次浏览器在要求该站点的页面时,都会在要求头中加上Cookies 并将其发送给做事器,做事器通过Cookies 识别出是我们自己,并且查出当前状态是登录状态,以是返回结果便是登录之后才能看到的网页内容Referer:此内容用来标识这个要求是从哪个页面发过来的,做事器可以拿到这一信息并做相应的处理,如做来源统计、防盗链处理等User-Agent:简称UA,它是一个分外的字符串头,可以使做事器识别客户利用的操作系统及版本、浏览器及版本等信息。在做爬虫时加上此信息,可以伪装为浏览器;如果不加,很可能会被识别出为爬虫Content-Type:也叫互联网媒体类型(Internet Media Type)或者MIME 类型,在HTTP 协议头中,它用来表示详细要求中的媒体类型信息。例如,text/html 代表HTML 格式,image/gif 代表GIF 图片,application/json 代表JSON 类型,更多对应关系可以查看此对照表:http://tool.oschina.net/commons因此,要求头是要求的主要组成部分,在写爬虫时,大部分情形下都须要设定要求头。
4. 要求体
要求体一样平常承载的内容是POST 要求中的表单数据,而对付GET 要求,要求体则为空。
例如,这里我登录GitHub 时捕获到的要乞降相应如图7 所示。
图7 详细信息
登录之前,我们填写了用户名和密码信息,提交时这些内容就会以表单数据的形式提交给做事器,此时须要把稳Request Headers 中指定Content-Type 为application/x-www-form-urlencoded。只有设置Content-Type 为application/x-www-form-urlencoded,才会以表单数据的形式提交。其余,我们也可以将Content-Type 设置为application/json 来提交JSON 数据,或者设置为multipart/form-data 来上传文件。表2 列出了Content-Type 和POST 提交数据办法的关系。
表2 Content-Type 和POST 提交数据办法的关系
在爬虫中,如果要布局POST 要求,须要利用精确的Content-Type,并理解各种要求库的各个参数设置时利用的是哪种Content-Type,不然可能会导致POST 提交后无法正常相应。
六、相应
相应,由做事端返回给客户端,可以分为三部分:相应状态码(Response Status Code)、相应头(Response Headers)和相应体(Response Body)。
1. 相应状态码
相应状态码表示做事器的相应状态,如200 代表做事器正常相应,404 代表页面未找到,500 代表做事器内部发生缺点。在爬虫中,我们可以根据状态码来判断做事器相应状态,如状态码为200,则证明成功返回数据,再进行进一步的处理,否则直接忽略。表3 列出了常见的缺点代码及缺点缘故原由。
表3 常见的缺点代码及缺点缘故原由
2. 相应头
相应头包含了做事器对要求的应答信息,如Content-Type、Server、Set-Cookie 等。下面简要解释一些常用的头信息。
Date:标识相应产生的韶光。Last-Modified:指定资源的末了修正韶光。Content-Encoding:指定相应内容的编码。Server:包含做事器的信息,比如名称、版本号等。Content-Type:文档类型,指定返回的数据类型是什么,如text/html 代表返回HTML 文档,application/x-javascript 则代表返回JavaScript 文件,image/jpeg 则代表返回图片。Set-Cookie:设置Cookies。相应头中的Set-Cookie 见告浏览器须要将此内容放在Cookies中,下次要求携带Cookies 要求。Expires:指定相应的过期韶光,可以使代理做事器或浏览器将加载的内容更新到缓存中。如果再次访问时,就可以直接从缓存中加载,降落做事器负载,缩短加载韶光。3. 相应体
最主要确当属相应体的内容了。相应的正文数据都在相应体中,比如要求网页时,它的相应体便是网页的HTML 代码;要求一张图片时,它的相应体便是图片的二进制数据。我们做爬虫要求网页后,要解析的内容便是相应体,如图8 所示。
图8 相应体内容
在浏览器开拓者工具中点击Preview,就可以看到网页的源代码,也便是相应体的内容,它是解析的目标。
在做爬虫时,我们紧张通过相应体得到网页的源代码、JSON 数据等,然后从中做相应内容的提取。
七、总结
上面,我们理解了HTTP 的基本事理,大概理解了访问网页时背后的要乞降相应过程。上面涉及的知识点须要好好节制,由于剖析网页要求时会常常用到。
网页根本用浏览器访问网站时,页面各不相同,你有没有想过它为何会呈现这个样子呢?下面,我们就来理解一下网页的基本组成、构造和节点等内容。
一、网页的组成
网页可以分为三大部分——HTML、CSS 和JavaScript。如果把网页比作一个人的话,HTML 相称于骨架,JavaScript 相称于肌肉,CSS 相称于皮肤,三者结合起来才能形成一个完善的网页。下面我们分别来先容一下这三部分的功能。
1. HTML
HTML 是用来描述网页的一种措辞,其全称叫作Hyper Text Markup Language,即超文本标记措辞。网页包括笔墨、按钮、图片和视频等各种繁芜的元素,其根本架构便是HTML。不同类型的笔墨通过不同类型的标签来表示,如图片用img 标签表示,视频用video 标签表示,段落用p 标签表示,它们之间的布局又常通过布局标签div 嵌套组合而成,各种标签通过不同的排列和嵌套才形成了网页的框架。
在Chrome 浏览器中打开百度,右击并选择“检讨”项(或按F12 键),打开开拓者模式,这时在Elements 选项卡中即可看到网页的源代码,如图9 所示。
图9 源代码
这便是HTML,全体网页便是由各种标签嵌套组合而成的。这些标签定义的节点元素相互嵌套和组合形成了繁芜的层次关系,就形成了网页的架构。
2. CSS
HTML 定义了网页的构造,但是只有HTML 页面的布局并不雅观观,可能只是大略的节点元素的排列,为了让网页看起来更好看一些,这里借助了CSS。
CSS,全称叫作Cascading Style Sheets,即层叠样式表。“层叠”是指当在HTML 中引用了数个样式文件,并且样式发生冲突时,浏览器能依据层叠顺序处理。“样式”指网页中笔墨大小、颜色、元素间距、排列等格式。
CSS 是目前唯一的网页页面排版样式标准,有了它的帮助,页面才会变得更为都雅。
上面图9 中右侧即为CSS,例如:
#head_wrapper.s-ps-islite .s-p-top {position: absolute;bottom: 40px;width: 100%;height: 181px;}
便是一个CSS 样式。大括号前面是一个CSS 选择器。此选择器的意思是首先选中id 为head_wrapper且class 为s-ps-islite 的节点,然后再选中其内部的class 为s-p-top 的节点。大括号内部写的便是一条条样式规则,例如position 指定了这个元素的布局办法为绝对布局,bottom 指定元素的下边距为40 像素,width 指定了宽度为100%占满父元素,height 则指定了元素的高度。也便是说,我们将位置、宽度、高度等样式配置统一写成这样的形式,然后用大括号括起来,接着在开头再加上CSS 选择器,这就代表这个样式对CSS 选择器选中的元素生效,元素就会根据此样式来展示了。
在网页中,一样平常会统一定义全体网页的样式规则,并写入CSS 文件中(其后缀为css)。在HTML中,只须要用link 标签即可引入写好的CSS 文件,这样全体页面就会变得都雅、优雅。
3. JavaScript
JavaScript,简称JS,是一种脚本措辞。HTML 和CSS 合营利用,供应给用户的只是一种静态信息,缺少交互性。我们在网页里可能会看到一些交互和动画效果,如下载进度条、提示框、轮播图等,这常日便是JavaScript 的功劳。它的涌现使得用户与信息之间不但是一种浏览与显示的关系,而是实现了一种实时、动态、交互的页面功能。
JavaScript 常日也因此单独的文件形式加载的,后缀为js,在HTML 中通过script 标签即可引入,例如:
<script src=\"大众jquery-2.1.0.js\"大众></script>
综上所述,HTML 定义了网页的内容和构造,CSS 描述了网页的布局,JavaScript 定义了网页的行为。
二、网页的构造
我们首先用例子来感想熏染一下HTML 的基本构造。新建一个文本文件,名称可以自取,后缀为html,内容如下:
<!DOCTYPE html><html><head><meta charset=\公众UTF-8\公众><title>This is a Demo</title></head><body><div id=\"大众container\"大众><div class=\"大众wrapper\"大众><h2 class=\"大众title\"大众>Hello World</h2><p class=\"大众text\"大众>Hello, this is a paragraph.</p></div></div></body></html>
这便是一个最大略的HTML 实例。开头用DOCTYPE 定义了文档类型,其次最外层是html 标签,末了还有对应的结束标签来表示闭合,其内部是head 标签和body 标签,分别代表网页头和网页体,它们也须要结束标签。head 标签内定义了一些页面的配置和引用,如:
<meta charset=\"大众UTF-8\公众>
它指定了网页的编码为UTF-8。
title 标签则定义了网页的标题,会显示在网页的选项卡中,不会显示在正文中。body 标签内则是在网页正文中显示的内容。div 标签定义了网页中的区块,它的id 是container,这是一个非常常用的属性,且id 的内容在网页中是唯一的,我们可以通过它来获取这个区块。然后在此区块内又有一个div 标签,它的class 为wrapper,这也是一个非常常用的属性,常常与CSS 合营利用来设定样式。然后此区块内部又有一个h2 标签,这代表一个二级标题。其余,还有一个p 标签,这代表一个段落。在这两者中直接写入相应的内容即可在网页中呈现出来,它们也有各自的class 属性。
将代码保存后,在浏览器中打开该文件,可以看到如图10 所示的内容。
图10 运行结果
可以看到,在选项卡上显示了This is a Demo 字样,这是我们在head 中的title 里定义的笔墨。而网页正文是body 标签内部定义的各个元素天生的,可以看到这里显示了二级标题和段落。
这个实例便是网页的一样平常构造。一个网页的标准形式是html 标签内嵌套head 和body 标签,head内定义网页的配置和引用,body 内定义网页的正文。
三、节点树及节点间的关系
在HTML 中,所有标签定义的内容都是节点,它们构成了一个HTML DOM 树。
我们先看下什么是DOM。DOM 是W3C(万维网同盟)的标准,其英文全称Document Object Model,即文档工具模型。它定义了访问HTML 和XML 文档的标准:
W3C 文档工具模型(DOM)是中立于平台和措辞的接口,它许可程序和脚本动态地访问和更新文档的内容、构造和样式。
W3C DOM 标准被分为3 个不同的部分。
核心DOM:针对任何构造化文档的标准模型XML DOM:针对XML 文档的标准模型HTML DOM:针对HTML 文档的标准模型根据W3C 的HTML DOM 标准,HTML 文档中的所有内容都是节点。
全体文档是一个文档节点每个HTML 元素是元素节点HTML 元素内的文本是文本节点每个HTML 属性是属性节点注释是注释节点HTML DOM 将HTML 文档视作树构造,这种构造被称为节点树,如图11 所示。
图11 节点树
通过HTML DOM,树中的所有节点均可通过JavaScript 访问,所有HTML 节点元素均可被修正,也可以被创建或删除。
节点树中的节点彼此拥有层级关系。我们常用父(parent)、子(child)和兄弟(sibling)等术语描述这些关系。父节点拥有子节点,同级的子节点被称为兄弟节点。
在节点树中,顶端节点称为根(root)。除了根节点之外,每个节点都有父节点,同时可拥有任意数量的子节点或兄弟节点。图12 展示了节点树以及节点之间的关系。
图12 节点树及节点间的关系
本段参考W3SCHOOL,链接:http://www.w3school.com.cn/htmldom/dom_nodes.asp。
四、选择器
我们知道网页由一个个节点组成,CSS 选择器会根据不同的节点设置不同的样式规则,那么若何来定位节点呢?
在CSS 中,我们利用CSS 选择器来定位节点。例如,上例中div 节点的id 为container,那么就可以表示为#container,个中#开头代表选择id,其后紧跟id 的名称。其余,如果我们想选择class为wrapper 的节点,便可以利用.wrapper,这里以点(.)开头代表选择class,其后紧跟class 的名称。
其余,还有一种选择办法,那便是根据标署名筛选,例如想选择二级标题,直接用h2 即可。这是最常用的3 种表示,分别是根据id、class、标署名筛选,请牢记它们的写法。
其余,CSS 选择器还支持嵌套选择,各个选择器之间加上空格分别隔便可以代表嵌套关系,如#container .wrapper p 则代表先选择id 为container 的节点,然后选中其内部的class 为wrapper 的节点,然后再进一步选中其内部的p 节点。其余,如果不加空格,则代表并列关系,如div#container .wrapperp.text 代表先选择id 为container 的div 节点,然后选中其内部的class 为wrapper 的节点,再进一步选中其内部的class 为text 的p 节点。这便是CSS 选择器,其筛选功能还是非常强大的。
其余,CSS 选择器还有一些其他语法规则,详细如表4 所示。
表4 CSS 选择器的其他语法规则
其余,还有一种比较常用的选择器是XPath,这种选择办法本文暂不先容。
五、总结
本节先容了网页的基本构造和节点间的关系,理解了这些内容,我们才有更加清晰的思路去解析和提取网页内容。
爬虫的基本事理一、爬虫概述
大略来说,爬虫便是获取网页并提取和保存信息的自动化程序,下面概要先容一下。
1. 获取网页
爬虫首先要做的事情便是获取网页,这里便是获取网页的源代码。源代码里包含了网页的部分有用信息,以是只要把源代码获取下来,就可以从中提取想要的信息了。
前面讲了要乞降相应的观点,向网站的做事器发送一个要求,返回的相应体便是网页源代码。以是,最关键的部分便是布局一个要求并发送给做事器,然后吸收到相应并将其解析出来,那么这个流程若何实现呢?总不能手工去截取网页源码吧?
不用担心,Python 供应了许多库来帮助我们实现这个操作,如 urllib、requests 等。我们可以用这些库来帮助我们实现 HTTP 要求操作,要乞降相应都可以用类库供应的数据构造来表示,得到相应之后只须要解析数据构造中的 Body 部分即可,即得到网页的源代码,这样我们可以用程序来实现获取网页的过程了。
2. 提取信息
获取网页源代码后,接下来便是剖析网页源代码,从中提取我们想要的数据。首先,最通用的方法便是采取正则表达式提取,这是一个万能的方法,但是在布局正则表达式时比较繁芜且随意马虎出错。其余,由于网页的构造有一定的规则,以是还有一些根据网页节点属性、CSS 选择器或 XPath 来提取网页信息的库,如 Beautiful Soup、pyquery、lxml 等。利用这些库,我们可以高效快速地从中提取网页信息,如节点的属性、文本值等。
提取信息是爬虫非常主要的部分,它可以使凌乱的数据变得条理清晰,以便我们后续处理和剖析数据。
3. 保存数据
提取信息后,我们一样平常会将提取到的数据保存到某处以便后续利用。这里保存形式有多种多样,如可以大略保存为 TXT 文本或 JSON 文本,也可以保存到数据库,如 MySQL 和 MongoDB 等,也可保存至远程做事器,如借助 SFTP 进行操作等。
4. 自动化程序
说到自动化程序,意思是说爬虫可以代替人来完成这些操作。首先,我们手工当然可以提取这些信息,但是当量特殊大或者想快速获取大量数据的话,肯定还是要借助程序。爬虫便是代替我们来完成这份爬取事情的自动化程序,它可以在抓取过程中进行各种非常处理、缺点重试等操作,确保爬取持续高效地运行。
二、能抓若何的数据
在网页中我们能看到各种各样的信息,最常见的便是常规网页,它们对应着 HTML 代码,而最常抓取的便是 HTML 源代码。
其余,可能有些网页返回的不是 HTML 代码,而是一个 JSON 字符串(个中 API 接口大多采取这样的形式),这种格式的数据方便传输和解析,它们同样可以抓取,而且数据提取更加方便。
此外,我们还可以看到各种二进制数据,如图片、视频和音频等。利用爬虫,我们可以将这些二进制数据抓取下来,然后保存成对应的文件名。
其余,还可以看到各种扩展名的文件,如 CSS、JavaScript 和配置文件等,这些实在也是最普通的文件,只要在浏览器里面可以访问到,就可以将其抓取下来。
上述内容实在都对应各自的 URL,是基于 HTTP 或 HTTPS 协议的,只假如这种数据,爬虫都可以抓取。
三、JavaScript 渲染页面
有时候,我们在用 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 渲染。
四、总结
本节先容了爬虫的一些基本事理,这可以帮助我们在后面编写爬虫时更加得心应手。
会话和Cookies在浏览网站的过程中,我们常常会碰着须要登录的情形,有些页面只有登录之后才可以访问,而且登录之后可以连续访问很多次网站,但是有时候过一段韶光就须要重新登录。还有一些网站,在打开浏览器时就自动登录了,而且很永劫光都不会失落效,这种情形又是为什么?实在这里面涉及会话(Session)和Cookies 的干系知识,本节就来揭开它们的神秘面纱。
一、静态网页和动态网页
在开始之前,我们须要先理解一下静态网页和动态网页的观点。这里还是前面的示例代码,内容如下:
<!DOCTYPE html><html><head><meta charset=\"大众UTF-8\"大众><title>This is a Demo</title></head><body><div id=\公众container\"大众><div class=\"大众wrapper\"大众><h2 class=\"大众title\"大众>Hello World</h2><p class=\"大众text\"大众>Hello, this is a paragraph.</p></div></div></body></html>
这是最基本的HTML 代码,我们将其保存为一个.html 文件,然后把它放在某台具有固定公网IP的主机上,主机上装上Apache 或Nginx 等做事器,这样这台主机就可以作为做事器了,其他人便可以通过访问做事器看到这个页面,这就搭建了一个最大略的网站。
这种网页的内容是HTML 代码编写的,笔墨、图片等内容均通过写好的HTML 代码来指定,这种页面叫作静态网页。它加载速率快,编写大略,但是存在很大的毛病,如可掩护性差,不能根据URL 灵巧多变地显示内容等。例如,我们想要给这个网页的URL 传入一个name 参数,让其在网页中显示出来,是无法做到的。
因此,动态网页应运而生,它可以动态解析URL 中参数的变革,关联数据库并动态呈现不同的页面内容,非常灵巧多变。我们现在碰着的大多数网站都是动态网站,它们不再是一个大略的HTML,而是可能由JSP、PHP、Python 等措辞编写的,其功能比静态网页强大和丰富太多了。
此外,动态网站还可以实现用户登录和注册的功能。再回到开头提到的问题,很多页面是须要登录之后才可以查看的。按照一样平常的逻辑来说,输入用户名和密码登录之后,肯定是拿到了一种类似凭据的东西,有了它,我们才能保持登录状态,才能访问登录之后才能看到的页面。
那么,这种神秘的凭据到底是什么呢?实在它便是会话和Cookies 共同产生的结果,下面我们来一探究竟。
二、无状态HTTP
在理解会话和Cookies 之前,我们还须要理解HTTP 的一个特点,叫作无状态。
HTTP 的无状态是指HTTP 协议对事务处理是没有影象能力的,也便是说做事器不知道客户端是什么状态。当我们向做事器发送要求后,做事器解析此要求,然后返回对应的相应,做事器卖力完成这个过程,而且这个过程是完备独立的,做事器不会记录前后状态的变革,也便是短缺状态记录。这意味着如果后续须要处理前面的信息,则必须重传,这导致须要额外传递一些前面的重复要求,才能获取后续相应,然而这种效果显然不是我们想要的。为了保持前后状态,我们肯定不能将前面的要求全部重传一次,这太摧残浪费蹂躏资源了,对付这种须要用户登录的页面来说,更是棘手。
这时两个用于保持HTTP 连接状态的技能就涌现了,它们分别是会话和Cookies。会话在做事端,也便是网站的做事器,用来保存用户的会话信息;Cookies 在客户端,也可以理解为浏览器端,有了Cookies,浏览器不才次访问网页时会自动附带上它发送给做事器,做事器通过识别Cookies 并鉴定出是哪个用户,然后再判断用户是否是登录状态,然后返回对应的相应。
我们可以理解为Cookies 里面保存了登录的凭据,有了它,只须要不才次要求携带Cookies 发送要求而不必重新输入用户名、密码等信息重新登录了。
因此在爬虫中,有时候处理须要登录才能访问的页面时,我们一样平常会直接将登录成功后获取的Cookies 放在要求头里面直接要求,而不必重新仿照登录。
好了,理解会话和Cookies 的观点之后,我们在来详细阐发它们的事理。
1. 会话
会话,其本来的含义是指有始有终的一系列动作/。比如,打电话时,从拿起电话拨号到挂断电话这中间的一系列过程可以称为一个会话。
而在Web 中,会话工具用来存储特定用户会话所需的属性及配置信息。这样,当用户在运用程序的Web 页之间跳转时,存储在会话工具中的变量将不会丢失,而是在全体用户会话中一贯存不才去。
当用户要求来自运用程序的Web 页时,如果该用户还没有会话,则Web 做事器将自动创建一个会话工具。当会话过期或被放弃后,做事器将终止该会话。
2. Cookies
Cookies 指某些网站为了辨别用户身份、进行会话跟踪而存储在用户本地终端上的数据。
● 会话坚持
那么,我们若何利用Cookies 保持状态呢?当客户端第一次要求做事器时,做事器会返回一个要求头中带有Set-Cookie 字段的相应给客户端,用来标记是哪一个用户,客户端浏览器会把Cookies 保存起来。当浏览器下一次再要求该网站时,浏览器会把此Cookies 放到要求头一起提交给做事器,Cookies 携带了会话ID 信息,做事器检讨该Cookies 即可找到对应的会话是什么,然后再判断会话来以此来辨认用户状态。
在成功登录某个网站时,做事器会见告客户端设置哪些Cookies 信息,在后续访问页面时客户端会把Cookies 发送给做事器,做事器再找到对应的会话加以判断。如果会话中的某些设置登录状态的变量是有效的,那就证明用户处于登录状态,此时返回登录之后才可以查看的网页内容,浏览器再进行解析便可以看到了。
反之,如果传给做事器的Cookies 是无效的,或者会话已经由期了,我们将不能连续访问页面,此时可能会收到缺点的相应或者跳转到登录页面重新登录。
以是,Cookies 和会话须要合营,一个处于客户端,一个处于做事端,二者共同协作,就实现了登录会话掌握。
● 属性构造
接下来,我们来看看Cookies 都有哪些内容。这里以知乎为例,在浏览器开拓者工具中打开Application 选项卡,然后在左侧会有一个Storage 部分,末了一项即为Cookies,将其点开,如图13所示,这些便是Cookies。
图13 Cookies 列表
可以看到,这里有很多条款,个中每个条款可以称为Cookie。它有如下几个属性。
Name:该Cookie 的名称。一旦创建,该名称便不可变动。Value:该Cookie 的值。如果值为Unicode 字符,须要为字符编码。如果值为二进制数据,则须要利用BASE64 编码。Domain:可以访问该Cookie的域名。例如,如果设置为.zhihu.com,则所有以zhihu.com结尾的域名都可以访问该Cookie。Max Age:该Cookie 失落效的韶光,单位为秒,也常和Expires 一起利用,通过它可以打算出其有效韶光。Max Age 如果为正数,则该Cookie 在Max Age 秒之后失落效。如果为负数,则关闭浏览器时Cookie 即失落效,浏览器也不会以任何形式保存该Cookie。Path:该Cookie 的利用路径。如果设置为/path/,则只有路径为/path/的页面可以访问该Cookie。如果设置为/,则本域名下的所有页面都可以访问该Cookie。Size 字段:此Cookie 的大小。HTTP 字段:Cookie 的httponly 属性。若此属性为true,则只有在HTTP 头中会带有此Cookie 的信息,而不能通过document.cookie 来访问此Cookie。Secure:该Cookie 是否仅被利用安全协议传输。安全协议有HTTPS 和SSL 等,在网络上传输数据之前先将数据加密。默认为false。● 会话Cookie 和持久Cookie
从表面意思来说,会话Cookie 便是把Cookie 放在浏览器内存里,浏览器在关闭之后该Cookie 即失落效;持久Cookie 则会保存到客户真个硬盘中,下次还可以连续利用,用于长久保持用户登录状态。
实在严格来说,没有会话Cookie 和持久Cookie 之分,只是由Cookie 的Max Age 或Expires 字段决定了过期的韶光。
因此,一些持久化登录的网站实在便是把Cookie 的有效韶光和会话有效期设置得比较长,下次我们再访问页面时仍旧携带之前的Cookie,就可以直接保持登录状态。
三、常见误区
在评论辩论会话机制的时候,常常听到这样一种误解——“只要关闭浏览器,会话就消逝了”。可以想象一下会员卡的例子,除非顾客主动对店家提出销卡,否则店家绝对不会轻易删除顾客的资料。对会话来说,也是一样,除非程序关照做事器删除一个会话,否则做事器会一贯保留。比如,程序一样平常都是在我们做注销操作时才去删除会话。
但是当我们关闭浏览器时,浏览器不会主动在关闭之前关照做事器它将要关闭,以是做事器根本不会有机会知道浏览器已经关闭。之以是会有这种错觉,是由于大部分会话机制都利用会话Cookie来保存会话ID 信息,而关闭浏览器后Cookies 就消逝了,再次连接做事器时,也就无法找到原来的会话了。如果做事器设置的Cookies 保存到硬盘上,或者利用某种手段改写浏览器发出的HTTP 要求头,把原来的Cookies 发送给做事器,则再次打开浏览器,仍旧能够找到原来的会话 ID,依旧还是可以保持登录状态的。
而且正好是由于关闭浏览器不会导致会话被删除,这就须要做事器为会话设置一个失落效韶光,当间隔客户端上一次利用会话的韶光超过这个失落效韶光时,做事器就可以认为客户端已经停滞了活动,才会把会话删除以节省存储空间。
由于涉及一些专业名词知识,本节的部分内容参考来源如下。
会话百度百科:https://baike.baidu.com/item/session/479100。
Cookies 百度百科:https://baike.baidu.com/item/cookie/1119。
HTTP Cookie 维基百科:https://en.wikipedia.org/wiki/HTTP_cookie。
会话和几种状态保持方案理解:http://www.mamicode.com/info-detail-46545.html。
代理的基本事理我们在做爬虫的过程中常常会碰着这样的情形,最初爬虫正常运行,正常抓取数据,统统看起来都是那么美好,然而一杯茶的功夫可能就会涌现缺点,比如403 Forbidden,这时候打开网页一看,可能会看到“您的IP 访问频率太高”这样的提示。涌现这种征象的缘故原由是网站采纳了一些反爬虫方法。
比如,做事器会检测某个IP 在单位韶光内的要求次数,如果超过了这个阈值,就会直接谢绝做事,返回一些缺点信息,这种情形可以称为封IP。
既然做事器检测的是某个IP 单位韶光的要求次数,那么借助某种办法来伪装我们的IP,让做事器识别不出是由我们本机发起的要求,不就可以成功防止封IP 了吗?
一种有效的办法便是利用代理,后面会详细解释代理的用法。在这之前,须要先理解下代理的基本事理,它是若何实现IP 伪装的呢?
一、基本事理
代理实际上指的便是代理做事器,英文叫作proxy server,它的功能是代理网络用户去取得网络信息。形象地说,它是网络信息的中转站。在我们正常要求一个网站时,是发送了要求给Web 做事器,Web 做事器把相应传回给我们。如果设置了代理做事器,实际上便是在本机和做事器之间搭建了一个桥,此时本机不是直接向Web 做事器发起要求,而是向代理做事器发出要求,要求会发送给代理做事器,然后由代理做事器再发送给Web 做事器,接着由代理做事器再把Web 做事器返回的相应转发给本机。这样我们同样可以正常访问网页,但这个过程中Web 做事器识别出的真实IP 就不再是我们本机的IP 了,就成功实现了IP 伪装,这便是代理的基本事理。
二、代理的浸染
那么,代理有什么浸染呢?我们可以大略列举如下。
打破自身IP 访问限定,访问一些平时不能访问的站点。访问一些单位或团体内部资源:比如利用教诲网内地址段免费代理做事器,就可以用于对教诲网开放的各种FTP 下载上传,以及各种资料查询共享等做事。提高访问速率:常日代理做事器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也将其保存到缓冲区中,当其他用户再访问相同的信息时,则直接由缓冲区中取出信息,传给用户,以提高访问速率。隐蔽真实IP:上网者也可以通过这种方法隐蔽自己的IP,免受攻击。对付爬虫来说,我们用代理便是为了隐蔽自身IP,防止自身的IP 被封锁。三、爬虫代理
对付爬虫来说,由于爬虫爬取速度过快,在爬取过程中可能碰着同一个IP 访问过于频繁的问题,此时网站就会让我们输入验证码登录或者直接封锁IP,这样会给爬取带来极大的不便。
利用代理隐蔽真实的IP,让做事器误以为是代理做事器在要求自己。这样在爬取过程中通过不断改换代理,就不会被封锁,可以达到很好的爬取效果。
四、代理分类
代理分类时,既可以根据协议区分,也可以根据其匿名程度区分。
1. 根据协议区分
根据代理的协议,代理可以分为如下种别。
FTP 代理做事器:紧张用于访问FTP 做事器,一样平常有上传、下载以及缓存功能,端口一样平常为21、2121 等。HTTP 代理做事器:紧张用于访问网页,一样平常有内容过滤和缓存功能,端口一样平常为80、8080、3128 等。SSL/TLS 代理:紧张用于访问加密网站,一样平常有SSL 或TLS 加密功能(最高支持128 位加密强度),端口一样平常为443。RTSP 代理:紧张用于访问Real 流媒体做事器,一样平常有缓存功能,端口一样平常为554。Telnet 代理:紧张用于telnet 远程掌握(黑客入侵打算机时常用于隐蔽身份),端口一样平常为23。POP3/SMTP 代理:紧张用于POP3/SMTP 办法收发邮件,一样平常有缓存功能,端口一样平常为110/25。SOCKS 代理:只是纯挚通报数据包,不关心详细协议和用法,以是速率快很多,一样平常有缓存功能,端口一样平常为1080。SOCKS代理协议又分为SOCKS4和SOCKS5,前者只支持TCP,而后者支持TCP 和UDP,还支持各种身份验证机制、做事器端域名解析等。大略来说,SOCKS4 能做到的SOCKS5 都可以做到,但SOCKS5 能做到的SOCKS4 不一定能做到。2. 根据匿名程度区分
根据代理的匿名程度,代理可以分为如下种别。
高度匿名代理:会将数据包原封不动地转发,在做事端看来就彷佛真的是一个普通客户端在访问,而记录的IP 是代理做事器的IP。普通匿名代理:会在数据包上做一些改动,做事端上有可能创造这是个代理做事器,也有一定几率追查到客户真个真实IP。代理做事器常日会加入的HTTP头有HTTP_VIA和HTTP_X_FORWARDED_FOR。透明代理:不但改动了数据包,还会见告做事器客户真个真实IP。这种代理除了能用缓存技能提高浏览速率,能用内容过滤提高安全性之外,并无其他显著浸染,最常见的例子是内网中的硬件防火墙。特工代理:指组织或个人创建的用于记录用户传输的数据,然后进行研究、监控等目的的代理做事器。五、常见代理设置
利用网上的免费代理:最好利用高匿代理,其余可用的代理不多,须要在利用前筛选一下可用代理,也可以进一步掩护一个代理池。利用付费代理做事:互联网上存在许多代理商,可以付费利用,质量比免费代理好很多。ADSL 拨号:拨一次号换一次IP,稳定性高,也是一种比较有效的办理方案。由于涉及一些专业名词知识,本节的部分内容参考来源如下。
代理做事器维基百科:https://zh.wikipedia.org/wiki/代理做事器。
代理百度百科:https://baike.baidu.com/item/代理/3242667。
——本文节选自《Python 3网络爬虫开拓实战》
崔庆才 著
《Python 3网络爬虫开拓实战》
百万访问量博客作者静觅力作!
作者博客:https://cuiqingcai.com/
为什么会写这本书?
我是在 2015 年开始打仗爬虫的,当时爬虫实在并没有这么火,我当时以为能够把想要的数据抓取下来便是一件非常有造诣感的事情,而且也可以顺便熟习 Python,一石二鸟。
在学习的过程中,困难实在是非常多的,最早学习时利用的是 Python 2,当时由于编码问题搞得焦头烂额。其余,那时候干系的中文资料还比较少,很多情形下还得自己逐步去啃官方文档,踩了不少坑。随着学习的进行,我创造爬虫这部分内容涉及的知识点太多、太杂了。网页的构造、渲染办法不同,我们就得换不同的爬取方案来进行针对性的爬取。其余,网页信息的提取、爬取结果的保存也有五花八门的方案。随着移动互联网的兴起,App 的爬取也成了一个热点,而为了提高爬取速率又须要考虑并行爬取、分布式爬取方面的内容,爬虫的通用性、易用性、架构都须要好好优化。这么多杂糅的知识点对付一个爬虫初学者来说,学习的寻衅性会非常高,同时学习过程中大家或许也会走我之前走过的弯路,摧残浪费蹂躏很多韶光。以是我把我学习爬虫的很多履历都写了进了书中。
环境配置是学习的第一步,环境配置不好,其他事情就没法开展,乃至可能很大程度上打击学习的积极性,以是我在第1 章中着重先容了环境的配置过程。而由于操作系统的不同,环境配置过程又各有不同,以是我把每个别系(Windows、Linux、Mac)的环境配置过程都亲自实践了一遍,并梳理记录下来,希望为各位读者在环境配置时多供应一些帮助。后面我又针对爬虫网站的不同环境分门别类地进行相识释,如Ajax 剖析爬取、动态渲染页面爬取、App 爬取、利用代理爬取、仿照登录爬取等知识,每个知识点我都选取了一些范例案例来解释,以便于读者更好地理解全体过程和用法。为了提高代码编写和爬取的效率,还可以利用一些爬虫框架赞助爬取,以是本书后面又先容了两个盛行的爬虫框架的用法,末了又先容了一些分布式爬虫及支配方面的知识。总体来说,本书根据我个人以为比较空想的学习路径先容了学习爬虫的干系知识,并通过一些实战案例帮助读者更好地理解个中的事理。
第1章 开拓环境配置
第2章 爬虫根本
第3章 基本库的利用
第4章 解析库的利用
第5章 数据存储
第6章 Ajax数据爬取
第7章 动态渲染页面爬取
第8章 验证码的识别
第9章 代理的利用
第10章 仿照登录
第11章 App的爬取
第12章 pyspider框架的利用
第13章 Scrapy框架的利用
第14章 分布式爬虫
第15章 分布式爬虫的支配