- 掌握headers参数使用
- 掌握发送带参数的请求
- 掌握headers中携带cookie
- 掌握cookies参数的使用
- 掌握cookiesJar的转换方法
- 掌握超时参数timeout的使用
- 掌握代理ip参数proxies的使用
- 掌握使用verify参数忽略CA证书
- 掌握requests模块发送post请求
- 掌握利用requests.session进行状态保持
1.requests模块介绍
https://blog.csdn.net/qq_41556318/article/details/86527763
1.1requests模块的作用
发送http请求,获取响应数据
1.2requests安装
pip/pip3 install requests
1.3requests模块发送get请求
1.需求:通过requests像百度首页发送请求,获取该页面的源码
2.运行下面的代码,观察打印输出的结果
import requests
#目标url
url = 'http://www.baidu.com'
#向url发送get请求
response = requests.get(url)
#打印响应内容
print(response.text)
运行展示
我们发现运行结果中,有好多乱码,这是因为使用的字符集不同造成的。解决办法如下:
(requests模块的response.text与response.content有什么区别? - 写bug的高师傅的回答 - 知乎
https://www.zhihu.com/question/56816991/answer/150546953)
requests.text则是根据网页的响应来猜测编码,可以用response.encoding看一下他猜测的编码是啥。
我们发现其编码如上图所示,接下来我们使用如下代码设置编码类型
import requests
#目标url
url = 'http://www.baidu.com'
#向url发送get请求
response = requests.get(url)
print(response.encoding)
#设置编码类型
response.encoding = 'utf-8'
#打印响应内容
print(response.text)
print(response.encoding)
我们发现乱码问题解决。
同样,获取的数据可以用response.content打印出来
import requests
#目标url
url = 'http://www.baidu.com'
#向url发送get请求
response = requests.get(url)
#response.content是存储的bytes类型的响应源码,可以进行decode操作
print(response.content)
我们发现显示效果如图。response.content返回的是bytes型也就是二进制的数据。我们可以使用如下代码进行解码
import requests
#目标url
url = 'http://www.baidu.com'
#向url发送get请求
response = requests.get(url)
print(response.content.decode())
1. response.text是request模块按照charset模块推测出的编码字符集进行解码的结果
2. 网络传输的字符串都是bytes类型的,所以response.text = response.content.decode(“推测出的编码字符集”)
3. 我们可以在网页源码中搜索charset,尝试参考该编码字符集。注意存在不准确情况
2 编码类型
2.1 response.text和response.content的区别:
-
response.text
- 类型:str
- 解码类型:requests模块自动根据http头部对响应的编码做出有根据的推测,推测的文本编码
-
response.content
- 类型:bytes
- 解码类型:没有指定
2.2 通过对response.content进行decode,来解决中文乱码
decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode(‘gb2312’),表示将gb2312编码的字符串str1转换成unicode编码。
- response.content.decode() 默认utf-8
- response.content.decode(“GBK”)
- 常见字符集
- utf-8
- gb2312
- ascii
- iso-8859-1
2.3 response响应对象的其它常用属性或方法
- response.url 响应的url;有时候响应的url和请求的url并不一致
- response.status_code 响应状态码
- response.request.headers 响应对应的请求头
- response.headers 响应头
- response.request._cookies 响应对应请求的cookie;返回cookie.Jar类型
- response.cookies 响应的cookie经过了set-cookie动作;返回cookie.Jar类型
- response.json 自动将json字符串类型的响应内容转换为python对象(dict或 list)
import requests
#目标url
url = 'http://www.baidu.com'
#向url发送get请求
response = requests.get(url)
#响应url
print(response.url)
#状态码
print(response.status_code)
import requests
#目标url
url = 'http://www.baidu.com'
#向url发送get请求
response = requests.get(url)
#响应url
#print(response.url)
#状态码
#print(response.status_code)
#响应对应请求头
print(response.request.headers)
#响应头
print(response.headers)
import requests
#目标url
url = 'http://www.baidu.com'
#向url发送get请求
response = requests.get(url)
#响应url
#print(response.url)
#状态码
#print(response.status_code)
#响应对应请求头
#print(response.request.headers)
#响应头
#print(response.headers)
#响应设置cookie
print(response.cookies)
3.requests模块发送请求
3.1发送带header的请求
import requests
url = 'http://www.baidu.com'
#请求头字典
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'}
#发送带请求头的请求
response = requests.get(url,headers=headers)
print(response.content.decode())
3.2发送带参数的请求
- url中直接带参数
- 发送请求的时候设置参数字典
3.3 在headers中携带cookies
import requests
url = 'https://github.com/qcsfly'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36',
'Cookie':'octo=GH1.1.825833829.1583387831; _ga=GA1.2.1939157312.1594304928; tz=Asia%2FShanghai; _device_id=4036238451358eb10f7aac5389a94df8; has_recent_activity=1; user_session=Nc6Q5vgI0cFX7TQYElklFHujLeO8fp-sSdjMOWLz5H0GPDhk; __Host-user_session_same_site=Nc6Q5vgI0cFX7TQYElklFHujLeO8fp-sSdjMOWLz5H0GPDhk; logged_in=yes; dotcom_user=qcsfly; _gat=1; _gh_sess=jjcSfkL9R%2FBjKLmG3fwZlUZFLBBu4JaijXC%2B3hfP6gqE6nhLyptfYgwAufCCPA0ZEHpCTcnHVTRxUraQGuhSSuPYKSTvCiOexviIULWD0dWzrEvBMsbU9eeorRoZmPbkWsv78mRQAWvVDr1InslqHJ67Pq1VS6XSirekwGfWmD7XcVeSHRLUuYEK2GGxqEUO4FqlzwIrgKaq0hJPIc4RoNWMg3Hnmi2D3M9LbZfniBE%2B0adpTEfov%2Brzy2ywx9kkh32fljRatlYXv32CSIkxU0LUDEDpeA9rpv56X7pnb4PIhR%2FFnk8bHp6W28PD3lLa%2FIB0qO1rAHtajSpUlZ0z%2F3y06T9pRzLKsOjiMgFwAl38xjoCzqt%2FdsoJSJ%2Bx590oHp8LPp3ZRO%2BUx6hlwByCPRC7moptl2Tjrx41Uj1v4W8cxvffNsZblQ8ssw56F%2FRxLTSau%2Fy0%2FVdjLYj0RH8TzaeJJDTGbpHcbbID10TCFph5fxlXWDlIcY28pfraLukwy1tFRrx0Tsv87jc98ucOS9pZ4hT0WUXMBncwgE2FRRWGKAeBLUqIC0GX4LSKdbbeh0TaixEfBw6YbO9%2BWVSKzzOYlZNTWKJpAvaigBVrVURCVoN%2FVQ9AeW1uxVn%2FT9BVPw%2FLydWf8bcAWVewHwxKsFNfA6HhosYqpjMvusdqB4upGsoaLBnL65mKQ%2F%2F%2BHNDTSVHwsBiittzxnkp5xQZfMyREPLpOyve%2BCyQhvgwXArYuPUFdZg1WokSbuR6Yt%2BpCVuGIpXpk8Zg%2B2lWuMe3gYqod%2B5%2BaSI0AGJHJf4yqPfFtIpWhKHVwAHZkBTJq5csVB1mysrXFqEOXjg6TPGCPPPeG4vziNcoEnBYb4DH7orOI0v%2FlnsfABaXdsEh2qRSF0IWkOvNSxJdIc7k0qxWi9yiQ5kFwxitbjunFpjxU0009abq0IEDZVokggVMYbtxKc3lU2ljK3wKZhLf6oV%2BNJw33dxwLQE27drygQ1HwEICkIcycZ9WmX9qJpLyKtSaC1jjgoRVysQrfD95DIfnIslFtZXygMo1WjwnMKCRrvNUPCwCKzETAQzILRq8A3DacdxO2WA%3D%3D--gslbxG1z4x7%2FsBcj--fgTuQFeCA21KjbUFr6KoRg%3D%3D'
}
response = requests.get(url,headers = headers)
with open('github_with_cookies.html','wb') as f:
f.write(response.content)
3.4 cookieJar对象转换为cookies字典的方法
import requests
url = 'http://www.baidu.com'
response = requests.get(url)
print(response.cookies)
dict_cookies=requests.utils.dict_from_cookiejar(response.cookies)
print(dict_cookies)
3.5 超时参数timeout的使用
访问网页长时间无响应,设置timeout在到达指定时间后停止访问
import requests
url = 'https://twitter.com'
response = requests.get(url,timeout = 3)
3.6 代理
1. 什么是代理?
代替客户端向服务器发送消息的一台服务器。代理ip是一个指向代理服务器的ip。
客户端----->代理服务器----->服务器(正向代理)
客户端<-----代理服务器<-----服务器 (反向代理)
2. 代理ip的分类
-根据 匿名度 分类
透明
匿名
高匿
-根据 协议 分类
http代理
https代理
socket代理
3.proxies代理参数的使用
代理使用成功不会报错,成功获得响应
不成功会报错
4.requests模块发送post请求
哪些地方会用到post请求?
1.登录注册
2.需要传输大文本内容的时候
4.1requests请求发送post请求的方法
- response = requests.post(url,data)
- data参数接受一个字典
- requests模块发送post请求函数的其他参数和发送get请求的参数完全一致
4.2 post请求练习
例子为金山翻译的例子
地址:http://fy.iciba.com/
思路分析
- 抓包确定请求url
2.确定请求参数
3.确定返回数据的位置
4.模拟浏览器获取数据
4.3 抓包分析结论
1.url地址:http://fy.iciba.com/ajax.php?a=fy
2.请求方法:post
3.请求所需参数
data = {
"f": "auto",
"t": "auto",
"w": "翻译的内容"
}
4.user-agent
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
4.4 代码实现
import requests
import json
class baidu_transport(object):
def __init__(self,word):
self.url = 'http://fy.iciba.com/ajax.php?a=fy'
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
}
self.data = {
"f": "auto",
"t": "auto",
"w": word
}
def get_data(self):
response = requests.post(self.url, data = self.data,headers = self.headers)
return response.content
def run(self):
response = self.get_data()
#print(response)
self.parse_data(response)
def parse_data(self,data):
#将json数据转换成python字典
dict_data = json.loads(data)
try:
#英文翻译
print(dict_data["content"]["out"])
except:
#中文翻译
print(dict_data["content"]["word_mean"])
if __name__ == '__main__':
word = input("请输入要翻译的单词")
tr = baidu_transport(word)
tr.run()
4.5 post中数据来源
post中的数据可以划分为如下几种类型:
- 固定值 抓包过程中不变的值
- 输入值 抓包中根据自身变化的值
- 预设值
- 静态文件 需要从静态html中获取
- 发请求 需要对指定地址发送请求获取数据 - 在客户端生成的 分析js,模拟生成数据
5. 利用requests.session进行状态保持
5.1 requests.session的作用以及应用场景
- requests.session的作用
- 自动处理cookie,即下次请求需要带上前一次的cookie
- requests.session的应用场景
- 自动处理连续的多次请求过程中的cookie
5.2 requests.session使用方法
session = requests.session()
response = session.get(url,headers,...)
response = session.post(url,data,...)
5.3 使用request.session完成github登录,并获取登录后才能访问的页面
步骤:
- 确定登录请求的url,也就是要确定登录时发送post请求的地址
- 找到后查看发送的data
- 分析data中的数据属于那种类型
分析后发现authenticity_token为 预设值-静态文件类型,其值可以在静态文件中找到,该值可以用正则表达式获取
- 理清思路
import request
import re
#session
#headers
#url1-获取参数
#发送请求
#正则表达式
#url2-模拟登录
#构建表单data
#发送请求
#url3-爬取登录后的内容
- 编写代码(账号密码部分,和爬取的url部分按照自己的写)
import requests
import re
def login():
# session
session = requests.session()
# headers
session.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome'
'/83.0.4103.116 Safari/537.36'
}
# url1-获取token
url1 = 'https://github.com/login'
# 发送请求获取响应
res_1 = session.get(url1).content.decode()
# 正则获取
token = re.findall('name="authenticity_token" value="(.*?)" />', res_1)[0]
# url2-登录
url2 = 'https://github.com/session'
# 构建表单数据
data = {
'commit': 'Sign in',
'authenticity_token':token,
'login': '*****'(这里输入你自己的账号),
'password': '******'(这里输入你自己的密码),
}
# 发送请求
re_2 = session.post(url2,data = data)
# url3-验证
url3 = 'https://github.com/qcsfly'
re_3 = session.get(url3)
with open('github_session.html', 'wb') as f:
f.write(re_3.content)
if __name__ == '__main__':
login()
- 运行检验(爬取成功)