python之requests库
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&tpl=mn&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>©2017 Baidu <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> <a href=http://jianyi.baidu.com/ class=cp-feedback>\xe6\x84\x8f\xe8\xa7\x81\xe5\x8f\x8d\xe9\xa6\x88</a> \xe4\xba\xacICP\xe8\xaf\x81030173\xe5\x8f\xb7 <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&tpl=mn&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>©2017 Baidu <a href=http://www.baidu.com/duty/>使用百度å‰å¿
读</a> <a href=http://jianyi.baidu.com/ class=cp-feedback>æ„è§å馈</a> 京ICPè¯030173å· <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()))
- 使用浏览器抓包
- 获取基础请求头“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)
分类:
- 根据知不知道最终服务器的地址:(正向代理、 反向代理)
- 匿名度: (透明代理、 匿名代理、 高匿代理)
- 根据使用的协议: (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 版权协议,转载请附上原文出处链接和本声明。