Python爬虫中urllib3与urllib的区别是什么


Posted in Python onJuly 21, 2021

urllib库

urllib 是一个用来处理网络请求的python标准库,它包含4个模块。

  • urllib.request---请求模块,用于发起网络请求
  • urllib.parse---解析模块,用于解析URL
  • urllib.error---异常处理模块,用于处理request引起的异常
  • urllib.robotparser robots.tx---用于解析robots.txt文件

urllib.request模块

request模块主要负责构造和发起网络请求,并在其中添加Headers,Proxy等。 利用它可以模拟浏览器的请求发起过程。

  • 发起网络请求
  • 操作cookie
  • 添加Headers
  • 使用代理

关于urllib.request.urlopen参数的介绍

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

urlopen是一个简单发送网络请求的方法。它接收一个字符串格式的url,它会向传入的url发送网络请求,然后返回结果。

先写一个简单的例子:

from urllib import request
response = request.urlopen(url='http://www.httpbin.org/get')
print(response.read().decode())

urlopen默认会发送get请求,当传入data参数时,则会发起POST请求。data参数是字节类型、者类文件对象或可迭代对象。

from urllib import request
response = request.urlopen(url='http://www.httpbin.org/post',
                           data=b'username=q123&password=123')
print(response.read().decode())

还才可以设置超时,如果请求超过设置时间,则抛出异常。timeout没有指定则用系统默认设置,timeout只对,http,https以及ftp连接起作用。它以秒为单位,比如可以设置timeout=0.1 超时时间为0.1秒。

from urllib import request
response = request.urlopen(url='https://www.baidu.com/',timeout=0.1)

Request对象

利用openurl可以发起最基本的请求,但这几个简单的参数不足以构建一个完整的请求,可以利用更强大的Request对象来构建更加完整的请求。

1 . 请求头添加

通过urllib发送的请求会有一个默认的Headers: “User-Agent”:“Python-urllib/3.6”,指明请求是由urllib发送的。所以遇到一些验证User-Agent的网站时,需要我们自定义Headers把自己伪装起来。

from urllib import request
headers ={
    'Referer': 'https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&tn=baidu&wd=python%20urllib%E5%BA%93&oq=python%2520urllib%25E5%25BA%2593&rsv_pq=947af0af001c94d0&rsv_t=66135egC273yN5Uj589q%2FvA844PvH9087sbPe9ZJsjA8JA10Z2b3%2BtWMpwo&rqlang=cn&rsv_enter=0&prefixsug=python%2520urllib%25E5%25BA%2593&rsp=0',
     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
response = request.Request(url='https://www.baidu.com/',headers=headers)
response = request.urlopen(response)
print(response.read().decode())

2. 操作cookie

在开发爬虫过程中,对cookie的处理非常重要,urllib的cookie的处理如下案例

from urllib import request
from http import cookiejar
# 创建一个cookie对象
cookie = cookiejar.CookieJar()

# 创一个cookie处理器
cookies = request.HTTPCookieProcessor(cookie)

# 以它为参数,创建opener对象
opener = request.build_opener(cookies)
# 使用这个opener 来发请求
res =opener.open('https://www.baidu.com/')

print(cookies.cookiejar)

3. 设置代理

运行爬虫的时候,经常会出现被封IP的情况,这时我们就需要使用ip代理来处理,urllib的IP代理的设置如下:

from urllib import request
url ='http://httpbin.org/ip'

#代理地址
proxy ={'http':'172.0.0.1:3128'}

# 代理处理器
proxies =request.ProxyBasicAuthHandler(proxy)

# 创建opener对象
opener = request.build_opener(proxies)

res =opener.open(url)
print(res.read().decode())

urlib库中的类或或者方法,在发送网络请求后,都会返回一个urllib.response的对象。它包含了请求回来的数据结果。它包含了一些属性和方法,供我们处理返回的结果

  • read() 获取响应返回的数据,只能用一次
  • readline() 读取一行
  • info() 获取响应头信息
  • geturl() 获取访问的url
  • getcode() 返回状态码

urllib.parse模块

parse.urlencode() 在发送请求的时候,往往会需要传递很多的参数,如果用字符串方法去拼接会比较麻烦,parse.urlencode()方法就是用来拼接url参数的。

from urllib import parse
params = {'wd':'测试', 'code':1, 'height':188}
res = parse.urlencode(params)
print(res)

打印结果为wd=%E6%B5%8B%E8%AF%95&code=1&height=188

也可以通过parse.parse_qs()方法将它转回字典

print(parse.parse_qs('wd=%E6%B5%8B%E8%AF%95&code=1&height=188'))

urllib.error模块

error模块主要负责处理异常,如果请求出现错误,我们可以用error模块进行处理 主要包含URLError和HTTPError

URLError:是error异常模块的基类,由request模块产生的异常都可以用这个类来处理

HTTPError:是URLError的子类,主要包含三个属性

  • Code:请求的状态码
  • reason:错误的原因
  • headers:响应的报头
from urllib import request,error
try:
    response = request.urlopen("http://pythonsite.com/1111.html")
except error.HTTPError as e:
    print(e.reason)
    print(e.code)
    print(e.headers)
except error.URLError as e:
    print(e.reason)

else:
    print("reqeust successfully")

urllib.robotparse模块 

robotparse模块主要负责处理爬虫协议文件,robots.txt.的解析。

Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取

网络库urllib3

urllib3是比urllib库更强大的存在,目前已经有许多的原生系统已经开始使用urllib3。

urllib3具有如下优点:

  • 支持HTTP和SOCKS代理
  • 支持压缩编码
  • 100%测试覆盖率
  • 具有链接池
  • 线程安全
  • 客户端SLL/TLS验证
  • 协助处理重复请求和HTTP重定位
  • 使用multipart编码上传文件

因为urllib3并不是Python的标准库,所以我们使用之前,需要进行下载安装,具体命令如下所示:

pip install urllib3
#或
conda install urllib3

下面,我们来讲解urllib3库的使用方式。

网络请求

GET请求

首先,在我们使用urllib3库进行网络请求时,需创建PoolManager类的实例,该类用于管理线程池。

下面,我们来通过urllib访问百度,并返回查询的结果,示例如下:

import urllib3

http = urllib3.PoolManager()
url = 'http://www.baidu.com/s'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = http.request('GET', url, fields={'wd': '机器学习'}, headers=headers)
result = response.data.decode('UTF-8')
print(result)

运行之后,效果如下:

Python爬虫中urllib3与urllib的区别是什么

这里,我们通过fields参数指定GET的请求字段。不过,这里先一步讲解了请求头,其实是百度有安全机制,读者可以去掉headers参数试试。会返回百度的安全验证页面。

POST请求

如果需要向服务器提交表单或者比较复杂的数据,就需要使用到POST请求。POST请求比较简单,仅仅只是将请求的第一个参数改为“POST”即可。

示例如下:

import urllib3

http = urllib3.PoolManager()
url = 'http://httpbin.org/post'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = http.request('POST', url, fields={'username': 'name', 'age': '123456'}, headers=headers)
result = response.data.decode('UTF-8')
print(result)

运行之后,返回如下数据:

Python爬虫中urllib3与urllib的区别是什么

HTTP响应头

使用urllib3库进行网络访问时,其返回的HTTPResponse。默认有一些携带的参数,其中就包括info方法。它能返回响应头数据,示例如下:

import urllib3

http = urllib3.PoolManager()
url = 'http://www.baidu.com/s'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = http.request('POST', url, fields={'wd': '机器学习'}, headers=headers)
for key in response.info().keys():
    print('key:',response.info()[key])

运行之后,返回的响应数据如下:

Python爬虫中urllib3与urllib的区别是什么

上传文件

首先,我们需要简单的实现一个文件上传的服务器代码,这里我们使用Flask搭建一个简单的服务器Python程序,代码如下:

import flask
import os

UPLOAD_FILE = 'uploads'
app = flask.Flask(__name__)
@app.route('/', methods=['POST'])
def upload_file():
    file = flask.request.files['file']
    if file:
        file.save(os.path.join(UPLOAD_FILE, os.path.basename(file.filename)))
        return '文件上传成功'
    else:
        return '文件上传失败'

if __name__ == '__main__':
    app.run()

运行之后,它会一直等待客户端上传文件。

这个时候,我们再来实现urllib3是如何上传文件的,示例如下:

import urllib3

http = urllib3.PoolManager()
with open('1.jpg', 'rb') as f:
    fileData = f.read()
url = 'http://127.0.0.1:5000'
response = http.request('POST', url, fields={'file': ('1.jpg', fileData, 'image/jpeg')})
print(response.data.decode('UTF-8'))

默认flask搭建的服务器,其接口为5000,也就是通过127.0.0.1:5000进行访问。运行之后,就会在uploads文件夹下创建一个1.jpg的图片。

同时,控制台会输出文件上传成功,而服务器会返回状态码200。

这里,上传文件就1一个键值对,其中file代表服务器上传文件的字段。值的元组里,fileData为文件的二进制形式,'image/jpeg'代表上传文件的格式(可以省略)。

超时处理

urllib3库其HTTP的底层都是基于Socket实现的,而Socket超时又分为连接超时与读超时。

其中,连接超时表示在连接的过程中,由于服务器的问题或域名弄错了,而导致的无法连接的情况抛出的异常。

读超时表示从服务器读取数据时由于服务器的问题,导致长时间无法正常读取数据而导致的异常。

通常,我们超时的设置有2种,一种是通过http.request(timeout)进行设置,一种是通过PoolManager()连接池进行设置。示例如下:

from urllib3 import *

http = PoolManager(timeout=Timeout(connect=2.0, read=2.0))
with open('1.jpg', 'rb') as f:
    fileData = f.read()
url = 'http://127.0.0.1:5000'
try:
    response = http.request('POST', url, timeout=Timeout(connect=2.0, read=4.0))
    print(response.data.decode('UTF-8'))
except Exception as e:
    print(e)

需要注意的是,通过连接池PoolManager进行设置的超时,是全局超时时间,哪怕你后边的请求不设置,也是默认使用的这个超时。如果同时设置了request的超时,那么以request为准。

到此这篇关于Python爬虫中urllib3与urllib的区别是什么的文章就介绍到这了,更多相关Python urllib3 urllib内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
深入分析在Python模块顶层运行的代码引起的一个Bug
Jul 04 Python
Python下载懒人图库JavaScript特效
May 28 Python
Python图算法实例分析
Aug 13 Python
python 字典中取值的两种方法小结
Aug 02 Python
详解python的四种内置数据结构
Mar 19 Python
详解小白之KMP算法及python实现
Apr 04 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
Jun 04 Python
PyQt5 QTableView设置某一列不可编辑的方法
Jun 25 Python
python 等差数列末项计算方式
May 03 Python
如何对python的字典进行排序
Jun 19 Python
python实现一个简单RPC框架的示例
Oct 28 Python
Django给表单添加honeypot验证增加安全性
May 06 Python
python Django框架快速入门教程(后台管理)
Python编写nmap扫描工具
Jul 21 #Python
Django模型层实现多表关系创建和多表操作
Jul 21 #Python
Python基本数据类型之字符串str
Jul 21 #Python
Python中22个万用公式的小结
Jul 21 #Python
python字典的元素访问实例详解
Jul 21 #Python
Opencv实现二维直方图的计算及绘制
You might like
PHP 采集程序中常用的函数
2009/12/09 PHP
PHP sprintf()函数用例解析
2011/05/18 PHP
yii实现级联下拉菜单的方法
2014/07/31 PHP
判断控件是否已加载完成的代码
2010/02/24 Javascript
JS鼠标事件大全 推荐收藏
2011/11/01 Javascript
jquery批量设置属性readonly和disabled的方法
2014/01/24 Javascript
一个JavaScript函数把URL参数解析成Json对象
2014/09/24 Javascript
Jquery结合HTML5实现文件上传
2015/06/25 Javascript
用javascript实现自动输出网页文本
2015/07/30 Javascript
基于JavaScript如何制作遮罩层对话框
2016/01/26 Javascript
初识angular框架后的所思所想
2016/02/19 Javascript
Ionic如何创建APP项目
2016/06/03 Javascript
使用递归遍历对象获得value值的实现方法
2016/06/14 Javascript
JS实现兼容各种浏览器的高级拖动方法完整实例【测试可用】
2016/06/21 Javascript
100行代码理解和分析vue2.0响应式架构
2017/03/09 Javascript
React-Native中禁用Navigator手势返回的示例代码
2017/09/09 Javascript
微信小程序选择图片和放大预览图片功能
2017/11/02 Javascript
vue修改对象的属性值后页面不重新渲染的实例
2018/08/09 Javascript
在vue项目中使用Jquery-contextmenu插件的步骤讲解
2019/01/27 jQuery
vue项目中使用vue-layer弹框插件的方法
2020/03/11 Javascript
javascript实现点击小图显示大图
2020/11/29 Javascript
python封装对象实现时间效果
2020/04/23 Python
python字符串编码识别模块chardet简单应用
2015/06/15 Python
python矩阵/字典实现最短路径算法
2019/01/17 Python
使用Python制作一个打字训练小工具
2019/10/01 Python
python连接mongodb集群方法详解
2020/02/13 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
2020/05/11 Python
在python image 中实现安装中文字体
2020/05/16 Python
keras模型保存为tensorflow的二进制模型方式
2020/05/25 Python
Python模块常用四种安装方式
2020/10/20 Python
Kipling意大利官网:世界著名的时尚休闲包袋品牌
2019/06/05 全球购物
某公司面试题
2012/03/05 面试题
写好自荐信的技巧
2013/11/08 职场文书
物理研修随笔感言
2014/02/14 职场文书
教师继续教育反思周记
2015/06/25 职场文书
某某店铺的开业庆典主持词范本
2019/11/25 职场文书