【Python】网络请求

news2025/1/24 5:24:54

目录

一、网络请求流程

1.HTTP

2.URL

3.网络传输模型

4.长链接/短链接

二、爬虫基础

1.基础概念

2.发送请求

3.请求模式

4.cookie

5.retrying


一、网络请求流程

1.HTTP

  1. 用户输入网址,例如 www.baidu.com
  2. 浏览器先向DNS请求,找到网址域名对应的ip地址和端口号并传到前端
  3. 浏览器请求访问这个ip地址对应的服务器,然后将域名里带有的参数一起传入后端
  4. 后端将接收到的参数拼写成sql语句,通过sql语言向数据库查询数据
  5. 数据库将结果返回给后端
  6. 后端将得到的数据整理成统一的格式返回给前端
  7. 前端拿到数据之后,通过前端代码进行渲染加工,展示在页面上提供给用户 

2.URL

URL示例:

https://www.bilibili.com/video/BV1dK4y1A7aM/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=18bd1edf91a238e3df510f2409d7b427

URL的四部分:

  • 协议:https://
  • 域名:www.baidu.com/
  • 资源路径:video/BV1dK4y1A7aM/?
  • 参数:spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=18bd1edf91a238e3df510f2409d7b427

通常情况资源路径与参数部分用 '?' 进行分隔,不容参数之间用 ‘&’ 进行分隔

在输入网址的时候协议和域名部分是必须要有的,协议不输入浏览器会默认使用https://

域名包括了ip地址和端口号port

3.网络传输模型

HTTP协议(HyperText Transfer Prorocol)超文本传输协议,是浏览器和web服务器传输数据格式的协议,基于TCP协议,是一个应用层协议

 在保证应用层、传输层、网络层、链路层一致后:

  1. 数据先从客户端从应用层一级一级向链路层传递
  2. 通过以太网络和IP,将数据进行传输
  3. 通过令牌环(加密算法),验证数据,保证数据真实可靠
  4. 再由链路层将数据传递到应用层,表示数据可进行下一步操作

4.长链接/短链接

HTTP/1.0中,服务器默认使用短链接。浏览器和服务器没进行一次HTTP操作,就建立一次链接,但任务结束就中断链接。

HTTP/1.1起,浏览器默认使用长链接。客户端的浏览器访问某个HTML或其他类型的web页中包含有其他的web资源,如js文件、图像文件、CSS文件等,当浏览器每遇到一个这样的资源,就会建立一个HTTP会话。

Connection:keep-alive

keep-alive是客户端和服务端的一个约定,即长链接,表示服务端在返回response后不关闭TCP连接,接收完响应之后的客户端也不关闭TCP连接,发送下一个HTTP请求时会重用该连接

  • 短链接对于服务器来说实现比较简单,存在的链接都是有效的连接,不需要额外的控制手段
  • 短链接建立成功后,一次请求和响应完成以后连接就会断开,每次发送请求需要重新建立连接。往往可能很短的时间内创立大量连接,造成服务器响应速度过慢
  • 短链接不会占用服务端过多的资源,但是增加了用户的等待时间,减慢了访问速度
  • 长链接可以省去较多的TCP建立和关闭操作,提高效率
  • 长链接建立成功后,可以发送多次请求和响应,等双方不进行通信的时候,服务端做好断开链接的操作
  • 长链接增加了服务端的资源开销,可能造成服务端负载过高,最终导致服务不可用

二、爬虫基础

1.基础概念

什么是爬虫?爬虫即为模拟用户网络请求,向目标网站获取数据。理论上只要是浏览器上展示的数据,爬虫皆能获取。

爬虫流程:

  • 向url发送请求,获取响应
  • 对响应进行提取
  • 如果有需要提取url,则继续发送请求获取响应
  • 提取数据,将数据保存 

HTTP和HTTPS:

  • HTTP:超文本传输协议,默认端口号80
  • HTTPS:HTTP + SSL(安全套接字),带有安全套接字的超文本传输协议,默认端口号443

HTTP常见请求头:

  • Host:主机和端口号
  • Connection:链接类型
  • Upgrade-Insecure-Requests:升级HTTPS请求
  • User-Agent:浏览器名称
  • Accept:传输文件类型
  • Referer:页面跳转处
  • Accept-Encoding:文件编码/解码格式
  • Cookie:参数

User-Agent和Cookie是最重要的参数,这两个参数表明了请求的由来,是最好的伪装成人为请求的参数。

响应状态码(status code):

  • 200:成功
  • 302:临时转移至新的url
  • 307:临时转移至新的url
  • 404:找不到该页面
  • 403:资源不可用
  • 500:服务器内部错误
  • 503:服务器不可用,通常是被反爬

2.发送请求

requests请求:老版本的Python都是使用urllib发送请求,requests是对urllib的进一步封装

文本请求

import requests

url = "https://www.baidu.com"

# 向目标url发送get请求
response = requests.get(url)

# 响应内容
print(response.text)    # str类型
print(response.content) # bytes类型
print(response.status_code) # 状态码
print(response.request.headers) # 请求头
print(response.headers)     # 响应头
print(response.cookies)     # 响应的cookie

import requests

url = "https://www.baidu.com"

# 向目标url发送get请求
response = requests.get(url)

# 响应内容
print(response.text)    # str类型,中文字符为乱码
print(response.content) # bytes类型
print(response.content.decode())            # 正常显示中文字符
print(response.content.decode('utf-8'))     # 正常显示中文字符
print(response.content.decode('gbk'))       # 报错

图片请求 

import requests

url = "https://hips.hearstapps.com/hmg-prod.s3.amazonaws.com/images/d-1592982809.jpg"

response = requests.get(url)

# 打印图片的字节型内容
print(response.content)

with open("image.jpg", "wb") as f:
    # 写入response.content bytes二进制类型
    f.write(response.content)

请求头与参数 

请求头与参数会默认设置,但是如果我们要自定义请求头headersparams,我们要以字典的结构创建请求头和参数变量,并传入get或post请求函数

3.请求模式

get请求:直接向网页发起的请求,可以不带任何参数

post请求:当我们确定了需要什么数据时,再发起请求时需要带上参数

代理

反向代理:浏览器不知道服务器的真实地址,如nginx

正向代理:浏览器知道服务器的真实地址,如VPN

代理的使用本质上都是隐藏自己的ip地址。登录信息的不足,特定ip的被禁止,同一ip短时间内多次访问,这些都会被服务器定义为恶意ip并禁止访问。所以我们使用代理来替换真实的ip及访问信息。

import requests
import random as rd
import time

for i in range(1, 100):
    # 生成随机代理
    proxie_str = f"https://{rd.randint(1, 100)}.{rd.randint(1, 100)}.{rd.randint(1, 100)}." \
                 f"{rd.randint(1, 100)}:{rd.randint(3000, 9000)}"

    print(proxie_str)

    # 设置代理
    proxie = {
        "https": proxie_str
    }

    url = "http://www.baidu.com"
    response = requests.get(url, proxies=proxie)

    print(response.content.decode())
    time.sleep(0.5)

4.cookie

cookie是爬虫访问网站时的个人信息,也是请求头中的重要组成部分。

cookie中的信息包括但不限于设备信息、历史记录、访问密钥。

使用requests处理cookie的三种方法:

        1. 将cookie字符串以键值对格式放入headers请求头字典中

header = {
'Cookie': 'OUTFOX_SEARCH_USER_ID_NCOO=2067300732.9291213;\
OUTFOX_SEARCH_USER_ID="93319303@10.169.0.81"; _ga=GA1.2.831611348.1638177688;\
P_INFO=joldemox@163.com|1647320299|0|youdao_jianwai|00&99|shh&1647226292&mailmas\
ter_ios#shh&null#10#0#0|&0|mailmaster_ios|joldemox@163.com; fanyi-ad-id=305838;\
fanyi-ad-closed=1; ___rl__test__cookies=1653295115820'
}

        2. 把cookie字典传给请求方法的cookie参数接收

cookies = {"cookie的key":"cookie的value"}
requests.get(url,headers=header,cookies=cookie)

        3. 使用requests提供的session模板

header = {
'Cookie': 'OUTFOX_SEARCH_USER_ID_NCOO=2067300732.9291213;\
OUTFOX_SEARCH_USER_ID="93319303@10.169.0.81"; _ga=GA1.2.831611348.1638177688;\
P_INFO=joldemox@163.com|1647320299|0|youdao_jianwai|00&99|shh&1647226292&mailmas\
ter_ios#shh&null#10#0#0|&0|mailmaster_ios|joldemox@163.com; fanyi-ad-id=305838;\
fanyi-ad-closed=1; ___rl__test__cookies=1653295115820'
}

session = requests.session()
response = session.get(url, headers, verify=False)
# 这个写法针对长链接和第三方跳转,保证cookie可以在请求中不被清空

5.retrying

重复发送请求模块

import requests
from retrying import retry

@retry(stop_max_attempt_number=4)
def get_info(url):
    # 超时会报错并重试
    # 等待超时时间设为4秒
    response = requests.get(url, timeout=4)

    # 状态码不是200也会报错重试
    assert response.status_code == 200
    return response

def parse_info(url):
    try:
        response = get_info(url)
    except:
        print(Exception)
        response = None
    return response

if __name__ == "__main__":
    res = parse_info("https://www.baidu.com")
    print(res.content.decode())

这里的retry是以装饰器的形式,监视get_info,如果重试次数达到4次且仍然无法正常获取数据,则会停止并报错。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/413774.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】网络层 — IP协议

🎇Linux: 博客主页:一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话: 看似不起波澜的日复一日,一定会在某一天让你看见坚持…

html页面在其他浏览器中渲染不出来

参考文章 问题 Vs code软件中live sever插件设置默认的浏览器是360浏览器,所以一直以来页面都是默认在360浏览器上进行打开并且没有问题。 后面想换谷歌浏览器打开html页面看下效果,发现图表和数据渲染不出来: 报错信息: 用js…

想制作出专业水准的音视频?掌握H.264编码技巧是关键

H.264编码原理 H.264,也被称为先进视频编码(AVC),是目前最流行的视频编码标准之一,其压缩效率很高。H.264编码基于视频编码的原始数据,使用一系列算法和技术以更小的比特率呈现更高质量的视频。以下是H.26…

【SSM】Spring6(十一.Spring对事务支持)

文章目录1.引入事务场景1.1准备数据库1.2 创建包结构1.3 创建POJO类1.4 编写持久层1.5 编写业务层1.6 Spring配置文件1.7 表示层(测试)1.8 模拟异常2.Spring对事务的支持2.1 spring事务管理API2.2 spring事务之注解方式2.3 事务的属性2.4 事务的传播行为…

春季儿童吃什么有助于长高,3款适合孩子长高的食谱做法,学起来

儿童身高一直以来都比较受到父母的关注,虽然身高不能说明一个人的能力有多强,但是会影响到人的外表。身高影响成败,一些专业对身高要求非常严格,因此大部分家长都希望孩子在身高方面能有一定的优势。 春季是孩子分泌生长激素增加时…

一位27岁软件测试员,测试在职近5年,月薪不到2W,担心被应届生取代

工作了近5年,一个月工资不到20K,担心被应届毕业生取代!互联网的快速发展伴随着员工适者生存的加速,测试员的薪资也在不断增长,以3年、5年、8年为一条分水岭。如果人们的能力和体力不够,他们就会被淘汰。看起…

【JavaEE】多线程CAS中的aba问题是什么?

博主简介:想进大厂的打工人博主主页:xyk:所属专栏: JavaEE初阶什么是CAS问题?CAS: 全称Compare and swap,字面意思:”比较并交换“,CAS中的aba问题是什么?请看本文讲解~~ 目录 文章目录 一、CAS是什么&am…

2023二建学天案例突破101问

2023 年二级建造师《公路》案例 101 问1.哪些情况下应进行长度宜不小于 200m的试验路段施工。(1)二级及二级以上公路路堤。(2)填石路堤、土石路堤;(3)特殊填料路堤;(4)特殊路基;(5)拟采用新技术、新工艺、新材料,新设备的路系。2.石质路暂的开挖方式有哪些!(1)钻爆开…

【笔记】响应表头中的Content-disposition

问题来源: 今天在做关于 怎样不通过使用插件的方式在HTML上预览本地C盘下的PDF文件,在生成PDF文件到C盘后,我想在下载和生成之间,再加一个PDF预览,就是先生成到C盘,再由用户来预览之后再决定是否下载&…

ModelNet40数据集

跑PointNet,modelnet40数据集时; 有些人直接用.off文件;——【CAD模型】普林斯顿形状Banchmark中的.off文件遵循以下标准: OFF文件全是以OFF关键字开始的ASCII文件。下一行说明顶点的数量、面片的数量、边的数量。 边的数量可以安全地省略。对模型不会有影响(可以为…

4/16学习周报

文章目录前言文献阅读摘要简介方法评估标准结果结论时间序列预测支持向量机SVM高斯过程GPRNNLSTMGRUtransformer总结前言 本周阅读文献《Real-time probabilistic forecasting of river water quality under data missing situation: Deep learning plus post-processing tech…

环境变量概念详解!(4千字长文)

环境变量! 文章目录环境变量!环境变量PATHexportexport的错误用法定义命令行变量环境变量哪里来的其他各种环境变量HOMEHOSTNAMELOGNAMEHISTSIZEPWD环境变量相关指令echoenvgetenv——相关函数!exportsetunset命令行参数argcargvenvpenvironp…

stata绘图指令

stata绘图指令 – 潘登同学的stata笔记 文章目录stata绘图指令 -- 潘登同学的stata笔记绘图概览韦恩图折线图连线图线性拟合图直方图函数图添加特殊字符和文字绘图概览 Stata 提供的图形种类: twoway 二维图scatter 散点图line 折线图area 区域图lfit 线性拟合图q…

漏洞扫描工具AWVS的安装及配置使用过程

简介 Acunetix Web Vulnerability Scanner(AWVS)可以扫描任何通过Web浏览器访问和遵循HTTP/HTTPS规则的Web站点。适用于任何中小型和大型企业的内联网、外延网和面向客户、雇员、厂商和其它人员的Web网站。 AWVS可以通过检查SQL注入攻击漏洞、XSS跨站脚…

LinuxGUI自动化测试框架搭建(三)-虚拟机安装(Hyper-V或者VMWare)

(三)-虚拟机安装(Hyper-V或者VMWare)1 Hyper-V安装1.1 方法一:直接启用1.2 方法二:下载安装1.3 打开Hyper-V2 VMWare安装注意:Hyper-V或者VMWare只安装一个,只安装一个,只…

SQL——34道经典例题之1-17

目录 1 查询每个部门最高薪水的人员名称 2 查询哪些人的薪水在部门平均薪水之上 3 查询每个部门的平均薪水等级 3.1 每个部门的平均薪水的等级 3.2 每个部门的平均的薪水等级 4 查询最高薪水(不用max函数) 5 查询平均薪水最高的部门的部门编号 …

FE_CSS CSS 的三大特性

1 层叠性 相同选择器给设置相同的样式,此时一个样式就会覆盖(层叠)另一个冲突的样式。层叠性主要解决样式冲突的问题 层叠性原则: 样式冲突,遵循的原则是就近原则,哪个样式离结构近,就执行哪个…

「C/C++」C/C++预处理器

博客主页:何曾参静谧的博客 文章专栏:「C/C」C/C学习 目录一、宏替换 #define1. 定义常量2. 定义函数3. 定义代码块二、条件编译 #if1. 使用 #ifdef 和 #endif 编译不同平台的代码2. 使用 #if 和 #else 编译不同版本的代码3. 使用 #ifndef 和 #define和#…

机器学习 00 交叉验证

一、什么是交叉验证(cross validation) 交叉验证:将拿到的训练数掘,分为训练和验证集。以下图为例: 将数据分成4份,其中一份作为验证集。然后经过4次(组)的测试,每次都更换不同的验证集。即得到4组模型的结果,取平均值作为最终结…

ENVI 5.6软件安装教程

软件下载 [软件名称]:ENVI 5.6 [软件大小]:3.25G [安装环境]:Win7~Win11或更高 软件介绍 ENVI 5.6是一款实现遥感图像处理的工具,已经广泛应用于科研、环境保护、气象、石油矿产勘探、农业、林业、医学、地球科学、公用设施管…