您的位置:首页 > 编程语言 > Python开发

python网络爬虫教程(一):一篇文章轻松搞定网络基础

2020-06-28 05:07 489 查看

网络爬虫是一种高效的信息采集利器,利用她可以快速、准确地采集我们想要的各种数据资源,在这个充满各种信息的时代,大数据深刻地改变着我们的工
作和生活,而数据的获取很大程度上依赖于爬虫的爬取。

在开始系统地学习网络爬虫之前,我们需要对网络基础有一定的了解,如服务器请求的收发原理、HTTP原理、爬虫的基本原理等,在本章中我们就对这些基础知识做一个简单的总结。

URL概念

URL是Uniform Resource Locator的简称,翻译过来就是“统一资源定位符”,在访问网络资源时,我们可以用它来唯一指定它的访问方式,简单来说URL其实是一个链接,不过这样的说法其实并不严谨。
URL的组成格式为:

协议名://资源名

其中“协议名”为获取资源所用的传输协议,包括http、https、ftp等,关于传输协议我们将会在下节讲到;“资源名”则是资源完整的地址,包括主机名、端口号、文件名等。举例来说,https://www.baidu.com是百度的网站链接,https是远程服务器与用户主机之间数据交换的传输协议,www.baidu.com则是资源所在地址。

HTTP/HTTPS协议

在爬虫中,我们抓取的页面通常是http或https协议的,但是我们偶尔也会看到ftp、sftp等为开头的URL,它们都是协议类型,这里我们先了解一下常用的两个协议的含义。

1. HTTP协议

HTTP是Hyper Text Transfer Protocol的缩写,即超文本传输协议,HTTP协议是用于从网络传输超文本数据到本地浏览器的传送协议,它能保证高效而准确地传输超文本文档。
HTTP/1.1一共定义了8种请求方法:OPTIONS、HEAD、GET、POST、PUT、DELETE、TRACE、和CONNECT。但在HTTP访问中,一般使用GET和POST,关于以上请求方式,后面会有详细的介绍

2. HTTPS协议

HTTPS全称是Hyper Text Transfer Protocol over Secure Socket Layer,即超文本传输安全协议,是以安全为目标的HTTP通道,用以提供加密通信及对网络服务器身份的鉴定,是HTTP的安全版,在HTTP下加入SSL层,因此通过它传输的内容都是经过SSL加密的,现在越来越多的网站和APP都已经向HTTPS的方向发展。

HTTP请求

1. TCP/IP协议

在HTTP工作开始之前,用户主机需要与web服务器建立连接,这种连接是通过TCP/IP协议完成的,所以在学习HTTP请求过程之前,需要先了解TCP/IP协议。
TCP/IP协议是由TCP和IP两个协议共同构成的,IP(Internet Protocol)协议是低级的路由协议,它将数据包拆分在许多个小数据包中,并通过网络将它们发送到某一特定地址,但无法保证所有包都抵达目的地,也不能保证包的顺序,因此网络通信还需要TCP协议。TCP(Transmission Contrl Protocol)是一种高层次的协议,如果有些数据包没有收到会重发,并对数据包内容的准确性进行检查并保证包的顺序,因此TCP/IP协议能保证数据包安全并有序地将数据发送到目的地。

2. HTTP请求过程

HTTP是比TCP更高层次的应用层协议,根据规则,只有低级协议建立之后才能进行更高层协议的连接,因此首先要建立TCP连接,连接建立之后,浏览器就会向web服务器发送请求命令,服务器接收到这个请求后进行处理和解析,然后返回对应的响应,接着传回给浏览器。响应里包含页面的源代码等内容,有了源代码之后,我们就可以对其中的内容进行解析和提取,从何获得我们想要的数据,这就是我们进行网络爬虫任务的一般方法,模型如下图所示:

利用Chrome浏览器我们可以更加直观地看到这个过程,首先打开Chrome浏览器,右键单击”检查“即可打开开发者选项,接着在地址栏中输入百度的URL:https://www.baidu.com后回车,接着我们可以看到在Network页面下浏览器与服务器之间进行交互的一系列请求和响应:
在这些请求中一共有7列,分别显示了请求和响应的各种信息:
Name:请求的名称,一般会将URL的最后一部分内容当作名称。
Status:响应的状态码,200表示响应正常。
Type:文档类型,如document表示一个HTML文档,返回的内容是HTML代码,png及jpeg表示图片。
Initiator:请求源,用来标记请求是由哪个对象或进程发起的。
Size:从服务器下载的文件和请求的资源大小,如果是从缓存中取得的资源,则该列会显示from cache。
Time:发起请求到获取响应所用的时间。
Waterfall:指网络请求的可视化瀑布流。
点击www.baidu.com这个条目可以看到更为详细的信息:
General部分,Request URL为请求的URL,Request Method为请求的方法,Status Code为响应的状态码,Remote Address为远程服务器的地址和端口,Referrer Policy为Referrer判别策略。
再继续往下,可以看到请求头Request Headers和响应头Response Headers,请求头里带有许多请求信息,例如浏览器标识,Cookie、Host等信息,这是请求的一部分,而响应头也是响应的一部分,其中包含了服务器类型、文档类型、时间戳等信息,浏览器接收到响应后会解析响应内容,从而在浏览器上展现出来。下面我们来详细介绍一下请求和响应:

1. 请求(Request)

1. 请求方法
在向服务器发送请求的过程中,首先要确定请求方法,常见的请求方法有两种:GET和POST。
打开浏览器,在百度搜索栏中输入”爬虫“:


便可以在地址栏中看到如下信息:
当我们按下回车键以后,浏览器便发起了一个GET请求,在这个URL中,包括了请求地址、参数等信息,不难看出,”wd“后边是我们搜索的关键字,事实上,GET请求的参数包含在URL里,数据可以在URL中看到。我们不妨可以验证一下以上结论,在浏览器中输入以下信息:
理论上该GET请求会返回在百度上搜素python的相关内容,按下回车以后出现以下页面: 说明我们可以通过自定义URL参数获得我们想要的信息。一般来说,在登陆时,需要提交用户名和密码,其中包含了敏感信息,如果我们仍然用GET请求的话,密码就会暴露在URL里面,造成密码泄露,所以就有了POST请求,POST请求的URL不会包含参数,数据会以表单形式传输,会包含在请求体中,需要注意的是,GET请求提交的数据最多只有1024个字节,而POST没有限制,所以在上传文件时,由于文件内容比较大,通常也会选用POST请求。以下引用一位网友的回答来形象地描述TCP、HTTP、GET和POST之间的关系:

在我大万维网世界中,TCP就像汽车,我们用TCP来运输数据,它很可靠,从来不会发生丢件少件的现象。但是如果路上跑的全是看起来一模一样的汽车,那这个世界看起来是一团混乱,送急件的汽车可能被前面满载货物的汽车拦堵在路上,整个交通系统一定会瘫痪。为了避免这种情况发生,交通规则HTTP诞生了。HTTP给汽车运输设定了好几个服务类别,有GET, POST, PUT, DELETE等等,HTTP规定,当执行GET请求的时候,要给汽车贴上GET的标签(设置method为GET),而且要求把传送的数据放在车顶上(url中)以方便记录。如果是POST请求,就要在车上贴上POST的标签,并把货物放在车厢里。当然,你也可以在GET的时候往车厢内偷偷藏点货物,但是这是很不光彩;也可以在POST的时候在车顶上也放一些数据,让人觉得傻乎乎的。HTTP只是个行为准则,而TCP才是GET和POST怎么实现的基本。

我们平常遇到的大部分请求都是GET和POST请求,另外还有一些请求方法,如下表:
2. 请求头(请求报文头)
上一节中我们提到了请求头Requests Headers,下面就简单说明一下请求头所包含的信息,其中比较重要的有Cookie、Referer、User-Agent等。
Accept:用以指定客户端可接受哪些类型的信息。
Accept-Language:指定客户端可接受的语言类型。
Accept-Encoding:指定客户端可接受的内容编码。
Host:用于指定请求资源的主机IP和端口号,从HTTP/1.1开始,必须包含此内容。
Cookie:这是网站为了辨别用户进行会话跟踪而储存在用户本地的数据。它的功能主要是维持当前访问会话。例如,我们输入用户名和密码登陆某个网站后,服务器会用会话保存登陆状态信息,后面我们每次刷新或请求该站点的其他页面时,发现都是登陆状态,这就是Cookie的功劳。Cookie里有信息标识了我们所对应的服务器会话,每次浏览器在请求该站点的页面时,都会在请求头中加上Cookie并将其发送给服务器,服务器通过Cookie识别出是我们自己,并查询出当前状态是登陆状态,所以返回结果是登陆之后才能看到的网页内容。
Referer:用来标识这个请求是从哪个页面发过来的。
User-Agent:可以使服务器识别客户使用的操作系统及版本、浏览器及版本等信息。在做爬虫时加上此信息可以伪装为浏览器。
Content-Type:也叫做互联网媒体类型(Internet Media Type)或者MIME类型,它用来表示具体请求中的媒体信息。例如,text/html代表HTML格式;image/gif代表图片;application/json代表JSON类型。
请求头是请求的重要组成部分,在写爬虫时,大部分情况下都需要设定请求头。
请求体
请求体一般承载的内容是POST请求中的表单数据,而对于GET请求,请求体为空。

响应(Response)

1. 请求状态码
请求状态码表示服务器的响应状态,如200代表服务器正常响应,404表示页面未找到,500代表服务器内部发生错误,更多常见状态码及错误原因可转到以下链接:HTTP状态码汇总
2. 响应头
响应头包含服务器对请求的应答信息:
Date:标识响应产生的时间。
Last-Modified:指定资源的最后修改时间。
Content-Encoding:指定响应内容的编码。
Server:包含服务器的信息。如名称、版本号等。
Content-Type:文档类型,指定返回的数据类型是什么。
Set-Cookie:设置Cookie,告诉浏览器需要将此内容放在Cookie中,下次请求携带Cookie请求。
Expires:指定响应的过期时间
3. 响应体
响应中着重要的就是响应体的内容,响应体的正文数据都放在响应体中,比如请求网页时,它的响应体是网页的HTML代码;请求一张图片时,响应体是图片的二进制数据,我们进行爬虫任务时,需要获得的数据保存在响应体中,此时就需要解析响应体。

在本章我们了解了HTTP的基本原理,大概了解了访问网页时背后的请求和响应过程,可是我们用浏览器访问网站时,页面各不相同,为什么会呈现这个样子呢?下一章我们就来了解一下网页的构成、结构和节点等内容。可点击如下链接python网络爬虫教程(二):网页基础跳转。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: