爬虫基础(3) - Requests库的使用

Requests库的使用

一,简介

基于 urllib3 开发,更简单,更优雅

  • 中文文档:http://cn.python-requests.org/zh_CN/latest/

  • 英文文档:http://docs.python-requests.org/en/master/api/

    Request作者:千万不要给自己懒散的生活态度,找任何借口,你可以变得更棒!只要愿意去追求,我们都能变成我们想要的样子

二,发起请求

每个请求方法都有一个对应的 API

  1. requests.get() GET请求

    import request
    
    args = {	
        'username': '邢益斌',		   # 1, url 路径参数传参,会自动解析中文
        'password': '123456',
    }
    
    params = {
        'username': '邢益斌',		   # 1, url 路径参数传参,会自动解析中文(能行)
        'password': '123456',
    }
    
    headers = {
        'referer': 'https://blog.csdn.net/jasonLee_lijiaqi/article/details/80312240',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' ,
    }								 # 2, 构造请求头
    
    cookies = {
    	'Session_id': '123456'		 # 3, 构造cookie
    }
    
    proxy ={
        'http': '175.25.36.18'		 # 4, 设置代理
    }
    
    response = requests.get(
        'http://httpbin.org/get',
        args=args, 					# 传入 url 路径参数
        params=params,				# 传入 url 路径参数(能行)
        header=headers,				# 传入请求头
    	cookies=cookies,			# 传入 cookies
        proxies=proxy,				# 传入代理
    )
    
    print(response.encoding)		# 查看该 response 编码方法,若为None,则会自动猜测
    print(response.request.headars)	# 查看 request 的请求头
    response.encoding = 'utf-8' 	# 设置编码
    print(response.text)			# 获取文本,并且直接帮我们解码成字符串
    print(response.request.url)		# 查看 url  -->  也可以写response.url
    
  2. requests.post() POST请求

    info = {
        'username': 'xyb',			# 5, POST 方法上传,上传form表单参数
        'password': '123456'
    }							
    
    resp = requests.post('http://httpbin.org/post',data=info)
    
  3. 其他请求接口 ( put, delete, head, options )

    resp = requests.put('http://httpbin.org/put', data={'key': 'value'})
    resp = requests.delete('http://httpbin.org/delete')
    resp = requests.head('http://httpbin.org/get')
    resp = requests.options('http://httpbin.org/get')
    
  4. 默认重定向

    # 在网络请求中,我们常常会遇到状态码是3开头的重定向问题,在Requests中默认是开启允许重定向,即遇到重定向时,会自动访问
    
    resp = requests.get('http://github.com', allow_redirects=False)		# 取消重定向
    print(resp.url)		# 重定向之后访问的网页是 https://github.com, 这里取消了重定向,所以 url 还是http://github.com
    print(resp.headers)	# 查看响应头	{’Content-length‘: '0', 'Location': 'https://github.com/'}	Location就是重定向跳去的地址
    
  5. 禁止证书认证

    request.get('https://quanshuwang.com', verify=False) # 跳过证书验证(有些https网站证书过期不安全不能访问,跳过验证)
    
    # 但是关闭验证后会有一个烦人的warning验证
    InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
      InsecureRequestWarning)
    # ---------------------关闭验证------------------
    
  6. 设置超时

    request.get('https://quanshu1wang.com', timeout=0.0001)	# 响应超过这个时间报错,单位秒
    

三,接收响应

发起请求后会得到一个 request.models.Response对象,就是响应

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TlR4Pbaf-1591102691568)(assets/1559715893044.png)]

  1. 获取响应内容response.text , 获得字符串相应格式的响应内容

    resp = requests.get('http://www.httpbin.org.com')	
    resp.encoding = 'gbk/utf-8'		# 如果返回乱码, 切换编码方式
    print(resp.text)				# 获取响应内容,转换成文本格式
    
  2. 获取响应二进制内容response.content

    resp = requests.get('https://www.dwadidu.com/2.jpg')		
    with open(r'1.jpg', 'wb') as f:
        f.write(resp.content)		# 把图片二进制数据写入文件
    
  3. 获取Json格式的数据response.json()

    resp = requests.get('http://www.httpbin.org/get')		# 取消重定向
    print(resp.json())				# 将数据转换成 Json 格式
    print(type(resp.json()))        # 字典格式数据	<class 'dict'>
    
  4. 获取状态码response.status_code

    resp = requests.get('http://www.httpbin.org/get')
    print(resp.status_code)        # 状态码 200
    
  5. 查看 响应头, cookie, url

    resp = requests.post('http://www.baidu.com')
    print(resp.headers)         # 打印响应头
    print(resp.cookies.items())         # 打印 cookie
    print(resp.url)				# 查看访问的 url
    

四,Session对象

最大的好处就是不会和网页断开链接,基于底层TCPip协议的重用(帮你自动处理cookie)

在Requests中,实现了Session(会话)功能,当我们使用Session时,能够像浏览器一样,在没有关闭关闭浏览器时,能够保持住访问的状态。------------------------》》

可以理解向同一个人打电话问问题,request请求就像你问一个问题,挂一次电话再重打问问题

​ session请求就像打一个电话,把所有的问题问完,性能很快

import time
import request

session = requests.session()
start_time = time.time()

for i in range(50):
    # requests.get('https://www.baidu.com') # 6.9秒
    session.get('https://www.baidu.com') # 1.8秒
    
-----------------------------session的速度非常的快------------------------------------
print("请求50次一共用时{}秒".format(time.time()-start_time))

五,流下载

通常下载视频先把所有数据存在一个变量,再写入本地,流下载可以一边读取,一边下载

流下载好处:

  1. 对于大文件,减少内存消耗,可以读取一点,写入一点,不必全部读取再写入
  2. 对于视频,边读,边写入,不必担心网络突然出现波动,读取多少写入多少
import time

url = 'https://rainymood.com/audio1110/0.m4a'

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.3"
                  "6 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
}

start_time = time.time()	# 开始时间

response = requests.get(url=url, headers=headers, stream=True)

f = open('雨点.m4a', 'wb')

for chunk in response.iter_content(chunk_size=1024):
    if chunk:
        f.write(chunk)

print("下载视频一共用了{}秒".format(time.time()-start_time))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值