从现在开始整理爬虫的基本知识,希望能帮助到友友们,也希望能帮我点点赞什么的,给我点动力让我继续创作,加油!!!
HTTP基本原理
URI和URL的定义
URI的全称为Uniform Resource Identifier,即统一资源标志符;URL的全称为Universal Resource Locator,即统一资源定位符。
举个例子:GitHub是GitHub的网站图标链接,这个链接既是一个URL也是一个URI,URL/URI唯一指定这个链接,这里面包含访问协议HTTP,访问路径(/根目录)和资源名称。通过一个连接就可以找到这个资源,这就是URL/URI。那么这两者之间有什么不同呢,这里就要提到另一个概念URN(Universal Resource Name _统一资源名称),简单来说就是URI比URL多了一个URN,多了一个资源名称而已。目前一般的网络连接既可以称为URL也可以叫做URI,下面是它们三个的关系图:
超文本
超文本(hypertext)顾名思义就是网页的文本,我们看到的网页就是超文本解析出来的,其网页浏览代码都是HTML代码,而HTML代码就可以称作超文本。怎么检查网页源代码呢,右键之后点击检查后,或者直接按f12,然后单击Elements选项卡就可以查看当前网页的源代码,这些源代码都是超文本。
HTTP和HTTPS
在京东首页 http://www.jd.com/中,URL的开头会有http或https,这就是访问资源所需要的协议类型。有时还包括ftp、sftp、smb开头的URL,它们都是协议类型。在爬虫中,爬取的网页一般都是http或https,下面了解一下它们的含义:http https
简单来讲https就是http的安全版,即在http下加了SSL(Secure Socket Layer)层。它的主要作用有两种:建立一个信息安全通道来保证数据传输的安全,第二种是确认网站的真实性。
HTTP请求过程
在浏览器中输入一个URL,回车后便会在浏览器中观察到页面内容。实际上这个过程就是浏览器向服务器发送了一个请求,然后服务器接收到这个请求之后进行处理和解析,然后返回对应的响应,接着传回给浏览器。响应中包含了页面的源代码等内容,浏览器再进行解析,然后便将网页呈现出来了。模型如下:
此处客户端就是我们的PC或者手机浏览器,服务器即要访问网站所在的服务器。下面为了更直观说明这个过程,请打开Chrome浏览器下的Network监听组件。具体操作为打开Chrome浏览器,输入百度网址:http://www.baidu.com/,右键后点击“检查”进入Network,刷新一下就可以看到在Network页面下出现了一个个条目,其中一个条目就代表一次发送请求和接受响应的过程,观察第一个请求,即www.baidu.co,其中各列的含义:
-
第一列 Name: 请求的名称,一般会将 URL 的最后一部分内容当作名称。
-
第二列 Status: 响应的状态码,这里显示为200,代表响应是正常的。通过状态码,我们可以判断发送了请求之后是否得到了正常的响应。
-
第三列 Type: 请求的文档类型。这里为 document,代表我们这次请求的是一个 HTML 文档,内容就是一些 HTML 代码。
-
第四列 Initiator: 请求源。用来标记请求是由哪个对象或进程发起的。
-
第五列 Size: 从服务器下载的文件和请求的资源大小。如果是从缓存中取得的资源,则该列会显示 from cache。
-
第六列 Time: 发起请求到获取响应所用的总时间。
-
第七列 Waterfall: 网络请求的可视化瀑布流。
单击Headers条目,即可看到更详细的信息:有General部分,Request URL为请求的URL,Request Method为请求的方法,Status Code 为响应状态码…
再往下看有Response Headers和Request Headers,分别代表响应头和请求头。
请求
请求,客户端向服务器发起请求,其中包括请求方法(Request Method),请求的网址(Request URL),请求头(Request Header),请求体(Request Body)。
- 请求方法
请求方法有两种,第一种是Get方法,第二种是Post方法。在浏览器中输入Python按回车就是一个Get请求,请求的参数会直接包含到URL中,链接为www.baidu.com/s? wd=Python,这里参数wd表示要搜索的关键字。而Post请求方法大多用于表单提交,下面是两者之间的具体区别:
一,区别
1.url可见性
get传参方式是通过地址栏URL传递,是可以直接看到get传递的参数,post传参方式参数URL不可见,get把请求的数据在URL后通过?连接,通过&进行参数分割。psot将从参数存放在HTTP的包体内
2.传输数据大小
get传递数据是通过URL进行传递,对传递的数据长度是受到URL大小的限制,URL最大长度是2048个字符。post没有长度限制
3.后退页面
get后退不会有影响,post后退会重新进行提交
4.缓存
get请求可以被缓存,post不可以被缓存
5.编码方式
get请求只URL编码,post支持多种编码方式
6.历史记录
get请求的记录会留在历史记录中,post请求不会留在历史记录
7 字符类型
get只支持ASCII字符,post没有字符类型限制
二、post相比较get传参方式的优点
1.安全性比get传参方式好:
a.存在于HTTP包中,一般不会直接被查找到
b.post不会被浏览器进行缓存
c.不会留在历史记录中
(并不代表post一定安全,因为在HTTP下都是明文传输,post仍然可以被查找到,增加安全性最好使用https协议)
2.post没有字符和编码的限制,能发送的数据类型更多
3.post传送数据没有大小限制,比get可以发送的更多的数据
post的缺点:速度比get传输慢,get的效率更高
三、为什么get的效率比post高
1.post在接收返回来的数据会先将请求头发送给服务器确认,然后才真正的发送数据,(相当于第一次先向服务器打个招呼,第二次才将数据真正的发过来,get则是直接发送数据。专业的说法是,get产生一个TCP数据包,post产生两个TCP。数据包但并不是所有的浏览器post都会请求两次,火狐浏览器就会请求一次)总结起来就是请求的过程比get更多
2.get会将数据进行缓存
除了这两种常见的请求方法还有几种不常见的请求方法:
1.get方式用于请求数据,获取url位置的资源,获取网页,参数写在url后面,安全性相对post较差
2.post方式用于提交数据,修改数据,参数写在请求主体里,post请求不会被缓存
3.head方式主要用于请求头部资源,与get请求相似,区别是响应中只有头部,没有主体
4.option请求方式 主要有两个用途,一个是获取服务器支持的http请求方式都有哪一些,另一个作用是测试服务器的性能
5.put请求方式:向服务器发送请求,如果URI不存在,则要求服务器根据请求创建资源,如果存在,
服务器就接受请求内容,并修改URI资源的原始版本,我将会用到这个方式来创建一个写有一句话的txt文件
6.move请求方式,不在标准的八种请求方式中,可以通过option测试服务器是否支持,可以将一个指定文件移动到新路径,在路径末尾指定文件名还可以对文件进行重命名。(请求服务器将一个页面转移至另一个网络地址)tt
请求的网址,即统一资源定位符URL,它可以唯一确定想请求的资源。
请求头,用来说明服务器要使用的附加信息,比较重要的信息有 Cookie、Referrer、User-Agent等。
-
Cookie:也常用复数形式Cookies,这里是网站为了辨别用户会话的数据而存储的用户数据。它的主要功能就是维护当前的访问会话。简单来说登录了教务处系统,又进入了查取成绩页面,而没有重新登陆密码,这就是Cookie的功劳,Cookie中有信息标识了所对应的服务器会话,每次浏览器在请求该站点的页面时,都会在请求头中加上Cookie并将其发送给服务器,服务器通过Cookie识别出是我们自己,并且查出当前状态是登录状态,所以返回结果就是登录之后才能看到的页面。
-
Referrer:客户端通过这个头告诉服务器,它是从哪个资源来访问服务器的。(一般用于防盗链)
-
User-Agent:简称UA,它是一个特殊的字符串头,它可以使服务器识别客户使用的操作系统及版本、浏览器及版本等信息。在爬虫的时候加上这个信息,可以伪装成浏览器,如果不加很可能被识别出爬虫。
-
其他:ttt
-
请求体
请求体一般承载的内容是POST请求中的表单数据,而对于GET请求,请求体则为空。
登陆之前,填写了用户名和密码信息,提交时这些内容就会以表单数据的形式提交给服务器,此时需要注意的是Request Headers中指定Content-Type为application/x-www-form-urlencoded。只有设置Content Type为application/x-www-form-urlencoded,才会以表单数据的形式提交。
下表是Content Type和POST提交数据方式的关系。
Content Type | 提交数据的方式 |
---|---|
application/x-www-form-urlencoded | 单表数据 |
multiparty /form-data | 表单文件上传 |
application/json | 序列化JSON数据 |
text/xml | XLM数据 |
在爬虫中,如果要构造POST请求,需要使用正确的 Content-Type,并了解各种请求库的各个参数在设置时使用的是哪种Content-Type,不然可能导致POST提交后无法正确响应。
响应
响应,由服务器返回客户端,可以分为三个部分:响应状态码(Response Status Code)、响应头(Response Header)和响应体(Response Body)
- 响应状态码
响应状态码表示服务器的响应状态,如200就代表服务器响应正常,404代表页面未找到,500代表服务器内部发生错误。在爬虫中,可以根据响应状态码来判断服务器响应状态,如状态码为200,则证明成功返回数据,再进行进一步的处理,否则直接忽略。详细错误代码及错误原因请点击错误代码
- 响应头
响应头包含了服务器对请求的应答信息,如Content-type,Server,Set-Cookie等。下面简要说一下一些头信息。
-
Data:标识响应产生的时间。
-
Last-Modified:指定资源的最后修改时间。
-
Content-Encoding:指定响应内容的编码。
-
Server:包含服务器的信息,比如名称、版本号等。
-
Content-Type:文档类型,指定返回的数据类型是什么,如text/html代表返回HTML文档等等。
-
Set-Cookie:设置Cookie。响应头中的Set-Cookie告诉浏览器需要将此内容放在Cookie中,下次请求携带Cookie请求。。
3.响应体
最重要的当属响应体的内容了。响应的正文数据都在响应体中,比如请求网页时,它的响应体就是网页的HTML代码;
在浏览器开发者工具中单击Preview,就可以看到网页的源代码,也就是响应体的内容,它是解析的目标。在做爬虫时,主要通过响应体得到网页的源代码、JSON数据等,然后从中做出相应内容的提取。