Requests模块是一个用于网络访问的模块。
目录
还可以传递一个list给一个请求参数:可以看到确实访问了正确的url。
在requests模块中,又加入了json这个关键字参数,可以直接发送json数据给post请求
在request模块中,用files参数可以post一个文件
response.raw.read() 获得服务器返回的原始数据
response.request.headers 打印出请求头:
自定义的headers(通过headers关键字参数传递):
timeout参数 设定url的请求超时时间(时间单位为秒):
proxies关键字参数 指定代理来进行http或https访问
一、导入
安装:在cmd窗口输入:
pip install requests
下载完成后,导入模块很简单,代码如下:
import requests
二、请求url
这里我们列出最常见的发送get或者post请求的语法。
1.发送无参数的get请求:
response = requests.get("http://www.baidu.com/")
现在,我们得到了一个响应对象response,我们可以利用这个对象得到我们想要的任何信息。
2.通过 params 关键字发送带参数的get请求
payload={'key1':'value1','key2':'value2'}
response=requests.get("http://www.baidu.com/",params=payload)
测试是否正确:
print(response.url)
# http://www.baidu.com/?key1=value1&key2=value2
还可以传递一个list给一个请求参数:可以看到确实访问了正确的url。
payload={'key1':'value1','key2':["'value2'","value3"]}
response=requests.get("http://www.baidu.com/",params=payload)
print(response.url)
# http://www.baidu.com/?key1=value1&key2=%27value2%27&key2=value3
举例:
import requests
url = "http://www.mmthat.com/viewthread.php?tid=1195561&extra=page%3D1"
# header = {
# 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36',
# 'Cookie': '2572147169_todaycount=0; 2572147169_totalcount=18598; x-stgw-ssl-info=8e01a4c48521612eac9fcee4c95e2751|0.014|1550323043.115|56|.|I|TLSv1.2|ECDHE-RSA-AES128-GCM-SHA256|52500|h2|0; RK=heYEibZxv3; ptcz=6a0a0a41d85d9a5c3454165d6d3ccaea77cc5560bb42a0ba754d5a497bc2eafa; pgv_pvi=283785216; pgv_pvid=158917645; qz_screen=1536x864; QZ_FE_WEBP_SUPPORT=1; __Q_w_s__QZN_TodoMsgCnt=1; __Q_w_s_hat_seed=1; ptisp=cm; Loading=Yes; osstat=16; qqmusic_uin=; qqmusic_key=; qqmusic_fromtag=; pgv_info=ssid=s9281594176; pgv_si=s7002632192; _qpsvr_localtk=0.538144406285773; qzmusicplayer=qzone_player_2572147169_1550322963116; scstat=16; x-stgw-ssl-info=867c32540f06d372e03add1cef72cd02|0.005|1550322975.246|55|.|I|TLSv1.2|ECDHE-RSA-AES128-GCM-SHA256|55500|h2|0; cpu_performance_v8=17; zzpaneluin=; zzpanelkey=; _qz_referrer=i.qq.com; uin=o2572147169; skey=@mYKKfLNf1; qzone_check=2572147169_1550323046; p_uin=o2572147169; pt4_token=xnrkYfh*tu4HVGBPJamsn*IPfVZ-jpVeNAKATAPgz14_; p_skey=zGIQoKXbncDuCDVAEk5LaYqeUKcx0ZUczyBAUWXbyJs_',
# "referer": "https://qzs.qzone.qq.com/qzone/v5/loginsucc.html?para=izone&specifyurl=http%3A%2F%2Fuser.qzone.qq.com%2F2572147169%2Finfocenter",
# }
cookies = {'cdb_sid': 'U6sKQ2',
'is_use_cookied': 'yes',
'is_use_cookiex': 'yes',
'cdb_cookietime': '2592000',
'cdb_auth': 'sB2zgeM2DD9ztSlD73NsMO79zlzUxLoZ9HJrdUhA5lqrejEszorzKneV7rI4EmKSlR1Svf3%2FS8Cu'}
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36',
"Referer":"quote",
}
response = requests.get(url, headers=header,cookies=cookies)
# response = requests.request("GET",url)
response.encoding = "utf-8"
html = response.content.decode("gbk")
print(html)
3.发送post请求
post请求参数是以data关键字参数来传递的
response= requests.post("http://www.baidu.com/", data={'key1':'value1'})
在requests模块中,又加入了json这个关键字参数,可以直接发送json数据给post请求
data_json = {'key1':'value1'}
response= requests.post("http://www.baidu.com/", json=data_json)
在request模块中,用files参数可以post一个文件
url='http://www.baidu.com/'
files={'file':open('demo.txt','rb')}
response=requests.post(url,files=files)
print(response.url) # http://www.baidu.com/
print(response.content) # 二进制的网页内容
print(response.text) # 网页内容(好像乱码)
还可以在post文件时指定文件名等额外的信息:
url = 'http://www.baidu.com/'
files = {'file': ('demo.txt', open('demo.txt', 'rb'),{'Expires':'0'})} # Expires: 0 ,无效格式日期
response = requests.post(url, files=files)
注意:强烈建议使用 “带b” 模式打开文件,因为如果以文本文件格式打开时,可能会因为“Content-Length”这个header而出错。
举例:
import requests
url = "https://fanyi.baidu.com/basetrans"
data = {'query': '我',
'from': 'zh',
"to": "en",
'token': '5ae118aed1a19d06e0825ec80415bcb2',
'sign': 569291.806138
}
header = {
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
}
response = requests.post(url, data=data, headers=header)
html_str = response.content.decode()
print(html_str)
三、获取返回信息
发送请求后获取返回信息:
response.text 获取文本内容
import requests
url = 'http://www.baidu.com/'
response = requests.get(url)
response.encoding = "utf-8" #默认为 ascii 此处将编码格式改为 utf-8
# print(response.encoding)
print(response.text) # 网页响应内容
response.content 获取字节流内容
这个和response.text有什么区别呢?
r.content返回的是字节流,如果我们请求一个图片地址并且要保存图片的话,就可以用到,这里举个代码片段如下:
import requests
url = 'https://tpc.googlesyndication.com/simgad/18045151779926303483'
response = requests.get(url)
print(response.content) # 返回是 字节
with open("a.png","wb") as f:
f.write(response.content)
response.json() 获取json格式的数据
如果请求对应的响应是一个json,这个方法可以直接拿到json格式的数据。
response.raw.read() 获得服务器返回的原始数据
注意:请求时加上“stream=True”
import requests
url = 'https://tpc.googlesyndication.com/simgad/18045151779926303483'
response = requests.get(url,stream=True) # 此处多一个参数
print(response.raw.read())
response.status_code 获得到响应状态码
import requests
url = 'http://www.baidu.com/'
response = requests.get(url)
print(response.status_code) # 200
四、关于headers
response.headers 打印出响应头:
print(response.headers) # 返回一个字典类型
# {'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'Keep-Alive'}
response.request.headers 打印出请求头:
print(response.request.headers)
自定义的headers(通过headers关键字参数传递):
import requests
url = 'http://www.baidu.com/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36',
}
response = requests.get(url,headers=headers) # 此处加上参数 headers
response.encoding = "utf-8"
print(response.text)
五、关于Cookies
import requests
url = 'http://www.baidu.com/'
response = requests.get(url )
print(list(response.cookies))
# [Cookie(version=0, name='BDORZ', value='27315', port=None)]
1)一种方式:
import requests
url = 'http://www.baidu.com/'
cookies = {'cdb_sid': 'U6sKQ2'}
response = requests.get(url,cookies=cookies) # cookies 关键字参数
2)第二种方式:
import requests
url = 'http://www.baidu.com/'
headers = {"User-Agent":"...","Cookie":"cookie字符串"} #cookie 放到headers 里面
response = requests.get(url,headers =headers )
六、关于重定向
response.history 查看重定向
print(response.history) # 获取到响应的重定向网址,没有返回一个空列表
allow_redirects 参数 禁止服务器自动重定向
response = requests.get('http://www.baidu.com', allow_redirects=False)
七、关于请求时间
timeout参数 设定url的请求超时时间(时间单位为秒):
requests.get('http://www.baidu.com', timeout=1)
八、关于代理
proxies关键字参数 指定代理来进行http或https访问
__proxies = {
"http": "http://10.10.1.10:3128",
"https": "http://10.10.1.10:1080",
}
requests.get("http://www.baidu.com", proxies= __proxies)
九、关于session
我们需要登录某个网站,然后才能请求相关url,这时就可以用到session了,我们可以先使用网站的登录api进行登录,然后得到session,最后就可以用这个session来请求其他url了:
import requests
session=requests.Session() #实例化session 可以自己把他想象成 response
login_data={'form_email':'你的邮箱','form_password':'你的密码'}
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36',}
url = "http://www.renren.com/PLogin.do"
session.post(url,headers= headers, data= login_data)
#服务器设置在本地的cookie会保存到session中,url就是登录是否的from表单中的action地址。
response = session.get('http://www.renren.com/327550029/profile')
print(response.text)
十、下载页面
使用Requests模块也可以下载网页,代码如下:
import requests
url = 'http://www.baidu.com/'
response = requests.get(url)
with open("new_html.html","wb") as new_html:
new_html.write(response.content) # 写入内容