数据之路 - Python爬虫 - HTTP/网页/代理 基础

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 17:19   2605   0

转载:https://cuiqingcai.com/5052.html

一、HTTP基本概念

1.URL

URL的全称为Universal Resource Locator,即统一资源定位符。基本格式如下

scheme://host[:port#]/path/../[?query-string][#anchor]

# scheme:协议(http、https、ftp)
# host:服务器IP地址
# port#:服务器端口
# path:访问资源路径
# query-string:参数、发送给http服务器的数据
# anchor:锚(跳转到网页的指定锚点位置)

2.超文本

超文本又被称为:hypertext,网页的源代码HTML就可以称作超文本。

3.HTTP与HTTPS

HTTP的中文名叫作超文本传输协议。HTTP协议是用于从网络传输超文本数据到本地浏览器的传送协议,它能保证高效而准确地传送超文本文档。

HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,简称为HTTPS。它能建立一个信息安全通道来保证数据传输的安全;其次,能帮助确认网站的真实性。

4.HTTP请求

在浏览器中输入一个URL,回车之后便会在浏览器中观察到页面内容。

实际过程:浏览器向网站所在的服务器发送了一个请求,

     网站服务器接收到这个请求后进行处理和解析,然后返回对应的响应,接着传回给浏览器。

     浏览器解析响应中的源代码,将网页内容呈现了出来

- 请求

请求,由客户端向服务端发出,可以分为4部分内容:请求方法(Request Method)、请求的网址(Request URL)、请求头(Request Headers)、请求体(Request Body)。

常见请求为GET和POST请求,区别如下:

  • GET请求中的参数包含在URL里面,数据可以在URL中看到,而POST请求的URL不会包含这些数据,数据都是通过表单形式传输的,会包含在请求体中。

  • GET请求提交的数据最多只有1024字节,而POST方式没有限制。

- 请求的网址

请求的网址,即统一资源定位符URL,它可以唯一确定我们想请求的资源。

- 请求头

请求头,用来说明服务器要使用的附加信息,比较重要的信息有Cookie、Referer、User-Agent等。

  • Accept:请求报头域,用于指定客户端可接受哪些类型的信息。

  • Accept-Language:指定客户端可接受的语言类型。

  • Accept-Encoding:指定客户端可接受的内容编码。

  • Host:用于指定请求资源的主机IP和端口号。

  • Cookie:也常用复数形式 Cookies,这是网站为了辨别用户进行会话跟踪而存储在用户本地的数据。它的主要功能是维持当前访问会话。

  • Referer:此内容用来标识这个请求是从哪个页面发过来的,服务器可以拿到这一信息并做相应的处理,如作来源统计、防盗链处理等。

  • User-Agent:简称UA,它是一个特殊的字符串头,可以使服务器识别客户使用的操作系统及版本、浏览器及版本等信息。在做爬虫时加上此信息,可以伪装为浏览器;如果不加,很可能会被识别出为爬虫。

  • Content-Type:也叫互联网媒体类型(Internet Media Type)或者MIME类型,在HTTP协议消息头中,它用来表示具体请求中的媒体类型信息。对照表:http://tool.oschina.net/commons

- 请求体

请求体一般承载的内容是POST请求中的表单数据,而对于GET请求,请求体则为空。

content-type提交数据的方式
application/x-www-form-urlencoded 表单数据
multipart/form-data 表单文件上传
application/json 序列化JSON数据
text/xml XML数据

5.HTTP响应

响应,由服务端返回给客户端,可以分为三部分:响应状态码(Response Status Code)、响应头(Response Headers)和响应体(Response Body)。

- 响应状态码

相应状态码说明详情
300多种选择针对请求,服务器可执行多种操作
301永久移动请求的网页已永久移动到新位置,即永久重定向
302临时移动请求的网页暂时跳转到其他页面,即暂时重定向
303查看其他位置如果原来的请求是POST,重定向目标文档应该通过GET提取
304未修改此次请求返回的网页未修改,继续使用上次的资源
305使用代理请求者应该使用代理访问该网页
307临时重定向请求的资源临时从其他位置响应
400错误请求服务器无法解析该请求
401未授权请求没有进行身份验证或验证未通过
403禁止访问服务器拒绝此请求
404未找到服务器找不到请求的网页
405方法禁用服务器禁用了请求中指定的方法
406不接受无法使用请求的内容响应请求的网页
407需要代理授权请求者需要使用代理授权
408请求超时服务器请求超时
409冲突服务器在完成请求时发生冲突
410已删除请求的资源已永久删除
411需要有效长度服务器不接受不含有效内容长度标头字段的请求
412未满足前提条件服务器未满足请求者在请求中设置的其中一个前提条件
413请求实体过大请求实体过大,超出服务器的处理能力
414请求URI过长请求网址过长,服务器无法处理
415不支持类型请求格式不被请求页面支持
416请求范围不符页面无法提供请求的范围
417未满足期望值服务器未满足期望请求标头字段的要求
500服务器内部错误服务器遇到错误,无法完成请求
501未实现服务器不具备完成请求的功能
502错误网关服务器作为网关或代理,从上游服务器收到无效响应
503服务不可用服务器目前无法使用
504网关超时服务器作为网关或代理,但是没有及时从上游服务器收到请求
505HTTP版本不支持 服务器不支持请求中所用的HTTP协议版本

- 响应头

响应头包含了服务器对请求的应答信息,如Content-Type、Server、Set-Cookie等。

  • Date:标识响应产生的时间。

  • Last-Modified:指定资源的最后修改时间。

  • Content-Encoding:指定响应内容的编码。

  • Server:包含服务器的信息,比如名称、版本号等。

  • Content-Type:文档类型,指定返回的数据类型是什么。

  • Set-Cookie:设置Cookies。响应头中的Set-Cookie告诉浏览器需要将此内容放在Cookies中,下次请求携带Cookies请求。

  • Expires:指定响应的过期时间,可以使代理服务器或浏览器将加载的内容更新到缓存中。如果再次访问时,就可以直接从缓存中加载,降低服务器负载,缩短加载时间

- 响应体

响应的正文数据都在响应体中,我们做爬虫请求网页后,要解析的内容就是响应体。

二、网页基础

1.网页组成

网页可以分为三大部分——HTML、CSS和JavaScript。如果把网页比作一个人的话,HTML相当于骨架,JavaScript相当于肌肉,CSS相当于皮肤,三者结合起来才能形成一个完善的网页。

- HTML

HTML是用来描述网页的一种语言,其全称叫作Hyper Text Markup Language,即超文本标记语言。网页包括文字、按钮、图片和视频等各种复杂的元素,其基础架构就是HTML。不同类型的文字通过不同类型的标签来表

示,它们之间的布局又常通过布局标签div嵌套组合而成,各种标签通过不同的排列和嵌套才形成了网页的框架。

- CSS

HTML定义了网页的结构,但是只有HTML页面的布局并不美观,可能只是简单的节点元素的排列,CSS是目前唯一的网页页面排版样式标准,借助于CSS能让页面变得更为美观。

在网页中,一般会统一定义整个网页的样式规则,并写入CSS文件中(其后缀为css)。在HTML中,只需要用link标签即可引入写好的CSS文件,这样整个页面就会变得美观、优雅。

- JavaScript

JavaScript,简称JS,是一种脚本语言。HTML和CSS配合使用,提供给用户的只是一种静态信息,缺乏交互性。我们在网页里可能会看到一些交互和动画效果,如下载进度条、提示框、轮播图等,这通常就是JavaScript

的功劳。它的出现使得用户与信息之间不只是一种浏览与显示的关系,而是实现了一种实时、动态、交互的页面功能。

2.节点与节点树

在HTML中,所有标签定义的内容都是节点,它们构成了一个HTML DOM树。

根据W3C的HTML DOM标准,HTML文档中的所有内容都是节点。

  • 整个文档是一个文档节点;

  • 每个HTML元素是元素节点;

  • HTML元素内的文本是文本节点;

  • 每个HTML属性是属性节点;

  • 注释是注释节点。

3.选择器

选择器例子例子描述
.class.intro选择class="intro"的所有节点
#id#firstname选择id="firstname"的所有节点
**选择所有节点
elementp选择所有p节点
element,elementdiv,p选择所有div节点和所有p节点
element elementdiv p选择div节点内部的所有p节点
element>elementdiv>p选择父节点为div节点的所有p节点
element+elementdiv+p选择紧接在div节点之后的所有p节点
[attribute][target]选择带有target属性的所有节点
[attribute=value][target=blank]选择target="blank"的所有节点
[attribute~=value][title~=flower]选择title属性包含单词flower的所有节点
:linka:link选择所有未被访问的链接
:visiteda:visited选择所有已被访问的链接
:activea:active选择活动链接
:hovera:hover选择鼠标指针位于其上的链接
:focusinput:focus选择获得焦点的input节点
:first-letterp:first-letter选择每个p节点的首字母
:first-linep:first-line选择每个p节点的首行
:first-childp:first-child选择属于父节点的第一个子节点的所有p节点
:beforep:before在每个p节点的内容之前插入内容
:afterp:after在每个p节点的内容之后插入内容
:lang(language)p:lang选择带有以it开头的lang属性值的所有p节点
element1~element2p~ul选择前面有p节点的所有ul节点
[attribute^=value]a[src^="https"]选择其src属性值以https开头的所有a节点
[attribute$=value]a[src$=".pdf"]选择其src属性以.pdf结尾的所有a节点
[attribute*=value]a[src*="abc"]选择其src属性中包含abc子串的所有a节点
:first-of-typep:first-of-type选择属于其父节点的首个p节点的所有p节点
:last-of-typep:last-of-type选择属于其父节点的最后p节点的所有p节点
:only-of-typep:only-of-type选择属于其父节点唯一的p节点的所有p节点
:only-childp:only-child选择属于其父节点的唯一子节点的所有p节点
:nth-child(n)p:nth-child选择属于其父节点的第二个子节点的所有p节点
:nth-last-child(n)p:nth-last-child同上,从最后一个子节点开始计数
:nth-of-type(n)p:nth-of-type选择属于其父节点第二个p节点的所有p节点
:nth-last-of-type(n)p:nth-last-of-type同上,但是从最后一个子节点开始计数
:last-childp:last-child选择属于其父节点最后一个子节点的所有p节点
:root:root选择文档的根节点
:emptyp:empty选择没有子节点的所有p节点(包括文本节点)
:target#news:target选择当前活动的#news节点
:enabledinput:enabled选择每个启用的input节点
:disabledinput:disabled选择每个禁用的input节点
:checkedinput:checked选择每个被选中的input节点
:not(selector):not选择非p节点的所有节点
::selection::selection选择被用户选取的节点部分

4.动态网页与静态网页

静态网页的内容是HTML代码编写的,文字、图片等内容均通过写好的HTML代码来指定。

动态网页应运而生,它可以动态解析URL中参数的变化,关联数据库并动态呈现不同的页面内容。

5.会话和cookies

会话,其本来的含义是指有始有终的一系列动作/消息。会话在服务端,也就是网站的服务器,用来保存用户的会话信息;

Cookies指某些网站为了辨别用户身份、进行会话跟踪而存储在用户本地终端上的数据。Cookies在客户端,也可以理解为浏览器端,有了Cookies,浏览器在下次访问网页时会自动附带上它发送给服务器,服务器通过识

别Cookies并鉴定出是哪个用户,然后再判断用户是否是登录状态,然后返回对应的响应。

cookies属性:

  • Name:该Cookie的名称。一旦创建,该名称便不可更改。

  • Value:该Cookie的值。如果值为Unicode字符,需要为字符编码。如果值为二进制数据,则需要使用BASE64编码。

  • Domain:可以访问该Cookie的域名。

  • Max Age:该Cookie失效的时间,单位为秒,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

三、爬虫基本原理

爬虫就是获取网页并提取和保存信息的自动化程序,大致过程如下:获取网页、提取信息、保存数据、自动化程序。

通用爬虫抓取过程(baidu为例):

选取一部分已有url,将url放到待爬取队列

从队列取出url,然后解析DNS得到主机IP,去此IP对应的服务器里下载HTML页面,保存到搜索引擎本地服务器,然后把爬过的URL放入已爬取队列

分析网页内容,找出网页里的其他URL连接,然后执行第2步,知道爬取条件结束

四、代理

1.代理的作用

  • 突破自身IP访问限制,访问一些平时不能访问的站点。

  • 访问一些单位或团体内部资源:比如使用教育网内地址段免费代理服务器,就可以用于对教育网开放的各类FTP下载上传,以及各类资料查询共享等服务。

  • 提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也将其保存到缓冲区中,当其他用户再访问相同的信息时,则直接由缓冲区中取出信息,传给用户,以提高访问速度。

  • 隐藏真实IP:上网者也可以通过这种方法隐藏自己的IP,免受攻击。对于爬虫来说,我们用代理就是为了隐藏自身IP,防止自身的IP被封锁。

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,还支持各种身份

   验证机制、服务器端域名解析等。简单来说,SOCK4能做到的SOCKS5都可以做到,但SOCKS5能做到的SOCK4不一定能做到。

- 根据匿名程度区分

  • 高度匿名代理:会将数据包原封不动地转发,在服务端看来就好像真的是一个普通客户端在访问,而记录的IP是代理服务器的IP。

  • 普通匿名代理:会在数据包上做一些改动,服务端上有可能发现这是个代理服务器,也有一定几率追查到客户端的真实IP。代理服务器通常会加入的HTTP头有HTTP_VIAHTTP_X_FORWARDED_FOR。

  • 透明代理:不但改动了数据包,还会告诉服务器客户端的真实IP。这种代理除了能用缓存技术提高浏览速度,能用内容过滤提高安全性之外,并无其他显著作用,最常见的例子是内网中

  • 间谍代理:指组织或个人创建的用于记录用户传输的数据,然后进行研究、监控等目的的代理服务器。

3.代理设置

4.代理池

代理池分为4个模块: 存储模块、获取模块、检测模块、接口模块。

存储模块:负责存储抓取下来的代理。 首先要保证代理不重复, 要标识代理的可用情况,还要动态实时处理每个代理,所以一种比较高效和方便的存储方式就是使用Redis 的SortedSet,即有序集合。

获取模块:需要定时在各大代理网站抓取代理。 代理可以是免费公开代理也可以是付费代理,代理的形式都是IP加端口,此模块尽量从不同来源获取,尽量抓取高匿代理,抓取成功之后将可用代理保存到数据库中。

检测模块:需要定时检测数据库中的代理。 这里需要设置一个检测链接,最好是爬取哪个网站就检测哪个网站,这样更加有针对性,如果要做一个通用型的代理,那可以设置百度等链接来检测。 另外,我们需要标识每一个代理的状态,如设置分数标识,100分代表可用,分数越少代表越不可用。 检测

一次,如果代理可用,我们可以将分数标识立即设置为100 满分,也可以在原基础上加l分;如果代理不可用,可以将分数标识减l分,当分数戚到一定阔值后,代理就直接从数据库移除。 通过这样的标识分数,我们就可以辨别代理的可用情况,选用的时候会更有针对性。

接口模块:需要用API来提供对外服务的接口。 其实我们可以直接连接数据库采取对应的数据,但是这样就需要知道数据库的连接信息,并且要配置连接,而比较安全和方便的方式就是提供一个WebAPI接口,我们通过访问接口即可拿到可用代理。 另外,由于可用代理可能有多个,那么我们可以设置一个随机返回某个可用代理的接口,这样就能保证每个可用代理都可以取到,实现负载均衡。

5.Cookies池

Cookies 池架构的基本模块分为4块:存储模块、 生成模块、检测模块和接口模块。 每个模块的功能如下。

存储模块:负责存储每个账号的用户名密码以及每个账号对应的Cookies信息,同时还需要提供一些方法来实现方便的存取操作。

生成模块:负责生成新的Cookies。 此模块会从存储模块逐个拿取账号的用户名和密码,然后模拟登录目标页面,判断登录成功,就将Cookies返回并交给存储模块存储。

检测模块:需要定时检测数据库中的Cookies。 在这里我们需要设置一个检测链接,不同的站点检测链接不同,检测模块会逐个拿取账号对应的Cookies去请求链接,如果返回的状态是有效的,那么此Cookies没有失效,否则Cookies失效并移除。 接下来等待生成模块重新生成即可。

接口模块:需要用API来提供对外服务的接口。 由于可用的Cookies可能有多个, 我们可以随机返回Cookies的接口,这样保证每个Cookies都有可能被取到。 Cookies越多, 每个Cookies被取到的概率就会越小,从而减少被封号的风险。

6.ASDL代理

ADSL ( Asymmetric Digital Subscriber Line, 非对称数字用户环路),它的上行和下行带宽不对称,它采用频分复用技术把普通的电话线分成了电话、上行和下行3个相对独立的信道,从而避免了相互之间的干扰。

ADSL通过拨号的方式上网,需要输入ADSL账号和密码, 每次拨号就更换一个LP。 IP分布在多个A段,如果E都能使用,则意味着E量级可达千万。 如果我们将ADSL主机作为代理,每隔一段时间主机拨号就换一个IP,这样可以有效防止E被封禁。 另外, 主机的稳定性很好,代理响应速度很快。

转载于:https://www.cnblogs.com/Iceredtea/p/11026017.html

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP