1.文档:
官方文档
http://cn.python‐requests.org/zh_CN/latest/
快速上手
http://cn.python‐requests.org/zh_CN/latest/user/quickstart.html
2.安装
pip install requests
3.response的属性以及类型
类型 :models.Response
r.text : 获取网站源码
r.encoding :访问或定制编码方式
r.url :获取请求的url
r.content :响应的字节类型
r.status_code :响应的状态码
r.headers :响应的头信息
例:
import requests
url = 'http://www.baidu.com'
response = requests.get(url = url)
# 一个类型和六个属性
# response 类型
print(type(response)) #<class 'requests.models.Response'>
# 设置响应的编码格式
response.encoding = 'utf-8'
# 以字符串的形式返回了网页源码
print(response.text)
# 返回一个url地址
print(response.url)
# 返回的是二进制的数据
print(response.content)
# 返回响应的状态码
print(response.status_code)
# 返回响应头
print(response.headers)
requests.get()
eg:
import requests
url = 'http://www.baidu.com/s?'
headers = {
'User‐Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML,
like Gecko) Chrome/65.0.3325.181 Safari/537.36'
}
data = {
'wd':'北京'
}
response = requests.get(url,params=data,headers=headers)
定制参数
参数使用params传递
参数无需urlencode编码
不需要请求对象的定制
请求资源路径中?可加可不加
例:
# urllib
# 1 一个类型以及六个方法
# 2 get请求
# 3.post 请求 百度翻译
# 4, ajax的get请求
# 5. ajax的post请求
# 6. cookie 登录 微博
# 7 代理
# requests
# 1.一个类型以及六个属性
# 2 get请求
# 3 post请求
# 4 代理
# 5 cookie 验证码
import requests
url = 'https://www.baidu.com/s?'
headers= {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
data = {
'wd': '北京'
}
# url 请求资源路径
# params 参数
# kwargs 字典
response = requests.get(url=url,params=data,headers=headers)
content = response.text
print(content)
'''
总结:
1 参数使用params传递
2 参数无须urlencode编码
3 不需要请求对象定制
4 请求资源路径中的?可以加也可以不加
'''
requests.post()
百度翻译:
eg:
import requests
post_url = 'http://fanyi.baidu.com/sug'
headers={
'User‐Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
}
data = {
'kw': 'eye'
}
r = requests.post(url = post_url,headers=headers,data=data)
例:
import requests
url = 'https://fanyi.baidu.com/v2transapi?from=en&to=zh'
headers= {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',
'Cookie': 'BIDUPSID=F16CB27ACF03F17C663329DE31E4062A; PSTM=1636886727; __yjs_duid=1_55c745398f06267e3638446ca7d77d7f1636887396137; BAIDUID=6DEE7240C943288B149F4CCB41CDA797:FG=1; MCITY=-131%3A; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; APPGUIDE_10_0_2=1; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; BDRCVFR[_9ZHYSeLVAT]=788S7gSrw2CuvqEuvk-Uh7vQhP8; H_PS_PSSID=; delPer=0; PSINO=1; BDRCVFR[fPgyykSwtk3]=788S7gSrw2CuvqEuvk-Uh7vQhP8; BA_HECTOR=05al8h8585058l8lsl1h4so4k0r; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1649067782,1649303702; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1649303702; ab_sr=1.0.1_OTIxYTM4NWNmMjQ0YmVjZTQzMDNmNjRiZTAwODhiYTY3MjA2MDg1NTQxODhiYWM1YWNhMzA3MGQ1YzdkNDc1NDM4NTAyMDg1ZDMwYjIwMDMyMDUyOGEwYTg1Zjk3MDM1MGMyNTllNTViODc1NjY5MzBhNGRmNTUwOGVhZjRmZDNlZjZjYWI4NmQwZjA5NGY3MGM1Y2UzN2UwOGFiMzhhZg=='
}
data= {
'query': 'eye',
'token': 'fcb141eb5cc8b83af203e132e27bcb76',
'sign': 67056.386753,
}
# url请求地址
# data 请求参数
# kwargs 字典
response = requests.post(url=url,data=data,headers=headers)
content = response.text
print(content)
import json
obj = json.loads(content)
print(obj)
# 总结
# 1. post请求 是不需要编解码
# 2. post请求的参数是data
# 3. 不需要请求对象的定制
#
get和post区别?
1: get请求的参数名字是params post请求的参数的名字是data
2: 请求资源路径后面可以不加?
3: 不需要手动编解码
4: 不需要做请求对象的定制
proxy定制
在请求中设置proxies参数
参数类型是一个字典类型
eg:
import requests
url = 'http://www.baidu.com/s?'
headers = {
'user‐agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML,
like Gecko) Chrome/65.0.3325.181 Safari/537.36'
}
data = {
'wd':'ip'
}
proxy = {
'http':'219.149.59.250:9797'
}
r = requests.get(url=url,params=data,headers=headers,proxies=proxy)
with open('proxy.html','w',encoding='utf‐8') as fp:
fp.write(r.text)
例:
import requests
url = 'https://www.baidu.com/s?'
headers= {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
data = {
'wd': 'ip'
}
proxy = {
# 'https' : '183.247.199.126:30001',
# 'https': '117.94.113.72:90'
'https': '212.129.251.55:16816'
}
response = requests.get(url=url,params=data,headers=headers,proxies=proxy)
content = response.text
print(content)
with open('dowload/template/daili_087.html','w',encoding='utf-8') as fp:
fp.write(content)
cookie定制
应用案例:
(1)古诗文网(需要验证)
(2)云打码平台
用户登陆 actionuser action
开发者登陆 actioncode action
例:利用cookie登录古诗文网
# 通过登录找到登录接口,我们发现 登录的时候需要的参数很多
'''
登录网页:https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx
登录请求接口
https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx
# post请求
# 参数
__VIEWSTATE: CHCHHuFBOA2/2kriMRXFpZ2CK/IVF2NyzSTbVSPd31dkjvTExPL+M6/2YDtFvNkG9PpGqFz/+2spAvr+6lFog7m6JlxCcLRBpHu47VNSjN6jhDLR3OprMH9+u6s=
__VIEWSTATEGENERATOR: C93BE1AE
from: http://so.gushiwen.cn/user/collect.aspx
email: 183xxxxx6269
pwd: 3132xxxxdfaf
code: Y7G5
denglu: 登录
我们观察到__VIEWSTATE,__VIEWSTATEGENERATOR,code是一个可以变化的量
难点:1 __VIEWSTATE,__VIEWSTATEGENERATOR, 一般情况下看不到的数据,都是在页面的源码中
网页右键点击查看源码,Ctil+f检索__VIEWSTATEGENERATOR得到如下
<div>
<input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="C93BE1AE" />
</div>
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="CHCHHuFBOA2/2kriMRXFpZ2CK/IVF2NyzSTbVSPd31dkjvTExPL+M6/2YDtFvNkG9PpGqFz/+2spAvr+6lFog7m6JlxCcLRBpHu47VNSjN6jhDLR3OprMH9+u6s=" />
</div>
我们观察到这两个数据在页面的源码中,我们需要获取页面的源码然后进行解析就可以获取了
2 验证码code
通过F12的Elements,检索到验证码相关的代码
<img id="imgCode" style="cursor: pointer; float:left; margin-left:5px; margin-top:1px;" width="60" height="27" src="/RandCode.ashx" οnclick="GetCodeImg()" alt="看不清,换一张">
我们可以通过id检索imgCode获取img标签,在获取src=属性,通过域名+src属性,获取图片完整地址
# 验证码识别,可以百度超级鹰
'''
import requests
# 登录页面的url地址
url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'
headers= {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
response = requests.get(url=url,headers=headers)
content = response.text # 获取页面的源码
# print(content)
# 解析页面源码,然后获取__VIEWSTATE,__VIEWSTATEGENERATOR
from bs4 import BeautifulSoup
soup = BeautifulSoup(content,'lxml')
# 获取__VIEWSTATE
__VIEWSTATE = soup.select("#__VIEWSTATE")[0].attrs.get('value')
# 获取__VIEWSTATEGENERATOR
__VIEWSTATEGENERATOR = soup.select("#__VIEWSTATEGENERATOR")[0].attrs.get('value')
# print(__VIEWSTATE)
# print(__VIEWSTATEGENERATOR)
# 获取验证码图片
code = soup.select("#imgCode")[0].attrs.get('src')
code_url = 'https://so.gushiwen.cn'+ code
print(code_url)
# 将验证码保存到本地
# 有坑: 这里下载的验证码,并非是上面内容获取的验证码,因为不是一个请求,这里下载的时候又请求了一次,随机验证码被并非同一个
# import urllib.request
# urllib.request.urlretrieve(url=code_url,filename='code.jpg')
# requests里面有一个方法session() 通过session的返回值,就能使用请求编程一个对象
session = requests.session()
# 验证码的url的内容
response_code = session.get(code_url)
# 注意此时要使用二进制数据,因为我们要使用的是图片的下载
content = response_code.content
# wb 就是将二进制写入到文件
with open('dowload/template/code.jpg','wb') as fp:
fp.write(content)
# 获取了验证码的图片 之后下载到本地,然后观察验证码,观察之后,
# 然后再控制台输入这个验证码,就可以将这个值给code的参数,就可以登录了
code_name = input('请输入你的验证码')
# 点击登录
url_post = 'https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx'
data_post = {
'__VIEWSTATE': __VIEWSTATE,
'__VIEWSTATEGENERATOR': __VIEWSTATEGENERATOR,
'from': 'http://so.gushiwen.cn/user/collect.aspx',
'email': '595165358@qq.com',
'pwd': 'action',
'code': code_name,
'denglu': '登录'
}
# 这里不能用request,用session,保证请求是同一个
response_post = session.post(url=url,headers=headers,data=data_post)
content_post = response_post.text
with open('dowload/template/古诗文.html','w',encoding='utf-8') as fp:
fp.write(content_post)
# 难点
# 1 隐藏域
# 2 验证码