python模拟浏览器请求web服务器的网页过程

Python之模拟浏览器向web服务器发送HTTP请求报文(一) Python之模拟浏览器向web服务器发送HTTP请求报文(一) 序号代表思路顺序 import socket if __name__ == '__main__': # 1.创建tcp客户端套接字 tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2.和服务端程序建立连... 阅读详情


一、浏览器请求的基本流程:

  1. 用户输入网址.
  2. 浏览器请求DNS服务器, 获取域名对应的IP地址.
  3. 请求连接该IP地址服务器.
  4. 发送资源请求. (HTTP协议)
  5. web服务器接收到请求, 并解析请求, 判断用户意图.
  6. 获取用户想要的资源.
  7. 将资源返回给web服务器程序.
  8. web服务器程序将资源数据通过网络发送给浏览器.
  9. 浏览器解析请求的数据并且完成网页数据的显示.

通过火狐或者谷歌可以调出开发者工具,浏览器右侧菜单-->开发者工具,或者使用快捷键F12

打开的页面如图所示

二、HTTP请求报文协议分析

消息头中,请求头的报文数据内容,下面就是我们要请求的报文示例数据:

HTTP/1.1 200 OK
Date: Sat, 07 Apr 2018 03:05:08 GMT
Content-Type: text/html
Content-Length: 14615
Last-Modified: Fri, 30 Mar 2018 07:37:00 GMT
Connection: Keep-Alive
Vary: Accept-Encoding
Set-Cookie: BAIDUID=18857CBD0F662F5B63E90ECB144BDF06:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BIDUPSID=18857CBD0F662F5B63E90ECB144BDF06; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: PSTM=1523070308; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
P3P: CP=" OTI DSP COR IVA OUR IND COM "
Server: BWS/1.1
X-UA-Compatible: IE=Edge,chrome=1
Pragma: no-cache
Cache-control: no-cache
Accept-Ranges: bytes

GET / HTTP/1.1 叫做请求行. 里面包含3个信息, 以空格隔开

  • GET:第一个叫做请求方法, 除了 GET 方法外, 还有 POST 方法, 除此之外还有其他方法, 这两种最常用. GET 主要用于从服务器获得数据, POST 主要用于从浏览器提交数据到服务器. 比如注册账号的时候,需要提交信息到服务器上.

  • /:第二个表示请求的资源路径.

  • HTTP/1.1:第三个表示 HTTP 协议的版本.

请求头. 除了第一行之外, 剩下的所有数据的格式都是类似的

  • Host 表示浏览器要请求的主机地址.

  • Connection 表示浏览器和服务器之间的连接方式, 浏览器和服务器连接是长连接还是短连接.

  • User-Agent 用户代理, 我们使用谷歌浏览器和火狐浏览器分别请求百度, 那么会发现 User-Agent 的值是不一样的, 它主要是用于浏览器告诉服务器自己的身份, 比如浏览器端使用的操作系统是什么版本, 浏览器是什么版本等等,如果服务器端就会有反爬机制, 服务器不希望爬虫来获取数据, 所以通过该项可以知道客户端是否是爬虫程序. 如果爬虫程序想伪装成一个浏览器的请求, 就必须设置此项.

  • Accept 表示浏览器告诉服务器, 自己能够接收并识别的文件类型.

  • Accept-Encoding 表示浏览器能够处理的压缩方式. 为什么需要压缩呢? 当网页数据量大的时候, 压缩之后可以提高传输速率, 提高用户体验.
  • Accept-Language 浏览器可以接收的文本语言, 如果非中文编码可能会出现乱码.
请求报文格式总结

三、HTTP相应报文协议分析

消息头中,响应头的报文数据内容:


第一行 HTTP/1.1 200 OK 叫做响应行, 共分成3部分, 

HTTP/1.1:表示 HTTP协议的版本

200:表示响应状态码, 用户向服务器发出了请求, 如果服务器正常返回响应报文, 那么状态码一般都是200

OK: 表示原因短语, 表示对前面状态码的简单描述. 

    响应的状态码除了 200 之外, 还有其他的状态码, 下面是常见的状态码:

    302 redirect, 我们通过 302 状态码可以指示浏览器跳转到某一个 URL.

    404 NOT FOUND, 当我们访问一个不存在的 URL 时, 一般会返回404状态码, 告诉浏览器, 你访问的 URL 是不存在的.

    500 Internal Server Error, 服务器遇到了一个未曾预料的状况, 导致了它无法完成对请求的处理. 一般来说, 这个问题都会在服务器端的源代码出现错误时出现.

第二行下面的所有内容, 我们叫做响应头. Content-Type 表示响应内容的文本格式和编码方式.

响应报文格式总结


下面就来模拟浏览器请求web服务器的网页过程,使用TCP实现 HTTP协议(请求报文格式和响应报文格式)


import socket
import re


# 创建tcp套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 创建和服务器的连接
tcp_socket.connect(("www.baidu.com", 80))

# 拼接请求报文
request_line = "GET / HTTP/1.1\r\n"
request_header = "Host: www.baidu.com\r\n"
User_Agent = "User-Agent: Mozilla/5.0 (Windows NT 6.1; W…) Gecko/20100101 Firefox/59.0\r\n"
request_data = request_line + request_header + User_Agent + "\r\n"

# 发送请求报文,编码
tcp_socket.send(request_data.encode())

# 接收响应报文
recv_data = tcp_socket.recv(4096)
# 解码
recv_data = recv_data.decode()
print(recv_data)
# 关闭连接
tcp_socket.close()


得到的结果:

和之前在浏览器中看到的HTTP响应头是一样的结果

HTTP/1.1 200 OK
Date: Sat, 07 Apr 2018 03:38:09 GMT
Content-Type: text/html
Content-Length: 14615
Last-Modified: Fri, 30 Mar 2018 07:37:00 GMT
Connection: Keep-Alive
Vary: Accept-Encoding
Set-Cookie: BAIDUID=EC4E6F3C74FB72E2594C60BAC6D4A8B9:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BIDUPSID=EC4E6F3C74FB72E2594C60BAC6D4A8B9; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: PSTM=1523072289; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
P3P: CP=" OTI DSP COR IVA OUR IND COM "
Server: BWS/1.1
X-UA-Compatible: IE=Edge,chrome=1
Pragma: no-cache
Cache-control: no-cache
Accept-Ranges: bytes








基于python 自己动手写一个简单的web服务器 1. 前言 如今一提到服务器首先就想到 apache tomcat nginx等。虽然这些服务器很优秀。但是对于我们平时拿来练手的一些小项目来说却是大材小用,杀鸡用牛刀,而且上述主流服务器配置起来也略嫌麻烦。俗话说自己动手丰衣足食,今天我们就来实现一个简单的静态web服务器。 2. http协议 谈到浏览器,服务器时,作为计算机行业从业者,首先想到的就是www、http、https、html等等,... 阅读详情

相关推荐

Python 爬虫模拟登录方法汇总

摘要: 在进行爬虫时,除了常见的不用登录就能爬取的网站,还有一类需要先登录的网站。比如豆瓣、知乎,以及上一篇文章中的桔子网。这一类网站又可以分为:只需输入帐号密码、除了帐号密码还需输入或点击验证码等类型。本文以只需输入账号密码就能登录的桔子网为例,介绍模拟登录常用的 3 种方法。 POST 请求方法:需要在后台获取登录的 URL并填写请求体参数,然后 POST 请求登录,相对麻烦; 添加 Coo...

weixin_34357928的博客 3718

python中的http.client,模拟浏览器发送请求

from http.client import HTTPConnection # 创建连接 host:服务器地址/主机 conn = HTTPConnection(host="www.baidu.com") # 发送请求 # method: 请求方式 url:请求资源地址 conn.request(method="GET", url="https://www.baidu.com") # 从服务器...

简介不重要 818

脚本实战第一发:所有的请求都可以被 Python 模拟

在了解如何使用 Python 模拟请求之前,首先我们来简要回顾一下 HTTP 请求的基础概念。HTTP 协议是 Web 上最常用的协议之一,它定义了客户端与服务器之间交互的规则。

百锦再的博客 1万+

用Python模拟一个网络请求

本篇我们分享使用python模拟一个网络请求。

薄荷香 1193

TS808效果器制作教程

TS808效果器制作教程 可以在立创商城购买到大部分的电阻电容和IC,音频接口,踩钉,电位器和电源接口可以去某宝看看都买得到的。链接https//pan.baidu.com/s/1QId1eIE3fJ2u5NLBSISvGA。安装过程过于繁琐,把所有元器件按照图纸焊接完成就可以调试了,祝你们成功!这是TS808经典效果器制作过程的记录。IC是JRC4558。...

qq_18948149的博客 3422

Unity3d实现的十字路口的模拟(一)

最近学习了Unity3d这个游戏引擎,感觉真的是非常的强大,正好赶上操作系统课程要做一个模拟信号量的模拟程序,于是打算做一个模拟十字路口的程序,大致的实现要实现的成果是:存在四种不同的汽车,包括一辆警车(不受交通信号灯的控制)随机产生在不同的路口,并且有不同的行动路线如:直走,左转,右转等,当然还有交通信号灯来控制车辆的有序运行。可以展示不同的视角来观察路口的情况(利用Q,W,E,R分别控制不同的

永远在身边的专栏 7489

chatgpt赋能python:Python模拟POST:如何使用Python进行Post请求模拟

在HTTP协议中,HTTP请求方法(英文:HTTP request method)是指客户端向服务器发起请求的方式。常见的HTTP请求方法有GET、POST、PUT、DELETE等。其中,POST请求是将数据提交到指定的资源,比如提交表单或上传文件等操作。POST请求常常用于向服务器提交数据,如注册、登录等功能。本文由chatgpt生成,文章没有在chatgpt生成的基础上进行任何的修改。以上只是chatgpt能力的冰山一角。作为通用的Aigc大模型,只是展现它原本的实力。对于颠覆工作方式的。

atest166的博客 712

GPT注册与使用全流程详解:从零到一的实战指南

本文详细介绍了GPT的注册与使用全流程,从认识GPT作为智能对话助手开始,到注册前的设备与环境准备、手把手完成账号注册、首次使用指南以及进阶使用技巧。文章还涵盖了安全使用与注意事项,帮助用户从零开始高效利用GPT提升工作效率和内容创作能力。

weixin_33843409的博客 387

python模拟浏览器请求

模拟浏览器请求 本人亲测 1:首先要有操作网站的账户密码 2:分析浏览器header标头 用代码代替浏览器访问 import urllib.request import json from urllib import parse if __name__ == '__main__': # 模拟浏览器请求 header = { 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML,

weixin_42110159的博客 3734

在树莓派5(8G版)上运行Ollama + LLM

直接上结论,Ollama在树莓派上能安装,且本身运行起来毫无压力,但具体到大语言模型,Deepseek似乎不总是最佳选择。

ki1381的专栏 1648

利用eds editor生成CANOPEN 设备eds文件

通过以上步骤,您可以根据实际设备的功能特性,自动生成一份符合CANopen协议标准的电子数据表(EDS文件),该文件可以被上位机软件或其他CANopen主站设备用于识别、配置和控制您的CANopen从站设备。使用CANopen EDS Editor生成CANOPEN设备的EDS文件是一个系统化的过程,它涉及将设备的具体技术参数和功能映射到CANopen规范定义的对象字典中。

weixin_38604759的博客 6458

Python+Requests模拟发送GET请求

导入requests库代码如下:以百度首页为例# 发送get请求print(response.content.decode("utf-8")) # 以utf-8的编码输出内容发送带参数的get请求有几种方式方式一:参数在URL中代码如下:以百度首页为例# 发送带参数的get请求# 方式一:参数在URL中# http 协议,www.baidu.com 主机号,/s 请求地址,wd=猫 参数wd=猫"# 因为百度服务器会对头部信息做检查所以需要添加请求头Win64;

阿里大叔说测试的博客 1269

Swift Package Manager (SPM) 创建并集成本地库

Swift Package Manager (SPM) 在macOS 项目中创建并集成的完整步骤

征战无悔人生 1422

python3:一个微型的web服务器实现

实验目的:用socket模拟一个微型的web服务器,当py脚本run起后,实微型web server架起了,然后用本地浏览器访问127.0.0.1:8080(web server的ip_port)时web服务器就会将网页内容传给浏览器,实现网页浏览. sw+sys: python3.7.2 + windows10 64bit 本地准备的server端网页为下载的hao123主页(我已上载并...

lxy210781的专栏 1279

STM32F103RCT6的FLASH读写操作

STM32F103RCT6是一款常用的32位微控制器,它具有内置的FLASH存储器,可以用于存储程序代码和数据。在本文中,我们将详细介绍如何进行STM32F103RCT6的FLASH读写操作,并提供相应的源代码。写入数据时,我们通过将数据直接写入FLASH地址来完成。通过使用适当的API和规则,我们可以有效地读取和写入数据。写入FLASH时,我们需要按特定的规则进行编程。首先,我们需要包含适当的头文件和定义相关的宏和变量,以便在代码中使用FLASH API。类型的指针,我们可以直接读取FLASH中的数据。

UplKubernetes的博客 1032

LDO 上电过冲的根因

LDO在上电瞬间常出现短时过冲电压(3.4V-3.5V),可能损坏敏感器件。其根本原因是:低

硬核科技 291

01、爬虫学习入门

爬虫:通过编写程序,来获取获取互联网上的资源需求:用程序模拟浏览器,输入一个网址,从该网址获取到资源或内容。

benxiangsj的博客 1699

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Python实现简单Web服务器及模拟浏览器

笔者在进行操作的时候发现了一个小bug,就是在响应浏览器时,浏览器会默认发起 Favicon.ico 请求,这是一个图标生成器,用于快捷标记网页。超文本传输协议是一种用于分布式、协作式和超媒体信息系统的应用层协议,是万维网WWW(World Wide Web)的数据通信的基础。但是浏览器在访问DNS之前会首先访问本地DNS缓存,也就是hosts文件,如果没有找到对应的IP,浏览器才会访问DNS。请求和响应消息的头以。DNS(域名解析系统)用于将域名转成对应的IP地址,DNS是一台运行在互联网上的服务器。

2401_82928104的博客 2494

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

第14.6节 使用Python urllib.request模拟浏览器访问网页的实现代码

Python要访问一个网页并读取网页内容非常简单,在利用《第14.5节 利用浏览器获取的http信息构造Python网页访问的http请求头》的方法构建了请求http报文的请求头情况下,使用urllib包的request模块使得这项工作变得非常容易,具体语句如下: header = mkhead() req = urllib.request.Request(url=site,headers=hea...

老猿Python 2795

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Python爬虫之模拟登录总结

备注:python 2.7.9,32位 有些网站需要登录后才能爬取所需要的信息,此时可以设计爬虫进行模拟登录,原理是利用浏览器cookie。 一、浏览器访问服务器的过程:     (1)浏览器(客户端)向Web服务器发出一个HTTP请求(Http request);     (2)Web服务器收到请求,发回响应信息(Http Response);     (3)浏览器解析内容呈现

竹聿Simon的专栏 5万+

爬虫入门之模拟用户请求

接着上一篇文章Python爬虫入门之初遇lxml库,我们对爬虫程序发起的请求进行分析,爬虫爬取数据要做的就是模拟用户发起请求,接收到数据进行存储 我们先看一下一下正常的用户请求,然后再分析如何去模拟 1.正常的用户请求 1.1. 用户操作步骤 用户打开浏览器 输入URL网址 回车发起请求 1.2.请求原理 目前大多数网址基本都是使用http协议,我们先说一下什么是http (对于原理不感兴趣可以跳过1.2这节) 1.2.1.什么是http协议? 超文本传输协议(HyperTextTr...

王德昌的博客 2万+

python 模拟用户点击浏览器_浏览器行为模拟之requests、selenium模块

requests模块前言:通常我们利用Python写一些WEB程序、webAPI部署在服务端,让客户端request,我们作为服务器端response数据;但也可以反主为客利用Python的requests模块模拟浏览器行为,向其他站点发送request,让其他站点response数据给我们;一、requests模块介绍requests可以模拟浏览器的请求,比起之前用到的urllib,reques...

weixin_40002336的博客 7836

Python模拟浏览器登陆网站

网站登陆的步骤: 1. 用户在网站登陆界面输入用户名密码; 2. 浏览器将含有用户名、密码等登陆信息的表单以Post的方式传给服务器; 3. 服务器进行用户名密码验证,若登陆成功,则返回登陆成功的跳转界面,并包含有用户登陆信息的,已经加密过的Cookies; 3a. 若用户名密码验证失败,则跳转重新登陆界面; 4. 浏览器将这段服务器返回的Cookies储存在本地,之

yzl11的博客 1636

手动搭建服务器—Python

搭建服务器,python底层开发,网页,浏览器

m0_58086930的博客 6465

python简单模拟网页访问

浏览网页的过程可分为以下四个步骤: 浏览器通过DNS服务器查找域名对应的IP地址; 向IP地址对应的Web服务器发送请求; Web服务器响应请求,返回HTML页面; 浏览器解析HTML文本,并显示页面 实践内容: 1.使用urllib模块 import urllib.request as ur url="https://www.baidu.cn/" #访问目标网页 info = ur.urlopen(url) #return 得到一个response的对象 print(info

enjoy_code_的博客 2647

python 模拟浏览器访问一定会成功吗_浏览器行为模拟之requests、selenium模块

requests模块前言:通常我们利用Python写一些WEB程序、webAPI部署在服务端,让客户端request,我们作为服务器端response数据;但也可以反主为客利用Python的requests模块模拟浏览器行为,向其他站点发送request,让其他站点response数据给我们;一、requests模块介绍requests可以模拟浏览器的请求,比起之前用到的urllib,reques...

weixin_39677419的博客 318
上一篇: python中的迭代器和可迭代对象
下一篇: Ubuntu下服务器端和客户端的MySQL的安装
anyiVIP
博客等级 码龄9年 39粉丝 27原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值