python之requests库

  • Post author:
  • Post category:python




requests库

需要安装后使用

环境安装:pip install requests

Requests模块是一个用于网络请求的模块,主要用来模拟浏览器发请求。其实类似的模块有很多,比如urllib,urllib2,httplib,httplib2,他们基本都提供相似的功能。但是这些模块都复杂而且差不多过时了,requests模块简单强大高效,使得其在众多网络请求模块中脱引而出。



请求方法

最常用的就是GET和POST方法

requests.get ()
requests.post ()
requests.put ()
requests.delete ()
requests.head ()
requests.options ()



示例get方法

import requests

r = requests.get('https://www.baidu.com')
print(r)
print(r.headers)                                # 返回响应头,字典格式
print(r.apparent_encoding)                      # 编码方式
print(r.content)                                # 返回响应的内容,以字节为单位
print(r.cookies)                                # 返回一个 CookieJar 对象,包含了从服务器发回的 cookie
print(r.elapsed)                                # 返回一个 timedelta 对象,包含了从发送请求到响应到达之间经过的时间量,可以用于测试响应速度。比如 r.elapsed.microseconds 表示响应到达需要多少微秒。
print(r.history)                                # 返回包含请求历史的响应对象列表(url)
print(r.is_permanent_redirect)                  # 如果响应是永久重定向的 url,则返回 True,否则返回 False
print(r.is_redirect)                            # 如果响应被重定向,则返回 True,否则返回 False
print(r.iter_content())                         # 迭代响应
print(r.iter_lines())                           # 迭代响应的行
#print(r.json())                                 # 返回结果的 JSON 对象 (结果需要以 JSON 格式编写的,即需要请求json对象,否则会引发错误)
print(r.links)                                  # 返回响应的解析头链接,字典
print(r.next)                                   # 返回重定向链中下一个请求的 PreparedRequest 对象
print(r.ok)                                     # 检查 "status_code" 的值,如果小于400,则返回 True,如果不小于 400,则返回 False
print(r.raise_for_status())                     # 如果发生错误,方法返回一个 HTTPError 对象
print(r.reason)                                 # 响应状态的描述,比如 "Not Found" 或 "OK"
print(r.request)                                # 返回请求此响应的请求对象
print(r.status_code)                            # 返回 http 的状态码,比如 404 和 200(200 是 OK,404 是 Not Found)
print(r.text)                                   # 返回响应的内容,unicode 类型数据
print(r.url)                                    # 返回响应的 URL
r.close()                                       # 关闭与服务器的连接



get方法访问百度的输出

print(r)
<Response [200]>

print(r.headers)                                # 返回响应头,字典格式
{'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Fri, 06 Jan 2023 08:54:55 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:24:45 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'}

print(r.apparent_encoding)                      # 编码方式
utf-8

print(r.content)                                # 返回响应的内容,以字节为单位
b'<!DOCTYPE html>\r\n<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css><title>\xe7\x99\xbe\xe5\xba\xa6\xe4\xb8\x80\xe4\xb8\x8b\xef\xbc\x8c\xe4\xbd\xa0\xe5\xb0\xb1\xe7\x9f\xa5\xe9\x81\x93</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus=autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=\xe7\x99\xbe\xe5\xba\xa6\xe4\xb8\x80\xe4\xb8\x8b class="bg s_btn" autofocus></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>\xe6\x96\xb0\xe9\x97\xbb</a> <a href=https://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>\xe5\x9c\xb0\xe5\x9b\xbe</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>\xe8\xa7\x86\xe9\xa2\x91</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>\xe8\xb4\xb4\xe5\x90\xa7</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>\xe7\x99\xbb\xe5\xbd\x95</a> </noscript> <script>document.write(\'<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=\'+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ \'" name="tj_login" class="lb">\xe7\x99\xbb\xe5\xbd\x95</a>\');\r\n                </script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">\xe6\x9b\xb4\xe5\xa4\x9a\xe4\xba\xa7\xe5\x93\x81</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>\xe5\x85\xb3\xe4\xba\x8e\xe7\x99\xbe\xe5\xba\xa6</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>\xe4\xbd\xbf\xe7\x94\xa8\xe7\x99\xbe\xe5\xba\xa6\xe5\x89\x8d\xe5\xbf\x85\xe8\xaf\xbb</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>\xe6\x84\x8f\xe8\xa7\x81\xe5\x8f\x8d\xe9\xa6\x88</a>&nbsp;\xe4\xba\xacICP\xe8\xaf\x81030173\xe5\x8f\xb7&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>\r\n'

print(r.cookies)                                # 返回一个 CookieJar 对象,包含了从服务器发回的 cookie
<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>

print(r.elapsed)                                # 返回一个 timedelta 对象,包含了从发送请求到响应到达之间经过的时间量,可以用于测试响应速度。比如 r.elapsed.microseconds 表示响应到达需要多少微秒。
0:00:00.318688

print(r.history)                                # 返回包含请求历史的响应对象列表(url)
[]

print(r.is_permanent_redirect)                  # 如果响应是永久重定向的 url,则返回 True,否则返回 False
False

print(r.is_redirect)                            # 如果响应被重定向,则返回 True,否则返回 False
False

print(r.iter_content())                         # 迭代响应
<generator object iter_slices at 0x00000239DB9F2CF0>

print(r.iter_lines())                           # 迭代响应的行
<generator object Response.iter_lines at 0x00000239DB9F2CF0>

#print(r.json())                                 # 返回结果的 JSON 对象 (结果需要以 JSON 格式编写的,否则会引发错误)
#此处报错

print(r.links)                                  # 返回响应的解析头链接,字典
{}

print(r.next)                                   # 返回重定向链中下一个请求的 PreparedRequest 对象
None

print(r.ok)                                     # 检查 "status_code" 的值,如果小于400,则返回 True,如果不小于 400,则返回 False
True

print(r.raise_for_status())                     # 如果发生错误,方法返回一个 HTTPError 对象
None

print(r.reason)                                 # 响应状态的描述,比如 "Not Found" 或 "OK"
OK

print(r.request)                                # 返回请求此响应的请求对象
<PreparedRequest [GET]>

print(r.status_code)                            # 返回 http 的状态码,比如 404 和 200(200 是 OK,404 是 Not Found)
200

print(r.text)                                   # 返回响应的内容,unicode 类型数据
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css><title>ç™¾åº¦ä¸€ä¸‹ï¼Œä½ å°±çŸ¥é“</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus=autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn" autofocus></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>æ–°é—»</a> <a href=https://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');
                </script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>å
³äºŽç™¾åº¦</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前å¿
读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>


print(r.url)                                    # 返回响应的 URL
https://www.baidu.com/



指定方法发送请求

在指定方法发送请求的时候,有时候还需要在请求方法括号中requests.get(url=url, xx = xx)指定一些参数在。

例如:

方法 参数名字
HTTP头部 headers
GET参数 params
POST参数 data
文件 files
Cookies cookies
重定向处理 allow_ redirects = False/True
超时 timeout
证书验证 verify = False/True
工作流(延迟下载) stream=False/ True
事件挂钩 hooks=dict(response=)
身份验证 auth=
代理 proxies=



简单的requests请求例子

import requests

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

# 将爬虫程序伪装成浏览器,从而获得更完整的响应数据
headers = {
    "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36"
}

# 定义响应
response = requests.get(url, headers = headers)

# 打印网页源码的str类型数据
print(response.text)



response 响应对象的text和content之间的区别

# response.text 和 response.content 的区别

## respons.text ( == response.content.decode)

类型: str
解码类型: requests模块自动根据HTTP头部对响应的编码作出有根据的推测,推测文本编码


## response.content

类型: bytes
解码类型: 没有指定
解决中文乱码问题:
response.content.decode( ) 默认utf-8

response.content.decode(“GBK”)

# 常见的编码字符集:

utf-8
gbk
gb2313
ascii
iso-8859-1



发送 带header的请求

可以得到更详细的响应(让服务器以为是浏览器在操作)

url = "https://www.baidu.com"
headers = {
    #内容为json形式
    'User_Agent' : '',
    'Cookie' : ''
}
response = requests.get(url, headers = headers)
print(response.content.decode())
# 获取响应数据量
print(len(response.content.decode()))
  1. 使用浏览器抓包
  2. 获取基础请求头“user_agent”



发送带参数的请求

# 1. url中带参数
# https://www.baidu.com/s?wd=python
#
# 2. 使用params参数
# 发送请求的时候设置参数字典(将params添加至get方法中)

# # 添加的参数格式
# params = {
# 	# json 格式
# 	" " : " ",
# 	" " : " "
# }

示例:

import requests
url = 'https://www.baidu.com/s?'
# 添加请求头
headers = {   #内容为json形式
'User-Agent': ''
}
#构架参数字典
params = {
   'wd' : 'python'
}
# 将参数字典添加至get方法中
response = requests.get(url, headers = headers, params = params)
#返回相应网页地址
print(response.url)



在headers参数中携带Cookie

用来做状态的保持

# 使用cookie参数保持会话的步骤
# 1.构建cookies字典
# 2.在请求的时候将cookie字典赋值给cookies参数



两种使用cookie的形式:



1.
import requests

url = "https://home.jd.com/"

headers = {
    "User-Agent": "",
    "cookie": ""
}

response = requests.get(url, headers=headers)

print(response.text)




2.
import requests

url = "https://home.jd.com/"

headers = {
    "User-Agent": ""
}

cookie = {
    "cookie": ""
}

response = requests.get(url, headers=headers, cookies=cookie)

print(response.text)



超时参数(timeout)

import requests

url = 'https://google.com'

# 添加一个timeout参数,当等待2秒还没响应时,自动停止
response = requests.get(url, timeout=2)



使用代理IP (proxies)

分类:

  1. 根据知不知道最终服务器的地址:(正向代理、 反向代理)
  2. 匿名度: (透明代理、 匿名代理、 高匿代理)
  3. 根据使用的协议: (http、 https、 socks隧道代理)
proxies = {
    # json格式
    "http": "http://·····"

    # 或

            # "https": "https://·····"
}

response = requests.get(url, proxies=proxies)



使用verify参数忽略CA证书

response = requests.get(url, verify=False)

参考:

python之requests模块详解

https://blog.csdn.net/qq_44159028/article/details/120459524

Python网络爬虫(三. Requests模块)

https://blog.csdn.net/qq_54528857/article/details/120811884



版权声明:本文为qq_44659804原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。