2.1 HTTP基本原理
2.1.1 URI 和URL
URI:统一资源标志符
URL:统一资源定位符
URN:统一资源名称。只命名资源,不定位资源。URN用的少。
基本所有URI都是URL。
2.1.2 超文本
网页是由超文本解析而成,网页源代码就是一系列HTML代码,里面包含了一系列的标签,浏览器解析标签,就形成了我们平时看到的网页,而网页的源代码也可以称为HTML。
2.1.3 HTTP 和 HTTPS
URL 开头会是http、https、ftp、sftp、smb等等,这些都是协议类型。在爬虫中,主要抓取的就是http和https这两种协议。
HTTP:超文本传输协议。用于从网络传输超文本数据到本地浏览器的传送协议。目前广泛使用:HTTP1.1
HTTPS:是以安全为目标的HTTP通道,简单来说就是HTTP的安全版,即在HTTP下加入SSL层。HTTPS的安全基础就是SSL,因此传输的内容都是通过SSL加密的。它的主要作用分为两种:
1、建立一个安全通道来保证数据传输的安全。
2、确认网站的真实性,凡是使用了HTTPS的网站,都可以通过点击浏览器地址栏的锁头标志来查看网站认证之后的真实信息。
2.1.4 HTTP请求过程
1、Name:请求的名称,一般将URL的最后一部分内容当作名称。
2、Status:状态码,200正常。通过状态码来判断发送了请求之后是否得到了正常的响应。
3、Type:请求文档的类型。document指的就是,我们这次请求一个HTML文档,内容就是一些HTML代码。
4、Initiator:请求源,用来标记请求是哪个对象或者进程发起的。
5、Size:从服务器下载的文件和请求资源的大小。如果是缓存中取得的资源,该列会显示:from cache
6、Time:发起请求到获取相应所用的时间。
7、Waterfall:网络请求的可视化瀑布流。
2.1.5 请求
请求:由客户端向服务器端发出,分为四部分的内容:
1、请求方法
2、请求的网址
3、请求头
4、请求体
1、请求方法:GET和POST
GET:输入URL并且回车,那就是一个GET请求。
POST:大多是在表单提交时发起。例如:输入用户名和密码之后,点击登录,那这时就发起一个POST请求。
GET和POST方法的区别:
GET请求中的参数会包含在URL里面,数据可以在URL中看到。
POST请求的URL不会包含这些数据,数据都是通过表单的形式传输,会包含在请求体中。
GET请求提交的数据最多1024个字节,POST没有限制。
2、请求的网址:即URL
3、请求头:用来说明服务器要使用的附加信息。
以下是一些常用的头信息:
4、请求体:
请求体一般都是POST请求中的表单数据,对于GET请求,请求体则为空。
在爬虫中,如果要构造POST请求,需要使用正确的Content-Type,并且了解各个请求库的各个参数设置时使用的是那种Concent-Type,不然可能会导致POST提交了之后无法响应。
2.1.6 响应
响应:由服务端返回给客户端,可以分为三部分:响应状态码、响应头、响应体。
1、响应状态码:
表示服务器的响应状态。以下是常见的响应状态码:
2、响应头
响应头包含了服务器请求的应答信息。
3、响应体:响应的正文数据都在响应体中。
在做爬虫时,我们主要通过响应体得到的网页源代码、JSON数据等,然后从中做内容提取。
2.2 网页基础
2.2.1 网页的组成
网页可以分为三大部分:HTML、CSS、JavaScript。
1、HTML:
网页包含文字、按钮、图片和视频等各种复杂的元素,其基础架构就是HTML,不同类型的元素用不同类型的标签来表示。
2、CSS:(层叠样式表)
层叠:当在HTML中引用了数个样式文件,并且当样式发生冲突时,浏览器能依据层叠顺序进行处理。
样式:文字的大小、颜色、元素间距等等格式。
引入CSS,页面会更加美观。
3、JavaScript:
HTML与CSS配合使用,提供给用户的仅仅只是静态信息,缺乏交互性。如下载进度条、提示框、轮播图等等,这都是JavaScript的作用,它实现了页面与用户实时、动态、交互的页面功能。
2.2.2 网页的结构
一个网页的标准形式:html标签内嵌套head和body标签,head内定义网页的配置和引用,body内定义网页的正文。
2.2.3 节点树以及节点间的关系
在HTML中,所有标签定义的内容都是节点,它们构成了一个HTML DOM树。
DOM:文档对象模型。它定义了HTML和XML文档的标准:DOM是中立与平台与语言之间的接口,它允许程序和脚本动态地访问和更新文档的内容,结构和格式。
W3C DOM标准被分为三个不同的部分:
核心 DOM:针对任何结构化文档的标准模型。
XML DOM:针对XML文档的标准模型。
HTML DOM:针对HTML文档的标准模型。
HTML DOM将HTML文档视为树结构,这种结构被称为节点树。
通过HTML DOM, 树中所有的节点都能通过JS访问,所有的HTML节点元素可以被修改,也可以被创建和删除。
可以通过数据结构中树的术语来描述节点与节点之间的关系:
2.2.4 选择器
网页是由一个个节点构成,CSS选择器会根据节点的不同来设置不同的样式规则。以下会列出CSS选择器定位节点的语法规则。
CSS选择器还支持嵌套选择,eg:
#container .wrapper p
先选择id为container的节点,然后选中其内部的class为wrapper的节点,之后再进一步选中内部的p节点。
如果中间不加空格,则表示并且关系。
2.3 爬虫的基本原理
2.3.1 爬虫概述:
爬虫就是获取并且提取和保存信息的自动化程序。
1、获取网页(获取网页源代码)
过程:向网站的服务器发送一个请求,返回的响应体便是网页源代码。
关键部分就是构造一个请求发送给服务器,然后接收到响应,并且将其解析出来。
方法:python有许多库可以帮助完成这个过程。例如:urllib、requests等。可以用这些库帮助我们完成HTTP请求操作,请求和响应都可以用类库提供的数据结构来表示,得到响应之后就只需要解析数据结构中的Body部分即可。
2、提取信息(分析网页源代码,提取数据)
方法:
一、最通用的就是正则表达式(万能),但比较复杂容易出错。
二、利用一些根据网页节点属性、CSS选择器或者XPath来提取网页信息的库:Beautiful Soup、 pyquery、lxml
3、保存数据:
可以简单保存为TXT文本或者JSON文本
也可以保存在数据库,MySQL和MongoDB
也可以保存在远程服务器,如借助SETP进行操作。
2.3.2 能抓取什么样的数据
HTML代码、JSON字符串(其中API接口大多采用这种形式)、各种二进制数据(图片、视频和音频)、各种扩展名文件(CSS、JS和配置文件)。
上述内容都对应各自的URL,是基于HTTP或者HTTPS协议,只要是这种数据,爬虫都可以进行抓取。
2.4 会话(Session)和Cookies
2.4.1 静态网页和动态网页
静态网页:文字、图片等内容都是通过HTML代码来指定,加载快、编写简答。但是无法根据URL多变地展示内容。
动态网页:可以动态解析URL中参数的变化,关联数据库并且展现不同的页面内容。
动态网页还能实现用户登录和注册的功能。输入用户名和密码之后,类似于拿到了一个凭证,可以保持登录状态,才能访问登录之后才能看到的页面。这个凭证就是Session和Cookies产生的结果。
2.4.2 无状态HTTP
HTTP的无状态:HTTP协议对于事物处理是没有记忆能力的,也就是说服务器不知道客户端是什么样的状态。服务器不会记录前后的状态,也就是缺少状态记录。如果后续需要处理前面的信息,那么就需要重传。
用于维护HTTP协议连接状态的技术:Session和Cookies。
Session:在服务端(网站服务器),保存用户信息。
Cookies:在客户端(浏览器端),有了Cookies浏览器会在下次访问网页的时候自动附带上它发送给服务器,服务器通过识别Cookies并且鉴定出是哪个客户,然后再判断用户是否是登录状态,然后返回对应的响应。(可以理解为:Cookies本身保存了凭证,只要携带Cookies那就可以不用再输入用户名和密码登录而直接访问网页了)
因此在爬虫中,有时候需要处理需要登录才能访问的界面,我们一般直接将登陆成功后获取的Cookies放在请求头里面直接请求,而不必重新模拟登录。
1、会话Session
会话对象用来存储特定用户会话所需要的属性及其配置信息。当用户在应用程序的Web页之间跳转时,存储在会话对象中的变量不会丢失,而是在整个用户会话中一直存在下去。
当用户请求来自应用程序的Web页时,如果该用户还没有会话,则Web服务器将自动创建一个会话对象。当会话过期或者被放弃之后,服务器将终止会话。
2、Cookies
是指某些网站为了辨别用户身份、进行会话跟踪而存储在用户本地终端上的数据。
2.4.3 常见误区
除非程序通知服务器删除一个Session,否则服务器会一直保留
2.5 代理的基本原理
问题:“您的IP访问频率太高”
原因:网站采取了反爬虫措施。(比如检测某个IP在单位时间内的请求次数,如果超过了这个阈值,则拒绝服务,返回错误信息,这种称为封IP)
解决方法:借助某种方式来伪装IP,让服务器识别不出是我们本机发起的请求即可。
一种有效的方法:代理。
2.5.1 基本原理
代理实际上是指代理服务器,proxy server。
功能:代理用户去取得网络信息,就是网络信息的中转站。
正常:本机–>Web服务器–>本机
代理:本机–>代理服务器–>Web服务器–>代理服务器–>本机
2.5.2 代理的作用
2.5.3 代理分类
2.5.4 常见代理设置
使用网上的免费代理:
最好使用高匿代理,另外可用的代理不多,需要使用前筛选一下可用代理,可以进一步维护一个代理池。
使用付费代理服务:
互联网上存在许多代理商,可以付费使用,质量比免费代理好很多
ADSL拨号:
拨一次号换一次IP,稳定性高,比较有效。
这是第二章的主要内容啦~