b、爬虫基础
爬虫基础
1、Http基本原理
1.1、URL和URI
URI的全称为 Uniform Resource Identifier,即统一资源标志符。
URL的全称为 Universal Resource Locator,即统一资源定位符。
URN的全称为 Universal Resource Name,即统一资 源、名称。 URN只命名资源而不指定如何定位资源。
URI是由URL和URN组成,但在目前的互联网中,URN用的很少。
有一个图标资源,我们用 URL/URI 来唯一指定了它的访问方式,这其中包括了访问协议http、 访问路径 (/即根目录)和资源名称 favicon.ico。 通过这样一个链接,我们便可以从互联网上找到这个资源,这就是 URL/URI。
1.2、超文本
超文本”是超级文本的中文缩写。其英文名称叫作 hypertext。,我们在浏览棉里看到的网 页就是超文本解析而成的, 超文本是用超链接的方法,将各种不同空间的文字信息组织在一起的网状文本。
1.3、HTTP和HTTPS
URL 的开头会有 http或https,这就是访问资源需要的协议类型。有时,我们还会看到ftp、 sftp、 smb 开头的 URL,它们都是协议类型。 在爬虫中,我们抓取的页面通常就是 http 或 https协议的
HTTP 的全称是 Hyper Text Transfer Protocol,中文名叫作超文本传输协议。 HTTP 协议是用于从网络传输超文本数据到本地浏览器的传送协议,它能保证高效而准确地传送超文本文档。
HTTPS 的全称是 Hyper Text Transfer Protocol over Secure Socket Layer,是以安全为目标的 HTTP 通道,简单讲是 HTTP 的安全版, 即 HTTP 下加入 SSL 层,简称为 HTTPS。
HTTPS的安全基础是SSL,因此通过它传输的内容都是经过 SSL加密的,它的主要作用可以分为两种。
建立一个信息安全通道来保证数据传输的安全。
确认网站的真实信息,也可以通过CA机构颁发的安全签章来查询。
1.4、HTTP请求过程
过程是:浏览器向网站所在的服务器发送了一个请求,网站服务器接收到这个请求后进行处理和解析,然后返 回对应的响应,接着传回给浏览器。 响应里包含了页面的源代码等内容,浏览器再对其进行解析。
1.5、请求
请求由客户端向服务器发出,分为4个部分内容:请求方法( Request Method )、 请求的网址 ( Request URL )、请求头( Request Headers )、 请求体( Request Body )。
1.5.1、请求方法
常见的请求凡是有两种:GET和POST.
区别:
GET 请求中的参数包含在 URL 里面,数据可以在 URL 中看到,而 POST 请求的 URL 不会包 含这些数据,数据都是通过表单形式传输的,会包含在请求体中。
GET请求提交的数据最多只有 1024 字节,而 POST方式没有限制。
其他请求方法
方法 | 描述 |
---|---|
GET | 请求页面,并返回页面内容 |
HEAD | 类似于 GET请求, 只不过返回的响应中没有具体的内容,用于获取报头 |
POST | 大多用于提交表单或上传文件,数据包含在请求体中 |
PUT | 从客户端向服务器传送的数据取代指定文梢中的内容 |
DELETE | 请求服务器删除指定的页面 |
CONNECT | 把服务器当作跳板,让服务器代替客户端防问其他网页 |
OPTIONS | 允许客户端查看服务器的性能 |
TRACE | 回显服务器收到的请求,主要用于测试或诊断 |
1.5.2、请求的网址
请求的网址,即统一资源定位符URL,他可以唯一确定我们想要的请求资源。
1.5.3、请求头
请求头,用来说明服务器要使用的附加信息。
Accept:请求报头域,用于指定客户端可接受哪些类型的信息。
Accept-Language:指定客户端可接受的语言类型。
Accept-Encoding :指定客户端可接受的内容编码。
Host:用于指定请求资源的主机 IP 和端口号,其内容为请求 URL 的原始服务器或网关的位置。 从 HTTP 1. l 版本开始,请求必须包含此内容。
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.neνcommons。
1.5.4、请求体
请求体-般承载的内容是 POST请求中的表单数据,而对于 GET请求,请求体则为空。
Content-Type 和 POST 提交数据方式的关系
Content-Type | 提交数据的方式 |
---|---|
application/x-www-forrn-urlencoded | 表单数据 |
multi part/form-data | 表单文件上传 |
application/json | 序列化 JSON 数据 |
text/xml | XML 数据 |
1.6、响应
响应,由服务端返回给客户端,可以分为三部分:响应状态码( Response Status Code )、响应头 ( Response Headers )和响应体( Response Body )。
1.6.1、响应状态码
http状态返回代码 1xx(临时响应)
表示临时响应并需要请求者继续执行操作的状态代码。
http状态返回代码 代码 说明
100 (继续) 请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。
101 (切换协议) 请求者已要求服务器切换协议,服务器已确认并准备切换。
*http状态返回代码* 2xx (成功)
表示成功处理了请求的状态代码。
http状态返回代码 代码 说明
200 (成功) 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。
201 (已创建) 请求成功并且服务器创建了新的资源。
202 (已接受) 服务器已接受请求,但尚未处理。
203 (非授权信息) 服务器已成功处理了请求,但返回的信息可能来自另一来源。
204 (无内容) 服务器成功处理了请求,但没有返回任何内容。
205 (重置内容) 服务器成功处理了请求,但没有返回任何内容。
206 (部分内容) 服务器成功处理了部分 GET 请求。
*http状态返回代码* 3xx (重定向)
表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。
http状态返回代码 代码 说明
300 (多种选择) 针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。
301 (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
303 (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
305 (使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。
307 (临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
*http状态返回代码* 4xx(请求错误)
这些状态代码表示请求可能出错,妨碍了服务器的处理。
http状态返回代码 代码 说明
400 (错误请求) 服务器不理解请求的语法。
401 (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
403 (禁止) 服务器拒绝请求。
404 (未找到) 服务器找不到请求的网页。
405 (方法禁用) 禁用请求中指定的方法。
406 (不接受) 无法使用请求的内容特性响应请求的网页。
407 (需要代理授权) 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。
408 (请求超时) 服务器等候请求时发生超时。
409 (冲突) 服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。
410 (已删除) 如果请求的资源已永久删除,服务器就会返回此响应。
411 (需要有效长度) 服务器不接受不含有效内容长度标头字段的请求。
412 (未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件。
413 (请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。
414 (请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理。
415 (不支持的媒体类型) 请求的格式不受请求页面的支持。
416 (请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此状态代码。
417 (未满足期望值) 服务器未满足"期望"请求标头字段的要求。
*http状态返回代码* 5xx(服务器错误)
这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。
http状态返回代码 代码 说明
500 (服务器内部错误) 服务器遇到错误,无法完成请求。
501 (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。
502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。
503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。
504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。
505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。
一些常见的http状态返回代码为:
200 - 服务器成功返回网页
404 - 请求的网页不存在
503 - 服务不可用
1.6.2、响应体
在做爬虫时,主要通过响应体得到网页的源代码,JSON数据等,然后从中做相应内容的提取。
2、网页基础
2.1、网页组成
网页可分为三大部分——HTML、CSS和JavaScript。
2.1.1、HTML
HTML 是用来描述网页的一种语言, 其全称叫作 Hyper Text Markup Language,即超文本标记语 言。 网页包括文字、按钮、图片和视频等各种复杂的元素,其基础架构就是 HTML。
2.1.2、CSS
css,全称叫作 Cascading Style Sheets,即层叠样式表。 “层叠”是指当在 HTML 中引用了数个样 式文件,并且样式发生冲突时,浏览器能依据层叠顺序处理。 “样式”指网页中文字大小、 颜色、元 素间距、排列等格式。
2.1.3、JavaScript
JavaScript,简称 JS, 是一种脚本语言。 HTML 和 css 配合使用, 提供给用户的只是一种静态信 息,缺乏交互性。JavaScript的出现使得用户与信息之间不只是一种浏览与显示的关系,而是实现了一种实时、动态、交互的页面功能。
2.2、网页结构
HTML 基本结构的后缀为 html ,由各种标签组成。
2.3、节点树及节点间的关系
在 HTML 中,所有标签定义的内容都是节点,它们构成了一个 HTML 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 属性是属性节点。
注释是注释节点。
节点树中的节点彼此拥有层级关系。 我们常用父( parent )、子( child )和兄弟( sibling )等术语描述这些关系。 父节点拥有子节点,同级的子节点被称为兄弟节点。在节点树中,顶端节点称为根( root )。 除了根节点之外,每个节点都有父节点,同时可拥有任意数量的子节点或兄弟节点。
2.4、选择器
选择器 | 例子 | 例子描述 |
---|---|---|
.class | .intro | 选择 class="intro" 的所有元素。 |
#id | #firstname | 选择 id="firstname" 的所有元素。 |
* | * | 选择所有元素。 |
element | p | 选择所有 元素。 |
element,element | div,p | 选择所有 元素和所有 元素。 |
element element | div p | 选择 元素内部的所有 元素。 |
element>element | div>p | 选择父元素为 元素的所有 元素。 |
element+element | div+p | 选择紧接在 元素之后的所有 元素。 |
[attribute] | [target] | 选择带有 target 属性所有元素。 |
[attribute=value] | [target=_blank] | 选择 target="_blank" 的所有元素。 |
[attribute~=value] | [title~=flower] | 选择 title 属性包含单词 "flower" 的所有元素。 |
[attribute|=value] | [lang|=en] | 选择 lang 属性值以 "en" 开头的所有元素。 |
:link | a:link | 选择所有未被访问的链接。 |
:visited | a:visited | 选择所有已被访问的链接。 |
:active | a:active | 选择活动链接。 |
:hover | a:hover | 选择鼠标指针位于其上的链接。 |
:focus | input:focus | 选择获得焦点的 input 元素。 |
:first-letter | p:first-letter | 选择每个 元素的首字母。 |
:first-line | p:first-line | 选择每个 元素的首行。 |
:first-child | p:first-child | 选择属于父元素的第一个子元素的每个 元素。 |
:before | p:before | 在每个 元素的内容之前插入内容。 |
:after | p:after | 在每个 元素的内容之后插入内容。 |
:lang(language) | p:lang(it) | 选择带有以 "it" 开头的 lang 属性值的每个 元素。 |
element1~element2 | p~ul | 选择前面有 元素的每个
|
[attribute^=value] | a[src^="https"] | 选择其 src 属性值以 "https" 开头的每个 元素。 |
[attribute$=value] | a[src$=".pdf"] | 选择其 src 属性以 ".pdf" 结尾的所有 元素。 |
[attribute**=value*] | a[src*="abc"] | 选择其 src 属性中包含 "abc" 子串的每个 元素。 |
:first-of-type | p:first-of-type | 选择属于其父元素的首个 元素的每个 元素。 |
:last-of-type | p:last-of-type | 选择属于其父元素的最后 元素的每个 元素。 |
:only-of-type | p:only-of-type | 选择属于其父元素唯一的 元素的每个 元素。 |
:only-child | p:only-child | 选择属于其父元素的唯一子元素的每个 元素。 |
:nth-child(n) | p:nth-child(2) | 选择属于其父元素的第二个子元素的每个 元素。 |
:nth-last-child(n) | p:nth-last-child(2) | 同上,从最后一个子元素开始计数。 |
:nth-of-type(n) | p:nth-of-type(2) | 选择属于其父元素第二个 元素的每个 元素。 |
:nth-last-of-type(n) | p:nth-last-of-type(2) | 同上,但是从最后一个子元素开始计数。 |
:last-child | p:last-child | 选择属于其父元素最后一个子元素每个 元素。 |
:root | :root | 选择文档的根元素。 |
:empty | p:empty | 选择没有子元素的每个 元素(包括文本节点)。 |
:target | #news:target | 选择当前活动的 #news 元素。 |
:enabled | input:enabled | 选择每个启用的 元素。 |
:disabled | input:disabled | 选择每个禁用的 元素 |
:checked | input:checked | 选择每个被选中的 元素。 |
:not(selector) | :not(p) | 选择非 元素的每个元素。 |
::selection | ::selection | 选择被用户选取的元素部分。 |
3、爬虫基本原理
3.1、爬虫概述
简单来说,爬虫就是获取网页并提取和保存信息的自动化程序。
3.1.1、获取网页
爬虫首先要做的工作就是获取网页,这里就是获取网页的源代码。 源代码里包含了网页的部分有用信息,所以只要把源代码获取下来,就可以从中提取想要的信息。
3.1.2、提取信息
获取网页源代码后,接下来就是分析网页源代码,从中提取我们想要的数据。 Beautiful Soup、 pyquery、 lxml 等。 使用这些库,我们可以高效快速地从中提取网页信息,如节点的属性、 文本值等。
3.1.3、保存数据
保存形式有多种多样, 如可以简单保存为 TXT 文本或 JSON 文本,也可以保存到数据库,也可保存至远程服务器。
3.1.4、自动化程序
说到自动化程序,意思是说爬虫可以代替人来完成这些操作。 爬虫就是代替我们来完成这份爬取工作的自动化程序,它可以在抓取过程中进行各种异常处理、错误重试等操作,确保爬取持续高效地运行。
3.2、能抓取的数据
HTML源代码、JSON字符串、各种二进制数据、CSS、javaScript和配置文件等
3.3、 Javascript渲染页面
有时候,我们在用urllib 或 requests抓取网页时,得到的源代码实际和浏览器中看到的不一样。
这是一个非常常见的问题。 现在网页越来越多地采用 Ajax、前端模块化工具来构建,整个网页可能都是由 JavaScript 渲染出来的,也就是说原始的 HTML代码就是一个空壳。
4、会话和Cookies
在浏览网站的过程中,我们经常会遇到需要登录的情况,有些页面只有登录之后才可以访问 ,而 且登录之后可以连续访问很多次网站,但是有时候过一段时间就需要重新登录。 还有一些网站,在打 开浏览器时就向动登录了,而且很长时间都不会失效,这里面涉及会话 (Session )和 Cookies 的相关知识
4.1、静态网页和动态网页
这种网页的内容是 HTML代码编写的,文字、图片等内容均通过写好的 HTML 代码来指定, 这 种页面叫作静态网页。 它加载速度快,编写简单,但是存在很大的缺陷,如可维护性差 ,不能根据 URL灵活多变地显示内容等。可以动态解析 URL 中参数的变化,关联数据库井动态呈现不同的页面内容,非常灵活多变。 我们现在遇到的大多数网站都是动态网站,它们不再是一个简单的 HTML, 而是可能由 JSP 、 PHP 、 Python等语言编写的,其功能比静态网页强大和丰富太多了。
4.2、无状态HTTP
HTTP 的无状态是指 HTTP 协议对事务处理是没有记忆能力的,也就是说服务器不知道客户端是什么状态。 当我们向服务器发送请求后,服务器解析此请求,然后返回对应的响应,服务器负责完成这个过程,而且这个过程是完全独立的,服务器不会记录前后状态的变化,也就是缺少状态记录。 这意味着如果后续需要处理前面的信息,则必须重传,这导致需要额外传递一些前面的重复请求,才能获取后续响应,然而这种效果显然不是我们想要的。 为了保持前后状态,再使用会话和 Cookies。 会话在服务端, 也就是网站的服务器,用来保存用户的会话信息; Cookies 在客户端,也可以理解为浏览器端,有了 Cookies,浏览器在下次访问网页时会自动附带上它发送给服务器,服务器通过识别 Cookies 并鉴定出是哪个用户,然后再判断用户是否是登录状态,然后返回对应的响应。
4.2.1、会话
会话,其本来的含义是指有始有终的一系列动作/消息。 比如,打电话时,从拿起电话拨号到挂断 电话这中间的一系列过程可以称为一个会话。
而在 Web 中,会话对象用来存储特定用户会话所需的属性及配置信息。 这样,当用户在应用程序 的 Web 页之间跳转时,存储在会话对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。 当用户请求来自应用程序的 Web 页时如果该用户还没有会话, 则 Web 服务器将自动创建一个会话对象。 当会话过期或被放弃后,服务器将终止该会话。
4.2.2、Cookies
Cookies 指某些网站为了辨别用户身份、 进行会话跟踪而存储在用户本地终端上的数据。
会话维持
当客户端第一次请求服务器时,服务器会返回一个请求头中带有 Set-Cookie 字段的响应给客户端,用来标记是哪一个用户,客户端浏览器会把 Cookies 保存起来。 当浏览器下一次再请求该网站时,浏览器会把此 Cookies 放到请求头一起提交给服务器, “ Cookies 携带了会话 ID 信息,服务器检查该 Cookies 即可找到对应的会话是什么,然后再判断会话来 以此来辨认用户状态。 在成功登录某个网站时,服务器会告诉客户端设置哪些 Cookies 信息,在后续访问页面时客户端 会把 Cookies 发送给服务器,服务器再找到对应的会话加以判断。 如果会话中的某些设置登录状态的 变量是有效的,那就证明用户处于登录状态,此时返回登录之后才可以查看的网页内容,浏览器再进行解析便可以看到了。所以, Cookies 和会话需要配合,一个处于客户端,一个处于服务端,二者共同协作,就实现了登录会话控制。
属性结构
其中每个条目可以称为 Cookie。 它有如下几个属性。
Name: 该 Cookie 的名称。一旦创建,该名称便不可更改。
Value: 该 Cookie 的值。 如果值为 Unicode字符,需要为字符编码。 如果值为二进制数据,则需要使用 BASE64 编码。
Domain :可以访问该Cookie的域名。 例如,如果设置为.zhihu.com,则所有以 zhihu.com结尾的域名都可以访问该 Cookie。
Max Age: 该 Cookie失效的时间, 单位为秒,也常和 Expires一起使用,通过它可以计算出其有效时间。 Max Age 如果为正数,贝lj该 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 字段决定了过期的时间。
5、基本原理
我们在做爬虫的过程巾经常会遇到这样的情况, 最初爬虫正常运行,正常抓取数据,一切看起来都是那么美好,然而一杯茶的功夫可能就会出现错误,出现这种现象的原因是网站采取了一些反爬虫措施。比如,服务器会检测某个IP在单位时间内的请求次数,如果超过了这个阔值,就会直接拒绝服务,返回一些错误信息,这种情况可以称为封 IP。
5.1、 基本原理
代理实际上指的就是代理服务器,英文叫作 proxy server,它的功能是代理网络用户去取得网络信息。 形象地说,它是网络信息的中转站。 在我们正常请求一个网站时, 是发送了请求给 Web 服务器, Web 服务器把响应传回给我们。 如果设置了代理服务器, 实际上就是在本机和服务器之间搭建了一个桥, 此时本机不是直接向 Web 服务器发起请求,而是向代理服务器发出请求,请求会发送给代理服务器,然后由代理服务器再发送给 Web 服务器,接着由代理服务器再把 Web 服务器返回的响应转发给本机。 这样我们同样可以正常访问网页,但这个过程中 Web 服务器识别出的真实 IP 就不再是我们本机的 IP 了,就成功实现了 IP 伪装,这就是代理的基本原理。
5.2 、代理的作用
突破门身IP访问限制,访问一些平时不能访问的站点。
访问一些单位或团体内部资惊:比如使用教育网内地址段免费代理服务器,就可以用于对教育网开放的各类 FTP下载上传,以及各类资料查询共享等服务。
提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同 时也将其保存到缓冲区中,当其他用户再访问相同的信息时,则直接由缓冲区中取出信息, 传给用户,以提高访问速度。
隐藏丘实 IP: 上网者也可以通过这种方法隐藏向己的IP, 免受攻击。 对于爬虫来说,我们用代理就是为了隐藏向身 IP,防止自身的 IP 被封锁。
5.3、爬虫代理
对于爬虫来说,由于爬虫爬取速度过快,在爬取过程中可能遇到同一个 IP 访问过于频繁的问题, 此时网站就会让我们输入验证码登录或者直接封锁IP,这样会给爬取带来极大的不便。
使用代理隐藏真实的 IP,让服务器误以为是代理服务器在请求自己。 这样在爬取过程中通过不断更换代理,就不会被封锁,可以达到很好的爬取效果。
5.4、代理分类
代理分类时,既可以根据协议区分,也可以根据其匿名程度区分。
5.4.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 不一定能做到。
5.4.2、根据匿名程度区分
根据代理的匿名程度,代理可以分为如下类别。
高度匿名代理: 会将数据包原封不动地转发,在服务端看来就好像真的是一个普通客户端在访问,而记录的 IP 是代理服务器的 IP。
普通匿名代理: 会在数据包上做一些改动, 服务端上有可能发现这是个代理服务器,也有一定几率追查到客户端的真实IP。 代理服务器通常会加入的HTTP头有HTTP_VIA和 HTTP_X_FORWORDED_FOR。
透明代理: 不但改动了数据包还会告诉服务器客户端的真实 IP。 这种代理除了能用缓存技术提高浏览速度,能用内容过滤提高安全性之外,并无其他显著作用,最常见的例子是内网 巾的硬件防火墙。
间谍代理: 指组织或个人创建的用于记录用户传输的数据,然后进行研究、 监控等目的的代理服务器。
5.5、常见代理设置
使用网上的免费代理: 最好使用高匿代理, 另外可用的代理不多,需要在使用前筛选一下可用代理,也可以进一步维护一个代理池。
使用付费代理服务: 互联网上存在许多代理商,可以付费使用, 质量比免费代理好很多。
ADSL 拨号:拨一次号换一次 IP,稳定性高,也是一种比较有效的解决方案。