Requests模块

  • 掌握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发送带参数的请求
  1. url中直接带参数
    在这里插入图片描述
  2. 发送请求的时候设置参数字典
    在这里插入图片描述
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/
思路分析

  1. 抓包确定请求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中的数据可以划分为如下几种类型:

  1. 固定值 抓包过程中不变的值
  2. 输入值 抓包中根据自身变化的值
  3. 预设值
    - 静态文件 需要从静态html中获取
    - 发请求 需要对指定地址发送请求获取数据
  4. 在客户端生成的 分析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登录,并获取登录后才能访问的页面

步骤:

  1. 确定登录请求的url,也就是要确定登录时发送post请求的地址
    在这里插入图片描述
    在这里插入图片描述
  2. 找到后查看发送的data
    在这里插入图片描述
  3. 分析data中的数据属于那种类型
    在这里插入图片描述
    分析后发现authenticity_token为 预设值-静态文件类型,其值可以在静态文件中找到,该值可以用正则表达式获取
    在这里插入图片描述
  4. 理清思路
import request
import re

#session
#headers

#url1-获取参数
	#发送请求
	#正则表达式
	
#url2-模拟登录
	#构建表单data
	#发送请求

#url3-爬取登录后的内容
	
  1. 编写代码(账号密码部分,和爬取的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()
  1. 运行检验(爬取成功)
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值