第二章 爬虫基础
2.1 HTTP基本原理
URL:URL的全称为 Uniform Resource Identifier,即统一资源标志符。
其中包括了访问协 议 http 、 访问路径 (/即根目录)和资源名称。
2.1.2 HTTP 和 HTTPS
URL 的开头会有 http或 https,这就是访问资源需要的协议类型。 有时,我们还会看到ftp、 sftp、 smb开头的 URL,它们都是协议类型。 在爬虫中,我们抓 取的页面通常就是 http或 https协议。
2.1.4 HTTP请求过程
2.1.5 请求
-
请求方法
常见的请求方法有两种: GET和POST。
GET 和 POST请求方法有如下区别。- GET请求中的参数包含在URL里面,数据可以在URL中看到,而POST请求的URL不会包含这些数据,数据都是通过表单形式传输的,会包含在请求体中。
- GET请求提交的数据最多只有 1024字节,而 POST方式没有限制。
-
请求的网址
请求的网址,即统一资惊定位符URL。 -
请求头
请求头,用来说明服务器要使用的附加信息,比较重要的信息有Cookie、Referer、User-Agent等。- Referer:此内容用来标识这个请求是从哪个页面发过来的。
- User-Agent:简称 UA,可以使服务器识别客户使用的操作系统
及版本 、 浏览器及版本等信息 。 - Cookie:也常用复数形式 Cookies,主要功能是维持当前访问会话 。Cookies里有信息标识了我们所对应的服务器 的会话,每次浏览器在请求该站点的页面时,都会在请求头中加上 Cookies 并将其发送给服 务器,服务器通过 Cookies 识别出是我们自己,并且查出当前状态是登录状态,所以返回结 果就是登录之后才能看到的网页内容 。
- Host:用于指定请求资源的主机 IP 和端口号。从HTTP1.l版本开始,请求必须包含此内容。
- Accept:请求报头域,用于指定客户端可接受哪些类型的信息。
- Accept-Language:指定客户端可接受的语言类型 。
- Accept-Encoding:指定客户端可接受的内容编码。
- Content-Type:互联网媒体类型。在 HTTP协议消息头中,它用来表示具体请求中的媒体类型信息 。
-
请求体
请求体-般承载的内容是 POST请求中的表单数据,而对于 GET请求,请求体则为空 。
2.1.6 响应
响应,由服务端返回给客户端,可以分为三部分:响应状态码( Response Status Code )、响应头
( Response Headers )和响应体( Response Body )。
-
响应状态码
在爬虫中,我们可以根据状态码来判断服务器响应状态。 -
响应头
响应头包含了服务器对请求的应答信息,如 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: 指定响应的过期时间 , 可以使代理服务器或浏览器将加载的内容更新到缓存中。 如果再次访问时,就可以直接从缓存中加载, 降低服务器负载,缩短加载时间。
-
晌应体
响应的正文数据都在响应体中,比如请求网页时,它的响应体就 是网页的 HTML代码;请求一张图片时, 它的响应体就是图片的二进制数据。
在浏览器开发者工具中点击Preview,就可以看到网页的源代码,也就是响应体的内容。
2.2 网页基础
2.2.1 网页的组成
网页可以分为三大部分一一-HTML, CSS和JavaScript。
HTML相当 于骨架, JavaScript相当于肌肉, css相当于皮肤。
- HTML
HTML:Hyper Text Markup Language,即超文本标记语 言。 网页包括文字、按钮、图片和视频等各种复杂的元素,其基础架构就是 HTML。 不同类型的文字 通过不同类型的标签来表示 。 - CSS
CSS:CascadingStyle Sheets,即层叠样式表。 “层叠”是指当在 HTML 中引用了数个样式文件,并且样式发生冲突时,浏览器能依据层叠顺序处理 。 “样式”指网页中文字大小 、 颜色 、元 素间距、排列等格式 。
CSS是目前唯一的网页页面排版样式标准。 - JavaScript
JavaScript,简称 JS, 是一种脚本语言。实现了一种实时、动态、交互的页面功能 。
JavaScript通常也是以单独的文件形式加载的,后缀为js,在 HTML 中通过 script 标签即可引入。
###2.2.2 节点数及节点间的关系
2.3 爬虫的基本原理
2.3.1 爬虫概述
爬虫是获取网页并提取和保存信息的自动化程序。
- 获取网页
最关键的部分就是构造一个请求并发送给服务器,然后接收到响应并将其解析出来。
Python库:urllib、 requests等。 - 提取信息
分析网页源代码,从中提取想要的数据。最通用的方法便是采用正则表达式提取,这是一个万能的方法。
由于网页的结构有一定的规则,所以还有一些根据网页节点属性、 css选择器或XPath来 提取网页信息的库,如Beautiful Soup、 pyquery、 lxml等 。 - 保存数据
保存形式有多样,可以简单保存为 TXT 文本或 JSON 文本,也可以保存到数据库,如 MySQL 和 MongoDB 等 ,也可保存至远程服务器,如借助 SFTP进行操作等。
2.3.2 JavaScript渲染页面
有时候,我们在用 时lib或 requests抓取网页时,得到的游、代码实际和浏览器中看到的不一样。
现在网页越来越多地采用 Ajax、前端模块化工具来构建,整个网页可 能都是由 JavaScript渲染出来的,也就是说原始的 HTML代码就是一个空壳, 例如:
<DOOCTYPE html>
<html>
<head >
<meta charset = "UTF-8" >
<title>This is a Oemo</title>
</head>
<body>
<div id=”container”>
</div>
</body>
<script src=”app.js”></script> </html>
body节点里面只有一个 id 为 container 的节点,但是需要注意在 body节点后引入了 app. ,它便负责整个网站的渲染 。
在浏览器中打开这个页面时,首先会加载这个 HTML 内容,接着浏览器会发现其中引人了一个 app.js 文件,然后便会接着去请求这个文件,获取到该文件后,便会执行其中的 JavaScript 代码,而JavaScript则会改变 HTML 巾的节点,向其添加内容,最后得到完整的页面 。
但是在用 时lib或 requests等库请求当前页面时,我们得到的只是这个 HTML代码,它不会帮助 我们去继续加载这个 JavaScript文件,这样也就看不到浏览器中的内容了 。
对于这样的情况,我们可以分析其后台 Ajax接口,也可使用 Selenium、 Splash这样的库来实现模拟 JavaScript渲染 。
2.4 会话和Cookies
2.4.1 静态网页和动态网页
静态网页:可维护性差 ,不能根据 URL灵活多变地显示内容等。 给这个网页的URL传入一个name参数,让其在网页中显示出来,是无法做到的。
动态网页:可以动态解析 URL 中参数的变化,关联数据库井动态呈现不同的页面内容。动态网站还可以实现用户登录和注册的功能。
2.4.2 无状态 HTTP
HTTP 的无状态是指 HTTP 协议对事务处理是没有记忆能力的,也就是说服务器不知道客户端是什么状态 。
两个用于保持 HTTP连接状态的技术就出现了,它们分别是会话和 Cookies。
会话在服务端,用来保存用户的会话信息; Cookies 在客户端,有了 Cookies,浏览器在下次访问网页时会自动附带上它发送给服务器,服务器通过识别 Cookjes并鉴定出 是哪个用户,然后再判断用户是否是登录状态,然后返回对应的响应 。
-
会话
会话,其本来的含义是指有始有终的一系列动作/消息。 比如,打电话时,从拿起电话拨号到挂断 电话这中间的一系列过程可以称为一个会话。而在 Web 中,当用户在应用程序 的 Web 页之间跳转时,存储在会话对象中的变量将不会丢失,而是在整个用户 会话 中一直存在下去 。 当用户请求来自应用程序的 Web页时如果该用户还没有会话, 则 Web服务器将自动创建一个会话 对象 。 当会话过期或被放弃后,服务器将终止该会话 。
-
Cookies
Cookies指某些网站为了辨别用户身份 、 进行会话跟踪而存储在用户本地终端上的数据 。
-
会话维持
客户端第一次请求服务器时,服务器会返回一个请 求头中带有 Set-Cookie字段的响应给客户端,用来标记是哪一个用户,客户端浏览器会把 Cookies保存起来 。 当浏览器下一次再请求该网站时,浏览器会把此 Cookies 放到请求头一起提交给服务器, Cookies携带了会话 ID信息,服务器检查该 Cookies 即可找到对应的会话是什么,然后再判断会话来 以此来辨认用户状态 。
在成功登录某个网站时,服务器会告诉客户端设置哪些 Cookies信息,在后续访问页面时客户端 会把 Cookies 发送给服务器,服务器再找到对应的会话加以判断 。 如果会话中的某些设置登录状态的 变量是有效 的,那就证明用户处于登录状态,此时返回登录之后才可以查看的网页内容,浏览器再进 行解析便可以看到了。
反之,如果传给服务器的 Cookies是无效的,或者会话已经过期了,我们将不能继续访问页面,
此时可能会收到错误的响应或者跳转到登录页面重新登录 。 -
结构属性
在浏览器开发者工具中打开 Application选项卡,左侧会有一个 Storage部分,最后一项即为 Cookies。
属性:- Name : 该 Cookie 的名称 。一旦创建,该名称便不可更改 。
- Value: 该 Cookie的值。 如果值为 Unicode字符,需要为字符编码。 如果值为二进制数据,则
需要使用 BASE64编码。 - Domain:可以访问该 Cookie的域名 。 例如,如果设置为 .zhihu.com,则所有以 zhihu.com结尾 的域名都可以访问该 Cookie。
- MaxAge: 该 Cookie失效的时间, 单位为秒,也常和 Expires一起使用,通过它可以计算其 有效时间。 MaxAge如果为正数,贝lj该Cookie在MaxAge秒之后失效。 如果为负数,则关闭 浏览器时 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字段 决定了过期的 时间 。
2.4.3 常见误区
误解 一一 “只要关闭浏览器,会话就消失了”
可以 想象一下会员卡的例子,除非顾客主动对店家提出销卡,否则店家绝对不会轻易删除顾客的资料。 对 会话来说, 也是一样,除非程序通知服务器删除一个会话,存则服务器会一直保留 。
当我们关闭浏览器时,浏览器不会主动在关闭之前通知服务器它将要关闭,所以服务器根本 不会有机会知道浏览器已经关闭 。
之所以会有这种错觉,是因为大部分会话机制都使用会话 Cookie 来保存会话 ID信息, 而关闭浏览器后 Cookies就消失了,再次连接服务器时,也就无法找到原来的会 话了 。 如果服务器设置的 Cookies保存到硬盘上,或者使用某种手段改写浏览器发出的 HTTP请求头, 把原来的 Cookies发送给服务器, 则再次 打开浏览器,仍然能够找到原来的会话 ID, 依旧还是可以保 持登录状态的 。
2.5 代理的基本原理
当服务器会检测某个 IP在单位时间内的请求次数,如果超过了这个阈值,就会直接拒绝服务,返回一些错误信息,这种情况可以称为封 IP。
2.5.1 代理的作用
- 突破自身IP访问限制,访问一些平时不能访问的站点。
- 访问一些单位或团体内部资源。
- 提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同
时也将·其保存到缓 冲区中,当其他用户再访问相同的信息时,则直接由缓冲区中取出信息,
传给用户,以提高访问速度 。 - 隐藏真实IP:防止自身的IP被封锁。
2.5.2 爬虫分类
-
根据协议区分
- 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,还支持各种身份验证机制、服务器端域名解析等。
-
根据匿名程度区分
- 高度匿名代理:会将数据包原封不动地转发,在服务端看来就好像真的是一个普通客户端在 访问,而记录的 IP是代理服务器的 IP。
- 普通匿名代理:会在数据包上做一些改动 , 服务端上有可能发现这是个代理服务器,也有一定几 率追查到客户端的真实 E。 代理服务器通常会加入的 Hπ?头有 HTTP VIA和 HTTP X FOR帆 DED FOR。
- 透明代理:不但改动了数据包 还会告诉服务器客户端的 真实 IP。
- 间谍代理:指组织或个人创建的用于记录用户传输的数据,然后进行研究 、 监控等 目的的代 理服务器 。
2.5.3 常见代理设置
- 使用网上的免费代理
- 使用付费代理服务
- ADSL 拨号 :拨一次号换一次 IP,稳定性高,也是一种比较有效的解决方案。