当前位置: 首页 > news >正文

Python爬虫之requests库

1、准备工作

pip install requests

2、实例

urllib库中的urlopen方法实际上就是以GET方式请求网页,requests库中相应的方法就是get方法

import requestsr = requests.get('https://www.baidu.com/')
print(type(r))			# <class 'requests.models.Response'>  响应类型
print(r.status_code)	# 200                                 状态码
print(type(r.text))		# <class 'str'>                       响应体类型
print(r.text[:100])		# <!DOCTYPE html>...                  响应体内容
print(r.cookies)		# <RequestsCookieJar...               cookie
r = requests.get('https://www.httpbin.org/get')				# get请求
r = requests.post('https://www.httpbin.org/post')			# post请求
r = requests.put('https://www.httpbin.org/put')				# put请求
r = requests.delete('https://www.httpbin.org/delete')		# delete请求
r = requests.patch('https://www.httpbin.org/patch')			# patch请求

3、GET请求

requests库构建GET请求。

3.1、基本实例

构造一个简单的GET请求:

import requestsr = requests.get('https://www.httpbin.org/get')
print(r.text)#{
#  "args": {}, 
#  "headers": {
#    "Accept": "*/*", 
#    "Accept-Encoding": "gzip, deflate", 
#    "Host": "www.httpbin.org", 
#    "User-Agent": "python-requests/2.31.0", 
#    "X-Amzn-Trace-Id": "Root=1-65fe76c4-16fedcf50d4868a141c3d0a8"
#  }, 
#  "origin": "118.254.22.196", 
#  "url": "https://www.httpbin.org/get"
#}
#

对GET请求添加额外的参数:

data = {'name':'germey','age':25
}
r = requests.get('https://www.httpbin.org/get',params=data)
print(r.text)#{
#  "args": {
#    "age": "25", 
#    "name": "germey"
#  }, 
#}  

网页的返回类型虽然是str类型,但它很特殊,收JSON格式的。所以可调用json方法解析得到JSON格式数据。

r = requests.get('https://www.httpbin.org/get')
print(type(r.text))
print(r.json())
print(type(r.json()))# <class 'str'>
# {'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'www.httpbin.org', 'User-Agent': 'python-requests/2.31.0', 'X-Amzn-Trace-Id': 'Root=1-65fe795f-16d3d7a6715859e8100771b0'}, 'origin': '118.254.22.196', 'url': 'https://www.httpbin.org/get'}
# <class 'dict'>  字典格式

3.2、抓取网页

上述链接返回的是JSON格式,若请求普通网页便能获取相应的内容。

r = requests.get('https://ssr1.scrape.center/')
pattern = re.compile('<h2.*?>(.*?)</h2>',re.S)	# 用正则表达式匹配所有标题内容
titles = re.findall(pattern,r.text)
print(titles)# ['霸王别姬 - Farewell My Concubine', '这个杀手不太冷 - Léon'...

3.3、抓取二进制数据

图片、音频、视频本质上都是由二进制数据组成。

r = requests.get('https://scrape.center/favicon.ico')	# 抓取网站图标
with open('favicon.ico','wb') as f:						# 保存二进制文件f.write(r.content)

3.4、添加请求头

若没有请求头,某些网站会发现这并不是一个由浏览器发起的请求,可能会返回异常结果,使用heders参数添加请求头。

headers = {'User-Aagent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
}
r = requests.get('https://ssr1.scrape.center/',headers=headers)
print(r.text)# 在这个headers参数中可以添加任意其他字段信息

4、POST请求

data = {'name':'germey','age' : 25}
r = requests.post('https://www.httpbin.org/post',data=data)
print(r.text)#{
#	...
#  "form": {				# form就是提交的数据,说明POST请求成功发送
#    "age": "25", 
#    "name": "germey"
#  }, 
#...
#}

5、响应

r = requests.get('https://ssr1.scrape.center/')
print(type(r.status_code),r.status_code)	# 状态码:  int 200
print(type(r.headers),r.headers)			# 响应头: CaseInsensitiveDict {'Date': 'Sat, 23...}
print(type(r.cookies),r.cookies)			# Cookie:  RequestsCookieJar
print(type(r.url),r.url)					# URL: str https://ssr1.scrape.center/
print(type(r.history),r.history)			# 请求历史 list []

requests库还提供了一个内置的状态码查询对象requests.codes

r = requests.get('https://ssr1.scrape.center/')
exit() if not r.status_code == requests.codes.ok else print('请求成功')# 通过比较返回码和内置的表示成功的状态码,来保证请求是否得到了正常响应。

6、高级用法

6.1、文件上传

files = {'file':open('../GET请求/favicon.ico','rb')}
r = requests.post('https://www.httpbin.org/post',files=files)
print(r.text)# "files": {
#    "file": "data:application...
#  }, 
# 证明文件上传部分会单独用一个files字段来标识

6.2、Cookie设置

获取cookie:

r = requests.get('https://www.baidu.com')
print(r.cookies)	
for key,value in r.cookies.items():print(key + '=' + value)#<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
# items方法将cookie转化为由元组组成的列表。遍历输出名称和值,实现解析。

6.3、Session维持

利用session可以做到模拟同一个会话而不用担心Cookie的问题,它通常在模拟登录成功之后,进行下一步操作时用到。

s = requests.Session()
s.get('https://www.httpbin.org/cookies/set/number/123456789')
r = s.get('https://www.httpbin.org/cookies')
print(r.text)

6.4、SSL证书验证

现在很多网站要求使用HTTPS协议,但有些网站有可能没有设置好HTTPS证书,或者网站的HTTPS证书可能不被CA机构认可,这时就可能SSL证书错误提示。

我们可以在浏览器中通过一些设置来忽略证书的验证。

可以使用verify参数控制是否验证证书,设为False在请求时不会验证证书是否有效。

response = requests.get('https://ssr2.scrape.center/',verify=False)
print(response.status_code)# 200

6.5、超时设置

为防止服务器不能及时响应,应设置一个超时时间,如超时则报错。使用timeout参数。

r = requests.get('https://www.httpbin.org/get',timeout=1)
print(r.status_code)# 实际上,请求分为两个阶段:连接(connect)和读取(read)。
# 所以timeout可以分别设置连接和读取的超时时间。
r = requests.get('https://www.httpbin.org/get',timeout=(5,30))

6.6、身份认证

通过auth参数可设置身份认证功能。

import requests
from requests.auth import HTTPBasicAuthr = requests.get('https://ssr3.scrape.center/',auth=HTTPBasicAuth('admin','admin'))
print(r.status_code)   # 200  表示身份认证成功# 简单写法:
r = requests.get('https://ssr3.scrape.center/',auth('admin','admin')) 即可

6.7、代理设置

某些网站面对频繁请求时,可能弹验证码或跳转登录界面甚至封禁。因此,通过proxies设置代理解决。

# HTTP代理:
proxies = {'http':'http://user:password@host:port','https':'http://user:password@host:port'
}
requests.get('https://httpbin.org/get',proxies=proxies)# SOCKS代理:
proxies = {'http':'socks5://user:password@host:port','https':'socks5://user:password@host:port'
}
requests.get('https://httpbin.org/get',proxies=proxies)

6.8、Prepared Request

requests在发送请求时、在内部构造了一个Request对象,并给这个对象赋予了各种参数,包括url、headers、data等。Request对象就是一个Prepared Request类型

因此,我们不用get方法,直接构造一个Prepared Request对象试试:

from requests import Request,Sessionurl='https://www.httpbin.org/post'
data = {'name':'germey'}
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
}
s = Session()
req = Request('POST',url,data=data,headers=headers)	# 构造Request对象
prepped = s.prepare_request(req)					# 转换为Prepared Request对象
r = s.send(prepped)									# 发送请求
print(r.text)# 至此,打到与POST请求同样的效果

相关文章:

Python爬虫之requests库

1、准备工作 pip install requests 2、实例 urllib库中的urlopen方法实际上就是以GET方式请求网页&#xff0c;requests库中相应的方法就是get方法。 import requestsr requests.get(https://www.baidu.com/) print(type(r)) # <class requests.models.Response> 响…...

鱼塘钓鱼(多路归并)

有 N 个鱼塘排成一排&#xff0c;每个鱼塘中有一定数量的鱼&#xff0c;例如&#xff1a;N5 时&#xff0c;如下表&#xff1a; 鱼塘编号12345第1分钟能钓到的鱼的数量 &#xff08;1…1000&#xff09;101420169每钓鱼1分钟钓鱼数的减少量&#xff08;1…100)24653当前鱼塘到…...

java每日一题——买啤酒(递归经典问题)

前言&#xff1a; 非常喜欢的一道题&#xff0c;经典中的经典。打好基础&#xff0c;daydayup!!!啤酒问题&#xff1a;一瓶啤酒2元&#xff0c;4个盖子可以换一瓶&#xff0c;2个空瓶可以换一瓶&#xff0c;请问10元可以喝几瓶 题目如下&#xff1a; 啤酒问题&#xff1a;一瓶…...

最近接到一个大项目,给公司设计抢商品代金劵业务

我们公司是做汽车金融方面的工作&#xff0c;在业内还挺大。目前单量来源于2&#xff0c;3线城市&#xff0c;随着大环境越老越差位了吸引他们&#xff0c; 公司决定给全国的客户&#xff0c;销售等发一些商品 1.总体学习了京东开源秒杀系统设计思路和方案。 我们公司决定进行…...

防火墙(讲解)

目录 1.防火墙是什么? 2.防火墙设备 3.防火墙功能 1)出色的控制能力&#xff0c;过滤掉不安全服务 2)过滤非法用户和访问特殊站点 3)它能够对网络存取和访问进行监控审计 4.防火墙的局限 (1)防火墙有可能是可以绕过的 (2)防火墙不能防止内部出卖性攻击或者内部误操作…...

Python之装饰器-带参装饰器

Python之装饰器-带参装饰器 带参装饰器 之后不是一个单独的标识符&#xff0c;是一个函数调用函数调用的返回值又是一个函数&#xff0c;此函数是一个无参装饰器带参装饰器&#xff0c;可以有任意个参数 func()func(1)func(1, 2) def add(x, y):"""函数说明&…...

抖音IP属地怎么更改

抖音是一个非常受欢迎的短视频平台&#xff0c;吸引了无数用户在上面分享自己的生活和才艺。然而&#xff0c;随着快手的火爆&#xff0c;一些用户开始担心自己的IP地址会被他人获取&#xff0c;引起个人隐私风险。那么&#xff0c;抖音用户又该如何更改到别的地方呢&#xff1…...

Flutter 全局控制底部导航栏和自定义导航栏的方法

1. 介绍 导航栏在移动应用中扮演着至关重要的角色&#xff0c;它是用户与应用之间进行导航和交互的核心组件之一。无论是简单的页面切换&#xff0c;还是复杂的应用导航&#xff0c;导航栏都能够帮助用户快速找到所需内容&#xff0c;提升用户体验和应用的易用性。 在移动应用…...

检索增强生成(RAG)技术:实现流程、作用及应用案例

一. RAG简介 在自然语言处理&#xff08;NLP&#xff09;领域中&#xff0c;检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;技术巧妙地结合了信息检索与神经网络生成模型的力量&#xff0c;通过在生成过程中引入相关的外部信息&#xff0c;实现了在…...

Ubuntu安装和使用

Ubuntu 安装和配置 修改下载源 打开软件与更新, 选择其它站点, 选择中国, 选择阿里云源 谷歌中文输入法配置 Ctrl Alt T打开终端, 执行下述命令下fcitx框架 输入密码进行安装 sudo apt-get install -y fcitx-googlepinyinWin呼出菜单, 选择语言支持, 第一次打开会显示语言…...

【Unity】Stream最好用的Selfhost开源轻量服务

【背景】 有好几种场景的投屏或者远控应用希望实现&#xff0c;无论用哪种方式&#xff0c;都绕不开如何构建服务这一关。 【分析】 外网有很多直接付费使用的信令传输类型或是提供流服务的服务器&#xff0c;但我的目标场景是断绝外网的局域网&#xff0c;而且付费也总觉得…...

Web 常见的攻击方式有哪些?

常见的 Web 攻击方式有以下几种&#xff1a; 跨站脚本攻击&#xff08;XSS 攻击&#xff09; 跨站请求伪造&#xff08;XSRF 攻击&#xff09; SQL 注入 XSS 攻击 MDN 定义如下&#xff1a; 跨站脚本攻击&#xff08;Cross-site scripting&#xff0c;XSS&#xff09;是一…...

Rancher(v2.6.3)——Rancher部署Redis(单机版)

Rancher部署Redis详细说明文档]&#xff1a;https://gitee.com/WilliamWangmy/snail-knowledge/blob/master/Rancher/Rancher%E4%BD%BF%E7%94%A8%E6%96%87%E6%A1%A3.md#6rancher%E9%83%A8%E7%BD%B2redis ps&#xff1a;如果觉得作者写的还行&#xff0c;能够满足您的需求&#…...

stm32-模拟数字转化器ADC

接线图&#xff1a; #include "stm32f10x.h" // Device header//1: 开启RCC时钟&#xff0c;包括ADC和GPIO的时钟//2&#xff1a;配置GPIO将GPIO配置为模拟输入模式//3&#xff1a;配置多路开关将左边的通道接入到规则组中//4&#xff1a;配置ADC转…...

[Repo Git] manifests的写法

​manifests​​是个啥 在Repo​中manifests​描述了Repo客户端的结构&#xff0c;也就是可以从manifests​中知道各个模块的代码应该从代码管理仓库当中哪个位置去获取。 ​manifests​的基本结构是一个Git存储库&#xff0c;在顶层目录中持有一个default.xml​文件。 由于m…...

位置编码与长度外推

位置编码 位置编码从前到后包括:绝对位置编码、余弦位置编码、旋转位置编码、ALiBi相对位置编码。 1 绝对位置编码(Absolute Positional Encoding) 应用的模型:BERT、GPT等Transformer基础模型广泛使用绝对位置编码来处理序列数据。 算法思想:绝对位置编码通过为序列中的…...

Linux信号补充——信号发送和保存

三、信号的发送与保存 3.1信号的发送 ​ 必须有操作系统来保存信号&#xff0c;因为他是管理者&#xff1b; ​ 信号给进程的task_struct发送信号&#xff0c;在task_struct中维护了一个整数signal有0-31位&#xff0c;共32个bit位&#xff1b;对于信号的管理使用的是位图结…...

Vue3 中应该使用 Ref 还是 Reactive?

一、引言 在Vue 3中&#xff0c;构建响应式数据结构是构建用户界面和交互体验的核心部分。而在创建这些响应式数据时&#xff0c;我们有两个主要工具&#xff1a;reactive和ref。选择使用哪一个&#xff0c;实际上取决于你的数据结构和访问需求。 reactive主要用于处理复杂的数…...

红外相机和RGB相机标定:实现两种模态数据融合

1. 前期准备 RGB相机&#xff1a;森云智能SG2-IMX390&#xff0c;1个红外相机&#xff1a;艾睿光电IR-Pilot 640X-32G&#xff0c;1个红外标定板&#xff1a;https://item.taobao.com/item.htm?_ujp3fdd12b99&id644506141871&spma1z09.2.0.0.5f822e8dKrxxYI 2.操作步…...

前端项目,个人笔记(五)【图片懒加载 + 路由配置 + 面包屑 + 路由行为修改】

目录 1、图片懒加载 步骤一&#xff1a;自定义全局指令 步骤二&#xff1a;代码中使用 ​编辑步骤三&#xff1a;效果查看 步骤四&#xff1a;代码优化 2、封装组件案例-传对象 3、路由配置——tab标签 4、根据tab标签添加面包屑 4.1、实现 4.2、bug&#xff1a;需要…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...