Requests的学习使用小结

本文总结了Python的Requests库的使用,包括GET和POST请求的基础操作,如处理JSON响应、抓取二进制数据、设置headers。同时探讨了高级特性,如模拟登录(Cookies与Session)、SSL证书验证、代理设置和超时管理。
摘要由CSDN通过智能技术生成

基本用法

1. GET请求
  • 基本案例
import requests

r =  requests.get('http://www.baidu.com')
print(r.text)

返回结果应该是一个H5的文档树
另外,网页的返回类型实际上是str类型,但是它很特殊,是JSON 格式的。所以,如果想直接
解析返回结果,得到一个字典格式的话,可以直接调用json()方法。

import requests

r = requests.get('http://httpbin.org/get')
print(type(r.text))
print(r.json())
print(type(r.json()))

可以发现,调用json()方法,就可以将返回结果是JSON 格式的字符串转化为字典。
但需要注意的书,如果返回结果不是JSON 格式,便会出现解析错误,抛出json.decoder. JSQNDecodeError异常。

  • 抓取知乎网页
import  requests
import re

headers = {
		'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}
r = requests.get('https://www.zhihu.com/explore', headers=headers)
pattern = re.compile('explore-feed.*?question_link.*?>(.*?)</a>', re.S)
titles = re.findall(pattern, r.text)
print(titles)

返回结果是一个HTML文档

  • 抓取二进制数据
    图片、音频、视频这些文件本质上都是由二进制码组成的,下面以GitHub的站点图标为案例
import requests

r = requests.get('https://github.com/favicon.ico')
print(r.text)
print(r.content)

输出结果
在这里插入图片描述
输出前者出现了乱码,后者结果前带有一个b,这代表是bytes类型的数据。图片是二进制数据,r.text直接转化为字符串,所以会出现乱码,接下来改进下,我们把图片保存下来

import requests

r = requests.get('http://github.com/favicon.ico')
with open('favicon.ico', 'wb') as f:
	f.write(r.content)

open()方法,第一个参数为文件名称,第二个参数代表以二进制写的形式写入。
同样,音频和视频文件同理

  • 添加headers
    为爬虫添加浏览器标识信息
2. POST请求
import requests

data = {'name' : 'germey', 'age' : '20'}
r = requests.post('http://httpbin.org/post', data=data)
print(r.text)
  • 响应得到返回结果,下面看获取其他属性信息
import requests
r = requests.get('http://www.jianshu.com')
print(type(r.status_code), r.status_code)
print(type(r. headers), r. headers)
print( type(r. cookies), r. cookies)
print(type(r. url), r. url)
print(type(r.history), r.history)
  • requests提供了一个内置的状态码查询对象requests.codes,
    示例如下:
import requests
r = requests.get('http://www.jianshu.com')
exit() if not r.status_code == requests.codes.ok else print('Request Successfully')

高级用法

模拟提交数据,上传文件

import requests

files = {'file' : open('favicon.ico', 'rb')}
r = requests.post("http://httpbin.org/post", files=files)
print(r.text)
  • 1.Cookies属性
import requests

r = requests.get('http://www.baidu.com')
print(r.cookies)
for key, value in r.cookies.items():
	print(key + '=' + value)

用cookies属性即可成功得到Cookies,然后用items()方法将其转化为元祖组成的列表,遍历输出每一个Cookie的名称和值

  • Cookie维持登录状态,使用登录后网页的cookie
import requests
headers = {
		'Cookie': '_xsrf=P8PaSPWyMvJEDWpnOgX6GzzyuWVT4LBK; _zap=c5bfdd32-2770-40b7-8b39-281c63bd66c9; d_c0="AOAjrA8W0w6PTtqLIlBB_LeePDuT80OefC0=|1547463922"; l_cap_id="NmQ4NjM3YjQ0ZTMzNDcwMTlhMzg0NTFiMTI3NTA0MzU=|1547694183|d821b0a1b0321ca67aa08b60ffaf3ffd11a9077d"; r_cap_id="NDQyNWNjM2ZhNGE2NDYwNzljNTVjMGZmMWQ4YmU2Nzk=|1547694183|4db19cf40d1bfe33dfad57e553b6f9d96f7519ae"; cap_id="YmEyYjc0OTY5ZWFmNDNhNWI3YTE5OWJiMWY2ZGUyNmI=|1547694183|949528ae2099092b003ce9f367bf0e3341117d2b"; tgw_l7_route=a37704a413efa26cf3f23813004f1a3b; capsion_ticket="2|1:0|10:1548637409|14:capsion_ticket|44:NzYwNzQyMWM2MzY4NDdiYzhiNmQxODFkZDMyMzhmMWU=|bbaa82f29aa09ff94ec9f34147ec5d5433208a29c5801fb053acf6dfafeb1317"; z_c0="2|1:0|10:1548637444|4:z_c0|92:Mi4xSXduZUJBQUFBQUFBNENPc0R4YlREaVlBQUFCZ0FsVk5CS003WFFCY0Z6elJMZlpvb2pfOTdXRW43V0M0V3BWZDdn|b0b446fa7ccb3b701c98f821640727586a84ddf20af0e5b7f05f8c340a46b510"; tst=r',
		'Host': 'www.zhihu.com',
		'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}
r = requests.get('http://www.zhihu.com', headers=headers)
print(r.text)
  • 2.会话维持 session
import requests

requests.get('http://httpbin.org/cookies/set/number/123456789')
r = requests.get('http://httpbin.org/cookies')
print(r.text)
import requests
s = requests.Session()
s.get('http://httpbin.org/cookies/set/number/123456789')
r = s.get('http://httpbin.org/cookies')
print(r.text)

利用Session,可以做到模拟同一个会话而不用担心Cookies 的问题。它通常用于模拟登录成功之后再进行下一步的操作。

  • 3.SSL证书验证
    用verify参数控制是否检查此证书
import requests
response = requests.get('https://www.12306.cn')
print(response.status_code)

提示错误SSLError,表示证书验证错误。所以,如果请求一个HTTPS站点,但是证书验证错误的页面时,就会报这样的错误,那么如何避免这个错误呢?很简单,把verify 参数设置为False即可。例

import requests
response = requests.get('https://www.12306.cn', verify=False)
print(response.status_code)
# 或者通过捕获警告到日志的方式忽略警告:
import logging
import requests

logging.captureWarnings(True)
r = requests.get('https://12306.cn', verify=False)
print(r.status_code)
# 再或者指定一个本地证书,证书的key必须是解密的
import requests

r = requests.get('https://www.12306.cn', cert=('/path/server.crt', '/path/key'))
print(r.status_code)
    1. 代理设置
      大规模爬取,对于大规模且频繁的请求,网站可能会弹出验证码,或者跳转到登录认证页面, 更甚者可能会直接封禁客户端
      的IP ,导致一定时间段内无法访问。
      proxies参数
import requests

proxies = {
	'http': 'http://10.10.1.10:3128',
	'https': 'http://10.10.1.10:1080',
}
requests.get('http://example.org', proxies=proxies)
  • 超时设置
import requests

r = requests.get("https://www.taobao.com", timeout=1)
print(r.status_code)
# 实际上,请求分为两个阶段,即连接( connect)和读取( read )
# r = requests.get('https://www.taobao.com', timeout=(5, 30))
# 设置成None为永久等待,或者不传入参数
# r = requests.get('https://www.taobao.com', timeout=None)
  • 身份认证
# 可以使用requests自带的身份认证功能
import requests
from requests.auth import HTTPBasicAuth

r = requests.get('http://localhost:5000', auth=('username', 'password'))
# https://requests-oauthlib.readthedocs.io/en/latest/
# OAuth请求参考
  • 创建一个Requests对象实现POST请求
from requests import Request, Session
url = 'http://httpbin.org/post'
data = {'name': 'germey'}
headers = {
    'User-Agent ': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}
s = Session()
req = Request ('POST', url, data =data, headers= headers)
prepped = s.prepare_request(req)
r = s . send(prepped)
print(r.text)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值