Python爬虫自动化从入门到精通第1天(爬虫实现原理)

一,网页请求原理

本文从浏览器加载网页的角度出发,介绍了如何让爬虫模仿浏览器爬取到整个网页的数据。首先介绍了基于HTTP请求的原理,包括客户端HTTP请求和服务器端HTTP响应。通过对本文可以让读者理解网页请求的原理。

二,浏览网页过程

网络爬虫爬取数据的过程可以理解为模拟浏览器的操作的过程,我们有必要掌握浏览网页的基本过程。例如,在浏览器的地址栏中输入网址http://www.baidu.com,按【Enter】键后会在浏览器中显示百度的首页。那么,在这期间我们的浏览器的访问过程发生了什么?
通常来说,浏览网页的过程可分为下面四个步骤:
(1)浏览器通过DNS服务器查找域名对应的IP地址
(2)向IP地址对应的Web服务器发送请求
(3)Web服务器响应请求,发回HTML页面
(4)浏览器解析HTML内容并显示出来在这里插入图片描述

1. 统一资源定位符

统一资源定位符是互联网上标准资源的地址,互联网上每个文件(即资源)都有唯一的URL,它包含了文件的位置以及浏览器处理方式等信息。一个URL地址由协议头、服务器地址、文件路径三部分组成。

(1)协议头

协议头指定使用的传输协议,用于告诉浏览器如何处理将要打开的文件。不同的协议表示不同的资源查找以及传输方式。常用的协议如下:

常见协议代表类型示例
File访问本地计算机的资源file://User/itcast/Desktop/basic.html
FTP访问共享主机的文件资源ftp://ftp.badu.com/movies
HTTP超文本传输协议,访问远程网络资源https://image.baidu.com/channel/wallpaper
HTTPS安全的ssl加密传输协议,访问远程网络资源https://image.baidu.com/channel/wallpaper
Mailto访问电子邮件地址mailto:null@itcast.cn

其中最常见的是HTTP协议和HTTPS协议,分别由协议头http和https指定。

(2)服务器地址和端口

服务器地址(Hostname或IP)指存放资源的服务器的主机名或者IP地址,其目的在于标识互联网的唯一一台计算机,并通过这个地址找到这台计算机。

端口(post)是地址和冒号后面的数字,用于标识一台计算机上运行的不同程序。每个网络程序都对应一个或多个特定的端口号,例如HTTP程序的默认端口号为80,HTTPS程序的默认端口号为443。

IP地址用来给Internet上的每台计算机一个编号,但是IP地址不容易记忆,而且服务器的物理IP地址是有可能发生改变的。为此,人们又发明了域名来代替IP地址访问服务器的网站。例如,使用百度公司所在的IP地址http://180.97.33.107.com可以打开百度的首页,但是这个地址不易记忆,不如使用http://www.baidu.com访问方便。

(3)路径

路径(path)是由0个或多个“/”符号隔开的字符串,一般用于指定本次请求的资源服务器中的位置。

2. 计算机域名系统

DNS是计算机域名系统(Domain Name System)的缩写,它可以把域名转换为IP地址。域名服务器保存该网络中所有主机的域名和对应的IP地址,并具有将域名转换为IP地址的功能。在之前介绍URL的时候提到过,人们习惯用域名来访问网站。此时,浏览器需要首先访问域名服务器,从域名服务器查找该域名对应的服务器的IP地址,然后在向该IP地址对应的web服务器发送资源请求。

注: 一般一个域名的解析时间在10~60ms,并且一个域名必须对应一个IP地址,而一个IP地址可能对应零到多个域名

三,HTTP网络请求原理

浏览器的主要功能是向服务器发出请求,并在窗口显示选择的网络资源。HTTP是一套计算机通过网络进行通信的规则,他是由两部分组成:客户请求消息和服务器响应消息在这里插入图片描述

1. 分析浏览器显示完整网页的过程
当用户在浏览器的地址栏中输入一个URL地址并按下【Enter】键后,浏览器会向HTTP服务器发送HTTP请求。常用的请求包括GET和POST两种方式。
例如,当浏览器输入URL“www.baidu.com",浏览器会发送一个Request请求去获取http://www.baidu.com的HTML文件,服务器把包含了该文件的内容的Response对象发送回浏览器。浏览器分析Response对象中的HTML文件内容,发现其中引用了很多的其他文件,包括images文件、css文件、js文件等。浏览器会自动再次发送Request去获取这些图片、css文件或者js文件。当所有的文件都下载成功后,浏览器会根据HTML语法结构,将网页完整的显示出来。

2. 客户端HTTP请求格式
在网络传输中HTTP协议非常重要,该协议规定了客户端和服务器端请求和应答的标准。HTTP协议能保证计算机正确快速地传输超文本文档,并确定了传输文档中的哪一部分,以及哪一部分内容首先显示(如文本先于图形)等。
根据HTTP协议的规定,客户端发送了一个HTTP请求到服务器的请求消息,由请求行、请求头部、空行以及请求数据四个部分组成。
在这里插入图片描述
下面结合一个典型的HTTP请求示例,详细介绍HTTP请求信息的各个组成部分:

Get https://www.baidu.com/ HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: https://www.baidu.com/link?url=8vUrPYDUaSkXWxUEOlT8QhvB5kMr1o6I27EP0NJICmG&wd=&eqid=e69078350001654000000003641051fc
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: BIDUPSID=498703BAB592E42B1A4200A2F69121AD; PSTM=1657099499; MCITY=-291%3A; BAIDUID=498703BAB592E42BC6776C4114ED28E6:SL=0:NR=10:FG=1; BD_UPN=12314753; BDUSS=J5OEFjZ3pBb05tR3QxNUo0TEVJdjVpYzQ5Q2FORC04TnlrMHhFYkhRMnNKeGxrRVFBQUFBJCQAAAAAAQAAAAEAAAAXv8pawrfIy73U1qpUYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKya8WOsmvFjLT; BDUSS_BFESS=J5OEFjZ3pBb05tR3QxNUo0TEVJdjVpYzQ5Q2FORC04TnlrMHhFYkhRMnNKeGxrRVFBQUFBJCQAAAAAAQAAAAEAAAAXv8pawrfIy73U1qpUYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKya8WOsmvFjLT;

(1)请求行
第一行为请求行,包含了请求的方法,URL地址和协议版本。GET是请求方法,https://www.baidu.com是URL地址,HTTP/1.1指定了协议版本。
不同的请求方法含义不同,如下:

序号方法描述
1GET请求指定的页面信息,并返回实体主体
2POST向指定资源提交数据进行处理请求(如提交表单或者上传文件),数据被包含在请求体中。Post请求可能会导致新的资源的建立和已有资源的修改
3HEAD类似于GET请求,只不过返回的响应中没有具体的内容,用于获取报头
4PUT这种请求方式下,从客户端向服务器传送的数据取代指定的文档的内容
5DELETE请求服务器删除指定的页面
6CONNECTHTTP1.1协议中预留给能够将连接改为管道方式的代理服务器
7OPTIONS允许客服端查看服务器的性能
8TRACE回显服务器收到的请求,主要用于测试或诊断

其中GET和POST请求最常用,区别在于:

  • GET是从服务器上获取指定页面信息,POST是向服务器提交数据并获取页面信息。

  • GET请求参数都显示在URL上,服务器根据该请求所包含URL中的参数来产生响应内容。由于请求参数都暴露在外,所以安全性不高。

  • POST请求参数在请求体中,消息长度没有限制而且采取隐式发送,通常用来向HTTP服务器提交量比骄大的数据(如请求中包含许多参数或者文件上传的操作)POST请求的参数不在URL中,而在请求体中,在安全性方面比GET请求要高。

(2)请求报头
请求行下是若干个请求报头,下面介绍常用的请求报头及含义:

  • Host(主机和端口号):指定被请求的资源的Internet主机和端口号,对应网址URL中的Web名称和端口号,通常属于URL的Host部分。
  • Connection(连接类型):表示客户端与服务端的连接类型。
  • Upgrade-Insecure-Requests(升级为HTTPS请求):表示升级不安全的请求,会在加载HTTP资源时自动替换成HTTPS请求,让浏览器不再显示HTTPS页面中的HTTP请求警报。HTTPS时以安全为目标的HTTP通道,所以在HTTPS承载的页面上不允许出现HTTP请求,一旦出现就会提示或报错。
  • User-Agent(浏览器名称):表示客户端身份的名称,通常页面会根据不同的User-Agent信息自动做出适配,甚至返回不同的响应内容。
  • Accept(传输文件类型):指浏览器或其他客户端可以接受的MIME(Multipurpose Internet Mail Extensions,多用途因特网邮件扩展)文件类型,服务器可以根据他判断并返回适当的文件格式
  • Referer(页面跳转来源):表明产生请求的网页来自于哪个URL,用户是从该Referer页面访问到当前请求的页面。这个属性可以用来跟踪Web请求来自哪个页面,是从什么网站下载下来的,有时下载某网站的图片时,需要对应的Referer,否则是无法下载图片,那是因为做了防盗链。原理就是根据Referer去判断URL是否是本网站的地址,如果不是,则拒绝,如果是,就可以下载。

3. 服务器HTTP响应格式
HTTP响应报文由四部分组成,分别是状态行,响应报头,空行和响应正文。

在这里插入图片描述

  • 响应状态码
    响应状态码由3位数字组成,其中第一位数字定义了响应的类别,有5种可能取值,常见的响应状态码如下:
    100~199:表示服务器成功接收部分请求,要求客户端继续提价奥其余请求才能完成整个处理过程。
    200~299:表示服务器成功接受请求并已完成整个处理过程。常用的状态码为200(表示OK,请求成功)。
    200~399:为完成请求,客户需进一步细化请求。例如,请求的资源已经移动到一个新的地址。常用状态码包括302(表示所请求的页面已经临时转移至新的URL)、307和304(表示使用缓存资源)。
    400~499:客户端的请求有错误,常用状态码包括404(表示服务器无法找到被请求的页面)和403(表示服务器拒绝访问,权限不够)。
    500~599:服务器端出现错误,常用的状态码为500(表示请求未完成,服务器遇到不可预知的情况)。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ProgramStack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值