requests的使用
准备工作
安装request库
pip install request
实例引入
get方法实现GET请求,返回一个Response对象,存放在变量r中,分别输出响应的类型、状态码、响应体的类型、内容以及cookie
import requests r = requests.get('http://www.baidu.com')
print(type(r))
print(r.status_code)
print(type(r.text))
print(r.text[:100])
print(r.cookies)
也可以实现POST、PUT、DELETE等请求
import requests r1 = requests.get('https://www.httpbin.org/get')
r2 = requests.post('https://www.httpbin.org/post')
r3 = requests.put('https://www.httpbin.org/get/put')
r4 = requests.delete('https://www.httpbin.org/get/delete')
r5 = requests.patch('https://www.httpbin.org/get/patch')
GET请求
- 基本实例使用requests库构建一个GET请求
import requests r = requests.get('https://www.httpbin.org/get')
print(r.text)
使用params参数给URL添加参数
import requests data = {
'name': 'admin',
'age': 25
} r = requests.get('https://www.httpbin.org/get', params=data)
print(r.text)
把URL参数以字典的形式传给get方法的params参数,请求的链接被自动构造成含参链接,网页的返回类型为str类型,但是是JSON格式的,若想直接解析返回结果,得到一个JSON格式的数据,可调用json方法将返回结果转换为字典。d
import requests r = requests.get('https://www.httpbin.org/get')
print(type(r.text))
print(r.json())
print(type(r.json()))
- 抓取网页
使用正则表达式提取网页标题
import requests
import re r = requests.get('https://ssr1.scrape.center/')
pattern = re.compile('<h2.*?>(.*?)</h2>', re.S)
titles = re.findall(pattern, r.text)
print(titles)
- 抓取二级制数据
上面例子为使用某些规则抓取网页的部分内容,若想抓取图片、音频、视频等文件时,这些文件本质上是由二进制编码组成,要抓取这些文件需要拿到他们的二进制数据。
import requests r = requests.get('https://scrape.center/favicon.ico')
print(type(r.text))
print(r.text)
print(type(r.content))
print(r.content)
r.content前面的b代表这是bytes类型的数据,r.tex在打印时会转换为str类型,也就是图片直接转换为字符串,所以会乱码。
将提取的二进制数据保存
import requests r = requests.get('https://scrape.center/favicon.ico')
# 以二进制写的方式打开文件
with open('favicon.ico', 'wb') as f:
f.write(r.content)
POST请求
import requests data = {
'name': 'admin',
'age': 25
} r = requests.post('https://httpbin.org/post', data=data)
print(r.text)
响应
除了使用text和content获取响应内容外。还有许多属性和方法来获取信息,例如状态码、响应头、Cookie等
import requests r = requests.get('https://ssr1.scrape.center/')
print(type(r.status_code), r.status_code)
print(type(r.headers), r.headers)
print(type(r.cookies), r.cookies)
print(type(r.url), r.url)
print(type(r.history), r.history)
requests库提功了内置的状态码查询对象requests.codes
import requests r = requests.get('https://ssr1.scrape.center/')
exit() if not r.status_code == requests.codes.ok else print('请求成功')
常用返回码和相应的查询条件P53
当使用 requests
发送一个请求时,你可以通过 response.status_code
来获取状态码,并使用 response.text
或 response.json()
(如果返回的是 JSON)来获取响应的内容。
高级用法
- 文件上传
import requests files = {'file': open('favicon.ico', 'rb')}
r = requests.post('http://httpbin.org/post', files=files)
print(r.text)
- Cookie设置
ookies写法复杂,可使用requests获取和设置Cookie
import requests r = requests.get('http://www.baidu.com')
# 调用cookies属性,成功得到Cookie,属于RequestCookieJar类型
print(r.cookies)
# 调用items方法将Cookie转换为由元组组成的列表,遍历输出Cookie中的每一个条目的名称和值,实现遍历解析
for key, values in r.cookies.items():
print(key + '=' + values)
可以用cookie来维持登录状态。以github为例,登录自己的账号:
import requests headers = {
'Cookie': '_octo=GH1.1.229921746.1716358908; preferred_color_mode=light; tz=Asia%2FShanghai; color_mode=%7B%22color_mode%22%3A%22auto%22%2C%22light_theme%22%3A%7B%22name%22%3A%22light%22%2C%22color_mode%22%3A%22light%22%7D%2C%22dark_theme%22%3A%7B%22name%22%3A%22dark%22%2C%22color_mode%22%3A%22dark%22%7D%7D; logged_in=yes; dotcom_user=2811006977'
} r = requests.get('https://github.com/', headers=headers)
print(r.text)
也可以通过cookies参数来设置Cookie信息。构造一个RequestsCookieJar对象,将刚才的Cookie进行处理及赋值。
import requests cookies = '_octo=GH1.1.229921746.1716358908; preferred_color_mode=light; tz=Asia%2FShanghai; color_mode=%7B%22color_mode%22%3A%22auto%22%2C%22light_theme%22%3A%7B%22name%22%3A%22light%22%2C%22color_mode%22%3A%22light%22%7D%2C%22dark_theme%22%3A%7B%22name%22%3A%22dark%22%2C%22color_mode%22%3A%22dark%22%7D%7D; logged_in=yes; dotcom_user=2811006977' jar = requests.cookies.RequestsCookieJar()
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36'
}
for cookie in cookies.split(';'):
key, value = cookie.split('=', 1)
jar.set(key, value)
r = requests.get('https://github.com/', cookies=jar, headers=headers)
print(r.text)
- Session维持
利用Session可以做到模拟同一个会话而不用担心Cookie的问题,通常在模拟登陆成功之后进行下一步操作时用到。
案例:如果沿用之前写法并不会输出cookie
import requests requests.get('http://httpbin.org/cookies/set/number/123456789')
r = requests.get('http://httpbin.org/cookies')
print(r.text)
改用session继续尝试
import requests s = requests.Session()
s.get('http://httpbin.org/cookies/set/number/123456789')
r = s.get('http://httpbin.org/cookies')
print(r.text)
- SSL证书验证
很多网站要求使HTTPS协议,但是有的网站可能没有设置好HTTPS证书,或者证书没有被CA机构认可,所以网站可能出现SSL证书错误的提示。
可以在浏览器汇总通过一些设置来说忽略证书的验证
import requests response = requests.get('https://ssr2.scrape.center/', verify=False)
print(response.status_code)
此处的警告可以通过设置忽略警告的方式以来屏蔽:
import urllib3
urllib3.disable_warnings()
或者通过捕获警告到日志的方式忽略警告
import logging
logging.captureWarnings(True)
- ·超时设置
import requests r = requests.get('http://www.httpbin.org/get', timeout=1)
print(r.status_code)
请求分为两个部分:连接(connect)和读取(read)
timeout是连接和读取的总和,若想分别制定作用,可以传入一个元组
r = requests.get('http://www.httpbin.org/get', timeout=(2, 30))
- 身份认证
urllib库进行身份验证较为繁琐,可以直接使用requests库
import requests
from requests.auth import HTTPBasicAuth r = requests.get('https://ssr3.scrape.center/',auth=HTTPBasicAuth('user','password'))
print(r.status_code)
如果参数都传一个HTTPBasicAuth类很繁琐,可以直接传一个元组,会默认使用HTTPBasicAuth这个类来验证
import requests r = requests.get('https://ssr3.scrape.center/', auth=('user', 'password'))
print(r.status_code)
requests库还提供了其他认证方式,如OAuth认证
pip install requests_oauthlib
import requests
from requests_oauthlib import OAuth1 url = 'https://api.twitter.com/1.1/account/verify_credentials.json'
auth = OAuth1('YOUR_API_KEY', 'YOUR_API_SECRET', 'YOUR_ACCESS_TOKEN', 'YOUR_ACCESS_TOKEN_SECRET')
requests.get(url, auth=auth)
- 代理设置
大规模爬取,频繁请求可能会导致封禁ip,可以使用proxies设置代理来解决(代理替换为有效代理)
import requests proxies = {
'http': 'http://117.42.94.192:20720',
'https': 'http://117.42.94.192:20720',
}
requests.get('https://www.httpbin.org/get', proxies=proxies)
若代理需要身份认证,可使用类似http://user://password@host:post这样的语句来设置代理
import requests proxies = {'https://user://password@127.0.0.1:8080/', }
requests.get('https://www.httpbin.org/get', proxies=proxies)
除基本的HTTP代理,requests库还支持SOCKS协议的代理
pip install “request[socks]”
import requests proxies = {
'http': 'socks5://127.0.0.1:1080',
'https': 'socks5://127.0.0.1:1080'
}
response = requests.get('http://www.baidu.com', proxies=proxies)
- Prepared Request
使用requests库的get和post请求的时,在内部构造一个Request对象发送出去,请求成功后会再得到一个Response对象,解析这个对象即可。Request对象实际上就是Prepared Request
不用get方法,直接构造Prepared Request:引入Request类,用url、data和headers参数构造一个Request对象,再调用Session类的prepare_request方法将其转换为一个Prepared Request对象,在调用一个send发送
from requests import Session,Request url = 'http://www.httpbin.org/post'
data = {'name': 'data'}
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Safari/605.1.15'
}
session = Session()
req = Request('POST', url, data=data, headers=headers)
prepped = session.prepare_request(req)
r = session.send(prepped)
print(r.text)
requests的使用的更多相关文章
- requests的content与text导致lxml的解析问题
title: requests的content与text导致lxml的解析问题 date: 2015-04-29 22:49:31 categories: 经验 tags: [Python,lxml, ...
- requests源码阅读学习笔记
0:此文并不想拆requests的功能,目的仅仅只是让自己以后写的代码更pythonic.可能会涉及到一部分requests的功能模块,但全看心情. 1.另一种类的初始化方式 class Reques ...
- Python爬虫小白入门(二)requests库
一.前言 为什么要先说Requests库呢,因为这是个功能很强大的网络请求库,可以实现跟浏览器一样发送各种HTTP请求来获取网站的数据.网络上的模块.库.包指的都是同一种东西,所以后文中可能会在不同地 ...
- 使用beautifulsoup与requests爬取数据
1.安装需要的库 bs4 beautifulSoup requests lxml如果使用mongodb存取数据,安装一下pymongo插件 2.常见问题 1> lxml安装问题 如果遇到lxm ...
- python爬虫学习(6) —— 神器 Requests
Requests 是使用 Apache2 Licensed 许可证的 HTTP 库.用 Python 编写,真正的为人类着想. Python 标准库中的 urllib2 模块提供了你所需要的大多数 H ...
- ImportError: No module named 'requests'
补充说明: 当前环境是在windows环境下 python版本是:python 3.4. 刚开始学习python,一边看书一边论坛里阅读感兴趣的代码, http://www.oschina.net/c ...
- Python-第三方库requests详解
Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库.它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTT ...
- Requests 乱码
当使用Requests请求网页时,出现下面图片中的一些乱码,我就一脸蒙逼. 程序是这样的. def getLinks(articleUrl): headers = { "Uset-Agent ...
- 爬虫requests模块 2
会话对象¶ 会话对象让你能够跨请求保持某些参数.它也会在同一个 Session 实例发出的所有请求之间保持 cookie, 期间使用 urllib3 的 connection pooling 功能.所 ...
- 爬虫requests模块 1
让我们从一些简单的示例开始吧. 发送请求¶ 使用 Requests 发送网络请求非常简单. 一开始要导入 Requests 模块: >>> import requests 然后,尝试 ...
随机推荐
- 性能提升3倍、时延降低70%,阿里云企业级存储ESSD云盘再升级!
9月22日,阿里云存储年度新品发布会上,阿里云基础产品资深产品总监陈起鲲发布了其全球领先的旗舰级块存储产品ESSD的两款新规格(ESSD Auto PL.ESSD PL-X),并宣布了新增的多项企业级 ...
- [FAQ] FinalCutPro 竖版视频 加模糊背景变 横版视频
把一段影片拖到时间轴上面,注意自定义尺寸选择 1920 x 1080,因为竖版的是 1080 x 1920. 切换到仅视频,并选择变形,视频区左右拖动视频到最大. 设置模糊效果为高斯曲线. 切回到全部 ...
- docker镜像仓库搭建-Harbor
一.Harbor简介 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器. 作为一个企业级私有 Registry 服务器,Harbor 提供了更好的性能和安全.提升用户使用 ...
- 第3讲-Cadence分裂元件的制作方法
笔记3-Cadence分裂元件的制作方法 1.Homogeneous和heterogeneous的区别: 2.创建homogeneous类型元件: 3.创建heterogeneous类型元件. 把元件 ...
- P10118 『STA - R4』And
P10118 『STA - R4』And 题意:给定 A,B,求 \(\sum y - x\),其中 x,y 满足: x < y x + y = A x & y = B 对于加运算和与运 ...
- lodash中的深拷贝方法cloneDeep()
- Flink Batch Hash Aggregate
数据类型要求 BatchPhysicalHashAggRule match 条件会判断 isAggBufferFixedLength(agg) 为什么要求 aggCall 的类型是 Fixed Len ...
- 【PB案例学习笔记】-01创建应用、窗口与控件
写在前面 这是PB案例学习笔记系列文章的第一篇,也是最基础的一篇.后续文章中[创建程序基本框架]部分操作都跟这篇文章一样, 将不再重复.该系列文章是针对具有一定PB基础的读者,通过一个个由浅入深的编程 ...
- IceRPC之传入响应和拦截器
作者引言 .Net 8.0 下的新RPC 很高兴啊,我们来到了IceRPC之传入响应和拦截器->快乐的RPC, 基础引导,让自已不在迷茫,快乐的畅游世界. 传入响应 Incoming respo ...
- Intel HDSLB 高性能四层负载均衡器 — 基本原理和部署配置
前言 在上一篇<Intel HDSLB 高性能四层负载均衡器 - 快速入门和应用场景>中,我们着重介绍了 HDSLB(High Density Scalable Load Balancer ...