python爬虫学习记录-请求模块urllib3

news2024/9/19 10:35:09

(文章内容仅作学习交流使用)

urllib3是一个功能强大、条理清晰,用于HTTP客户端的第三方模块

urllib3-发送网络请求

使用urllib3发送网络请求时,需要先创建PoolManager对象,并使用该对象的request方法发送请求,request方法的语法如下:

request(method,url,fields=None,headers=None,retries=3,timeout=0.1) 
#method用于指定请求方式
#fields与headers分别用于指定请求参数与请求头
#retries为重试请求次数,默认为3次
#timeout为可选参数,用于设置超时

使用urllib3发送GET请求并获取状态:

import urllib3    # 导入urllib3模块
urllib3.disable_warnings()               # 关闭ssl警告
url = "http://baidu.com"
http = urllib3.PoolManager()   # 创建连接池管理对象
r = http.request('GET',url)    # 发送GET请求
print(r.status)                # 打印请求状态码

一个连接管理池(PoolManager)可以同时向多个服务器发送请求:

jd_url = 'https://www.jd.com/'
csdn_url = 'https://csdn.net/'
baidu_url = 'https://www.baidu.com/'
http = urllib3.PoolManager()
r1 = http.request('GET',jd_url)
r2 = http.request('GET',csdn_url)
r3 = http.request('GET',baidu_url)

发送POST请求时,除了将method设置成POST,还需要将字典参数传入fields中:

url = 'https://www.httpbin.org/post'    # post请求测试地址
params = {'name':'Jack','country':'中国','age':30}  # 定义字典类型的请求参数
http = urllib3.PoolManager()             # 创建连接池管理对象
r = http.request('POST',url,fields=params)    # 发送POST请求
print('返回结果:',r.data.decode('unicode_escape'))

处理响应内容

发送网络请求后,将返回一个HTTPResponse对象,通过该对象中的info方法,可以获取响应头信息(字典类型):

http = urllib3.PoolManager()             # 创建连接池管理对象
r = http.request('GET',url)              # 发送GET请求,默认重试请求
for key in r.info().keys():      # 循环遍历打印响应头信息
    print(key,':',response_header.get(key))

可以将服务器返回的JSON信息转换成字典类型,取需要的条目即可:

url = 'https://www.httpbin.org/post'    # post请求测试地址
params = {'name':'Jack','country':'中国','age':30}  # 定义字典类型的请求参数
http = urllib3.PoolManager()             # 创建连接池管理对象
r = http.request('POST',url,fields=params)    # 发送POST请求
j = json.loads(r.data.decode('unicode_escape'))  # 将响应数据转换为字典类型
print('数据类型:',type(j))
print('获取form对应的数据:',j.get('form'))
print('获取country对应的数据:',j.get('form').get('country'))

获取二进制数据时,可以做出相应处理,比如二进制图片数据可以(实际上其他类型也可以)使用open函数转换为图片文件(运行如下代码之后,相应图片会保存在项目根目录中):

url = 'https://www.sdu.edu.cn/images/20240801.png'  # 图片请求地址
http = urllib3.PoolManager()             # 创建连接池管理对象
r = http.request('GET',url)              # 发送网络请求
print(r.data)                            # 打印二进制数据
f = open('20240801.png','wb+')             # 创建open对象
f.write(r.data)                          # 写入数据
f.close()                                # 关闭

复杂请求的发送

设置请求头

大多数服务器都会检测请求头信息,我们需要提前获取想要模拟的浏览器的请求头,并以字典形式传入request的header参数中,获取浏览器的有效请求头方法如下:

获取到请求头后,需要在request中进行设置:

url = 'https://www.httpbin.org/get'    # get请求测试地址
# 定义火狐浏览器请求头信息
headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36'}
http = urllib3.PoolManager()                   # 创建连接池管理对象
r = http.request('GET',url,headers=headers)    # 发送GET请求
print(r.data.decode('utf-8'))                  # 打印返回内容

设置代理IP

设置代理IP需要创建ProxyManager对象,并填写proxy_url(代理IP)与headers两个参数:

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0'}
proxy = urllib3.ProxyManager('http://120.27.110.143:80',headers = headers)  # 创建代理管理对象
r = proxy.request('get',url,timeout=2.0)  # 发送请求
print(r.data.decode())                    # 打印返回结果

上传文件

可以通过fields将文本文件作为参数上传:

import urllib3    # 导入urllib3模块
import json       # 导入json模块
with open('test.txt') as f:    # 打开文本文件
  data = f.read()               # 读取文件
http = urllib3.PoolManager()    # 创建连接池管理对象
r = http.request( 'POST','http://httpbin.org/post',fields={'filefield': ('example.txt', data),})  # 发送网络请求
files = json.loads(r.data.decode('utf-8'))['files']  # 获取上传文件内容
print(files)                                         # 打印上传文本信

在request方法中指定body参数,对应的值为文件的二进制数据,还要使用headers参数指定文件类型:

import urllib3    # 导入urllib3模块
with open('python.jpg','rb') as f:  # 打开图片文件
  data = f.read()                    # 读取文件
http = urllib3.PoolManager()    # 创建连接池管理对象
# 发送请求
r = http.request('POST','http://httpbin.org/post',body = data,headers={'Content-Type':'image/jpeg'})
print(r.data.decode())          # 打印返回结果

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

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

相关文章

黑马Java零基础视频教程精华部分_17_冒泡排序、选择排序、插入排序、快速排序

系列文章目录 文章目录 系列文章目录一、冒泡排序核心思想:相邻的数据两两比较,小的放前面,大的放后面动图展示算法步骤代码 二、选择排序核心思想:不用相连的两个数据比较,小的放前面,大的放后面动图展示算…

爬虫兽问题解答1-抖音评论区爬虫采集拓客系统

总结了一些用户经常提出的问题这里记录一下方便使用 抖音视频评论拓客系统FAQ问题解答 软件服务端镇楼 问题一:搜索到得抖音视频评论能否永久保留随时查询 答:是可以得,通过软件中得历史记录即可查询。 问题二:搜索到得评论&…

Seatunnel Mysql数据同步到Mysql

环境 mysql-connector-java-8.0.28.jar、connector-cdc-mysql 配置 env {# You can set SeaTunnel environment configuration hereexecution.parallelism 2job.mode "STREAMING"# 10秒检查一次,可以适当加大这个值checkpoint.interval 10000#execu…

ShardingSphere自定义分布式主键生成策略、自定义分片规则

文章目录 主键生成策略源码KeyGenerateAlgorithm源码入口实现扩展 自定义分布式主键生成策略 分片算法ShardingAlgorithm实现扩展 自定义分片算法踩的坑 主键生成策略源码 开发者手册 KeyGenerateAlgorithm 全限定类名org.apache.shardingsphere.sharding.spi.KeyGenerateAl…

【HBZ分享】bean的生命周期 以及 各个阶段在spring的哪个类被调用

Ioc容器通过配置文件读取bean的定义信息,并保存在BeanDefinition中执行BeanFactoryPostProcessor的postProcessBeanFactory方法,对bean定义的信息进行处理,这里还是可以设置bean的基本信息,比如:单例多例,初…

如何将 GTA Online 的加载时间缩短 70%

注:机翻。未校。 How I cut GTA Online loading times by 70% t0st 2021-02-28 GTA Online. Infamous for its slow loading times. Having picked up the game again to finish some of the newer heists I was shocked (/s) to discover that it still loads j…

如何使用浏览器发post请求

如何使用浏览器发送post请求 第一种:无请求体第二种:要设置请求体的post请求 通过浏览器发送post请求有两种简单的方式,只需要根据实际情况在console执行以下代码即可。 第一种:无请求体 没有请求体,可以直接使用以下…

Vue3与Vue2的主要区别

本篇文章适用于熟练掌握Vue2的小伙伴们&#xff0c;不想重新学习Vue3&#xff0c;那看本篇文章就够啦&#xff01;希望大家收获多多&#xff01;&#xff01; Vue3是向下兼容的&#xff0c;可以运行Vue2代码 一、页面区别 Vue2定义属性方法 <template><div ><…

【网络爬虫篇】“逆向实战—某东:滑块验证码(逆向登录)”自动化实现滑块登录验证(2024.8.7)最新发布,包干货,包详细

【网络爬虫篇】更多优秀文章借鉴&#xff1a; 1. 使用Selenium实现黑马头条滑块自动登录 2. 使用多线程采集爬取豆瓣top250电影榜 3. 使用Scrapy爬取去哪儿网游记数据 4. 数据采集技术综合项目实战1&#xff1a;国家水稻网数据采集与分析 5. 数据采集技术综合项目实战2&#x…

【leetcode】根据二叉树创建字符串、二叉树的前中后遍历(非递归链表实现二叉树)

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;数据结构、LeetCode专栏 &#x1f4da;本系…

扫地机/洗地机语音芯片ic,工业级声音播放芯片ic,NV170H

扫地机/洗地机作为智能家居清洁领域的创新驱动力&#xff0c;不仅赋予了清洁设备&#xff0c;还需要一些智能化的功能&#xff0c;比如语音提示&#xff0c;将用户体验提升至全新高度。NV170H语音芯片成为了首要选择。 NV170H语音芯片是一款OTP&#xff08;‌一次性可编程&…

html+css网页设计 酷狗首页1个页面 (无js)

htmlcss网页设计 酷狗首页1个页面无js功能 页面还原度80% 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 …

干货满满!Stable Diffusion 从入门到精通之提示词手册,免费分享,自学转行,零基础首选!

前言 Stable Diffusion 技术把 AI 图像生成提高到了一个全新高度&#xff0c;文生图 Text to image 生成质量很大程度上取决于你的提示词 Prompt 好不好。本文从“如何写好提示词”出发&#xff0c;从提示词构成、调整规则和 AIGC辅助工具等角度&#xff0c;对文生图的提示词输…

腾讯云AI代码助手评测:如何智能高效完成Go语言Web项目开发

腾讯云AI代码助手评测&#xff1a;如何智能高效完成Go语言Web项目开发 &#x1f680; 文章目录 腾讯云AI代码助手评测&#xff1a;如何智能高效完成Go语言Web项目开发 &#x1f680;背景引言开发环境介绍腾讯云AI代码助手使用实例1. 代码补全2. 技术对话3. 代码优化4. 规范代码…

LVS实验(实现服务器集群的负载均衡)

基本概念 LVS&#xff08;Linux Virtual Server&#xff09;是Linux虚拟服务器的简称。 LVS通过将一个真实服务器集群虚拟成一台服务器来对外提供服务&#xff0c;同时在集群内部实现负载均衡。这种技术能够显著提高服务的处理能力和可靠性&#xff0c;降低单台服务器的负载压…

C++——类和对象(part1)

前言 本篇博客来为大家介绍C中的一个重要内容——类与对象&#xff0c;这部分的内容较多&#xff0c;将会分三篇文章来介绍&#xff0c;本篇为第一篇&#xff0c;如果你学习C或对C感兴趣&#xff0c;那么请继续往下阅读&#xff0c;下面进入正文部分。 1. 类的定义 1.1 类定…

【Material-UI】Button Group:实验性 API 详解

文章目录 一、按钮组概述1. 组件介绍2. 基本用法 二、实验性 API 详解1. LoadingButton 组件1.1 基本用法1.2 位置属性 三、实验性 API 的应用场景1. 数据加载按钮2. 提交表单按钮3. 保存操作按钮 四、按钮组的样式定制1. 变体&#xff08;Variants&#xff09;2. 颜色&#xf…

解决Ubuntu/Kali手动创建的启动器在dock上没有图标,且不能“添加到dock中“的问题

文章目录 问题描述问题解决解决方案 1 | 添加StartupWMClass字段解决方案 2 | 重命名文件名 如何获取 WM 值&#xff1f;方式 1 | xprop 命令方式 2 | 直接查看 问题描述 这个启动器无论是在菜单还是桌面都是正常的&#xff0c;只有在dock中没有图标&#xff0c;且不像其他APP…

《向量数据库指南》——非结构化数据的行业需求及向量数据库的关键角色

非结构化数据的行业需求及向量数据库的关键角色 引言 在当今数字化时代,数据已成为驱动社会进步与产业升级的核心要素。随着技术的飞速发展,特别是人工智能(AI)技术的广泛应用,数据的类型与规模正以前所未有的速度增长。其中,非结构化数据作为数据海洋中的主体部分,其…

同态加密和SEAL库的介绍(六)BGV 方案

前面介绍 BFV 和 CKKS 加密方案&#xff0c;这两者更为常用。并且也解释了 Batch Encoder 和 级别的概念&#xff0c;这对接下来演示 BGV 会很有帮助。 一、BGV简介 BGV (Brakerski-Gentry-Vaikuntanathan) 方案 是一种基于环学习同态加密&#xff08;RLWE&#xff09;问题的加…