IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Requests库爬虫详解 -> 正文阅读

[网络协议]Requests库爬虫详解

关于requests:

官方的解释是:Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。

作用:

Requests 完全满足今日 web 的需求。

  • Keep-Alive & 连接池
  • 国际化域名和 URL
  • 带持久 Cookie 的会话
  • 浏览器式的 SSL 认证
  • 自动内容解码
  • 基本/摘要式的身份认证
  • 优雅的 key/value Cookie
  • 自动解压
  • Unicode 响应体
  • HTTP(S) 代理支持
  • 文件分块上传
  • 流下载
  • 连接超时
  • 分块请求
  • 支持?.netrc

安装:

pip instsall requests ? ? #适用Python3

Requests的使用方法:

实例说明:

import requests

response=requests.get('https://www.baidu.com')
print(type(response))  
print(response.status_code)
print(type(response.text)) 
print(response.text)
print(response.cookies)

返回结果:

?

各种请求方式:

import requests

requests.post('http://httpbin.org/post')
requests.put('http://httpbin.org/put')
requests.delete('http://httpbin.org/delete')
requests.head('http://httpbin.org/get')
requests.options('http://httpbin.org/get')

基本的get请求:

import requests

response=requests.get('http://httpbin.org/get')#用get方式发送请求并获得响应
print(response.text)#用text查看响应内容

返回结果:

?

?

?

带参数的get请求:

import requests

data={
	'name':'zhuzhu',
	'age':23
}
response=requests.get('http://httpbin.org/get',params=data)
#用字典的形式传递给params参数,不需要自己写url编码
print(response.text)

返回结果:

?

?解析json:

import requests

response=requests.get("http://httpbin.org/get")
print(type(response.text))
print(response.json())#把返回结果编码成一个json对象
print(type(response.json()))

返回结果:

?

备注:使用于返回一些AJEX请求时是比较常用的。?

获取二进制数据:

在下载一些内容(图片、视频)的时候常用的一个方法。
试试看,我们想要获取一个github的图标:

import requests

response=requests.get("https://github.com/favicon.ico")
print(type(response.text),type(response.content))
print(response.text)
print(response.content)#可以使用content属性来获取二进制内容

返回结果:

?

可以看到,在响应中,text的类型是string,而content的内容是bytes,也就是二进制形式。
怎么把这个图标保存到本地呢?我们已经知道怎么获取它的二进制内容,现在只需要写入文件就可以了?

?

import requests

response=requests.get("https://github.com/favicon.ico")
with open('favicon.ico','wb')as f:
	f.write(response.content)
	f.close()

运行后就可以看到favicon.ico 的文件了

?基本POST请求:

用字典的形式构建一个data,并将方法传入,来实现post请求(类似get在url中加入parmes一样)

import requests


data={'name':'zhuzhu','age':'23'}
headers={
	'User-Agent':'Mozilla/5.0(Macintosh;Intel Mac OS X 10_11_4)AppleWebKit/537.36(KHTML,like Gecko)Chrome/52.0.2743.116 Safari/537.36'
}
response=requests.post("http://httpbin.org/post",data=data,headers=headers)
print(response.json())

可以看到,返回的json形式的响应中,我们成功添加了data和headers的信息。?

添加headers头:

为了防爬虫,很多网址通常会对headers头进行识别,因此我们需要增加Headers头进行伪装。比如说:

import requests
response=requests.get("https://www.zhihu.com/explore")
print(response.text)

返回的结果:

?现在我们来加入HEADERS头进行伪装:

import requests

headers={
	'User-Agent':'Mozilla/5.0(Macintosh;Intel Mac OS X 10_11_4)AppleWebKit/537.36(KHTML,like Gecko)Chrome/52.0.2743.116 Safari/537.36'
}
response=requests.get("https://www.zhihu.com/explore",headers=headers)
print(response.text)

返回的结果:

?响应:

import requests

response=requests.get("http://www.baidu.com")
if not response.status_code==200:
	print('请求响应失败')
else:
	print("Requests 请求成功")

运行后成功,说明响应是200,是成功获取了。

?文件上传

import requests

files={'file':open('favicon.ico','rb')}
#通过files参数传入post方法中,实现文件的上传
response=requests.post("http://httpbin.org/post",files=files)
print(response.text)

?这样通过post请求,我们就完成了文件的上传,下图file显示的就是文件的字节流了:

?获取cookie:

import requests

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

返回结果:

?

会话保持:?

作用:基本上为了实现“模拟登录”的功能。

例子:

import requests

requests.get('http://httpbin.org/cookies/set/number/123456789')
#通过cookies/set方法来设置cookie
response=requests.get('http://httpbin.org/cookies')
print(response.text)

返回空cookie

?

cookies为空,这是因为上面那段代码中发起了两次get请求,相当于两个浏览器,相互独立,所以第二次get并不能得到第一次的cookie。
可以通过声明Session对象来发起两次get请求,视为一个浏览器中进行的操作:?

import requests

s=requests.Session() #定义一个变量s
s.get('http://httpbin.org/cookies/set/number/123456789')
#通过cookies/set方法来设置cookie
response=s.get('http://httpbin.org/cookies')
print(response.text)

证书验证

如果我们要爬取的是一个https协议的网站,那么网站首先会检查证书是否是合法的,若非法,会直接抛出SSLError错误。如果要避免这种错误的话,可以把这个参数:verify设置为False就可以了(默认是True)。
?

import requests
response=requests.get('https://www.12306.cn',verify=False)#把verify参数置否
print(response.status_code)

代理设置

可以通过字典形式构造一个参数,字典里是你已经开通的代理ip。再把参数传入get方法即可。

?

import requests

proxies={
	"http":"http://127.0.0.1:9743",
	"https":"https://127.0.0.1:9743"
}

response=requests.get("https://www.taobao.com",proxies=proxies)
print(response.status_code)

如果代理需要用户名和密码的时候怎么办呢?
我们可以在代理的url前面直接传一个user:password,后面加个@符号,这样我们就能传入用户名和密码这个认证信息了:

proxies={
	"http":"http://uesr:password@127.0.0.1:9743/",	
}

?那如果代理方式不是https,而是一个socks类型的呢?
首先需要安装,在命令行执行(windows环境下):
pip3 install request[socks]
安装之后就可以使用这种形式的代理了。

import requests

proxies={
	"http":"sock5://127.0.0.1:9743",
	"https":"socks5://127.0.0.1:9743"
}

response=requests.get("https://www.taobao.com",proxies=proxies)
print(response.status_code)

超时设置:

import requests

response=requests.get("https://www.taobao.com",timeout=1)
#设置一个时间限制,必须在1秒内得到应答
print(response.status_code)

?如果时间超出了限制,就会抛出异常。怎么捕获这个异常呢?

import requests
from requests.exceptions import ReadTimeout

try:
	response=requests.get("https://httpbin.org/get",timeout=0.5)
	print(response.status_code)
except ReadTimeout:
	print('Timeout')

认证设置:

作用:有的网站在访问时需要输入用户名和密码,输入之后才能看到网站的内容。
如果遇到这种网站,我们可以通过auth参数,把用户名和密码传入。

import requests
from requests.auth import HTTPBasicAuth

r=requests.get('http://120.27.34.24:9001',auth=HTTPBasicAuth('user','123'))
#通过auth参数传入。
print(r.status_code)

这样就可以完成一个正常的请求,如果把auth参数去掉,那么就会返回401参数(请求被禁止)。?

异常处理

异常处理的部分还是比较重要的,它可以保证你的爬虫不间断地运行。
原则还是先捕获子类异常,再捕捉父类异常(RequestException)。

import requests
from requests.exceptions import ReadTimeout,HTTPError,RequestException
try:
	response=requests.get('http://httpbin.org/get',timeout=0.1)
	print(response.status_code)
except ReadTimeout:#捕获超时异常
	print('Timeout')
except HTTPError:#捕获HTTP异常
	print('Http error')
except ConnectionError:#捕获连接异常
	print('Connection error')
except RequestException:#捕获父类异常
	print('Error')

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-11-23 12:43:57  更:2021-11-23 12:46:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年7日历 -2024/7/3 21:38:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码