python3 中使用urllib问题以及urllib详解


Posted in Python onAugust 03, 2020

今天遇到一个蛮奇怪的问题:当我在控制台中使用 urllib 没问题,但是当我在 vscode 中 .py 文件中导入 urllib 使用时会报错:

AttributeError: module 'urllib' has no attribute 'request'

查了一下资料是 python3 的 urllib 不会自动导入其under层的包,需要手动导入。

import urllib
import urllib.parse
import urllib.request

再次使用即可成功。

urllibe 是 python3 中将中文 urlencode 编码使用的函数,urlencode 使用如下:

import urllib
import urllib.parse

urllib.parse.quote(string, safe='/', encoding=None, errors=None)

urllib 将编码后的字符串转为中文则使用:

import urllib
import urllib.parse

urllib.parse.unquote(string, encoding='utf-8', errors='replace')

聊到这里就顺带讲讲 urllibe 的使用吧

urllib 是一个 python 内置包,不需要额外安装即可使用,它包含一下几个用来处理 url 的模版。

  • urllib.request,用来打开和读取 url,意思就是可以用它来模拟发送请求,就像在浏览器里输入网址然后敲击回车一样,获取网页响应内容。
  • urllib.error,用来处理 urllib.request 引起的异常,保证程序的正常执行。
  • urllib.parse,用来解析 url,可以对 url 进行拆分、合并等。
  • urllib.robotparse,用来解析 robots.txt 文件,判断网站是否能够进行爬取。

urllib.request 模块

urllib.request 模块定义了以下几个函数。

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

该函数主要用于模拟网站请求,返回一个 HTTPResponse 类型的对象。

urlopen 函数中参数定义

  • url,必选参数,是一个 str 字符串或者 Request 对象(后面会介绍)。
  • data,bytes 类型的可选参数,如果传递的是字典型数据,可以用 urllib.parse.urlencode() 进行编码,返回 str 字符串,再将 str 转换成 bytes 字节流。如果传递 data 参数,urlopen 将使用 HTTP POST 方式请求,否则为 HTTP GET 请求。
  • timeout,可选参数,设置超时时间(未设置时使用全局默认超时时间),以秒为单位计时,如果 urlopen 请求超出了设置时间还未得到响应则抛出异常。
  • cafile 和 capath,可选参数,在 HTTPS 连接请求时指定已认证的 CA 证书以及证书路径。
  • cadefault,一般可忽略该参数。
  • context,ssl.SSLContext 类型的可选参数,用来指定 SSL 设置。

urlopen 函数返回类型

urlopen 函数请求返回一个 HTTPResponse 响应上下文,或者请求异常抛出 URLError 协议错误,一般有如下属性:

  • geturl(),返回检索的 url,通常用于判定是否进行了重定向。
  • info(),返回网页的头信息。
  • getcode(),返回 HTTPResponse 响应的状态码。

urlopen 函数的应用实例

# 创建一个 HTTP GET 请求,输出响应上下文
from urllib.request import urlopen
response = urlopen("http://www.python.org")
print(response.read())

# 创建一个 HTTP POST 请求,输出响应上下文
from urllib.request import urlopen
from urllib.parse import urlencode
data = {'kw' : 'python'}
data = bytes(urlencode(data), encoding = 'utf-8')
response = urlopen("https://fanyi.baidu.com/sug", data)
print(response.read().decode('unicode_escape'))

urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)

该函数主要用于构造一个 url,返回一个 urllib.request.Request 对象。

Request 函数中参数定义

  • url,必选参数,请求的 url 地址。
  • data,bytes 类型的可选参数。
  • headers,字典类型,有些 HTTP 服务器仅允许来自浏览器的请求,因此通过 headers 来模拟浏览器对 url 的访问,比如模拟谷歌浏览器时使用的 headers:”Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36”。可以通过调用 add_header() 来添加 headers 信息。
  • origin_req_host,请求方的 host 名称或者 IP 地址。
  • unverifiable,表示这个请求是否无法验证,默认为 False。比如请求一张图片,如果没有权限获取图片那它的值就是 true。
  • method,是一个字符串,用来指示请求使用的方法,如:GET,POST,PUT 等,默认是 GET 请求。

Request 函数返回类型

与 urlopen 函数请求返回一样,一般返回一个 HTTPResponse 响应上下文。

Request 函数的应用实例

# 采用 HTTP GET 请求的方法模拟谷歌浏览器访问网站,输出响应上下文
from urllib import request,parse
url = 'http://www.python.org'
headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
}
req = request.Request(url, headers = headers, method = 'GET')
response = request.urlopen(req)
print(response.read())

 2 urllib.error 模块

urllib.error 模块定义了由 urllib.request 模块引发的异常,异常主要包含 URLError 和 HTTPError。

urllib.error.URLError 异常

URLError 类继承自 OSError 类,是 error 异常模块的基类,由request模块产生的异常都可以通过捕获这个类来处理。URLError 只有一个属性 reason,即返回错误的原因。

应用实例:

# 在请求连接时候捕获网址错误引发的异常
from urllib import request, error
try: response = request.urlopen('https://www,baidu,com')
except error.URLError as e: print(e.reason)

urllib.error.HTTPError 异常

HTTPError 是 URLError 的子类,专门用来处理 HTTP 请求错误,比如认证请求失败,包含以下三个属性:

  • code:返回 HTTP 响应的状态码,如404页面不存在等。
  • reason:返回错误的原因。
  • headers:返回 HTTP 响应头信息。

应用举例:

# 返回401未授权错误
from urllib import request,error
try: response=request.urlopen('http://pythonscraping.com/pages/auth/login.php') print(response.getcode())
except error.HTTPError as e: print('1.错误原因:\n%s\n2.状态码:\n%s\n3.响应头信息:\n%s' %(e.reason, e.code, e.headers))
except error.URLError as e: print(e.reason)

urllib.parse 模块

urllib.parse 模块定义了一个处理 url 的标准接口,用来实现 url 字符串的抽取、合并以及链接转换。该模块主要用到的函数如下。

urllib.parse.urlparse(urlstring, scheme='', allow_fragments=True)

用于实现 url 字符串的识别和分段,可以分为六个字符串,分别是 scheme (协议),netloc (域名),path (路径),params (参数),query (查询条件)和 fragment (锚点),其结构如下所示:“scheme://netloc/path;parameters?query#fragment”。实际上具体 url 某些字段可能会不存在,比如 “http://www.baidu.com” 只包含了协议和域名。

urlparse 函数中参数定义

  • urlstring,待解析的 url 字符串。
  • scheme,是默认的协议,比如 http 或者 https,url 字符串中如果不携带相关协议,可以通过 scheme 来指定,如果 url 中指定了相关协议则在 url 中生效。
  • allow_fragments,是否忽略锚点,设置为 False 即 fragment 部分会被忽略,反之不会忽略。

urlparse 的返回类型

函数返回的是一个 urllib.parse.ParseResult 对象,获取解析出来的 url 六个字段。

urlparse 应用举例

# 解析并输出 url 中每个字段的字符串
import urllib
url = 'http://www.baidu.com/urllib.parse.html;python?kw=urllib.parse#module-urllib'
result = urllib.parse.urlparse(url)
print(result)
print(result.scheme, result.netloc, result.path, result.params, result.query, result.fragment, sep = '\n')

urllib.parse.urlunparse(parts)

与 urlparse 相反,通过列表或者元祖的形式将分段的字符串组合成一个完整的 url 字符串。

urlunparse 函数中参数定义

parts,可以是列表或者元组。

urlunparse 的返回类型

urlunparse 函数返回一个构造好的 url 字符串。

应用举例

# 通过 data 列表或元组构造一个 url 并输出
import urllib
dataList = ['http', 'www.baidu.com', '/urllib.parse.html', 'python', 'kw=urllib.parse', 'modul-urllib'] # 六个字符串都必须填写,否则会出现 ValueError 错误,如果某一字符串不存在则填入空字符
dataTuple = ('http', 'www.baidu.com', '/urllib.parse.html', '', 'kw=urllib.parse', 'modul-urllib') # 六个字符串都必须填写,否则会出现 ValueError 错误,如果某一字符串不存在则填入空字符
urlList = urllib.parse.urlunparse(dataList)
urlTuple = urllib.parse.urlunparse(dataTuple)
print('1.urlList:%s\n2.urlTuple:%s' % (urlList, urlTuple))

urllib.parse.urlsplit(urlstring, scheme='', allow_fragments=True)

与 urlparse 函数类似,但它只返回 url 字符串的5个字段,把 params 合并到 path 中。

urlsplit 应用举例

# 解析并输出 url 中每个字段的字符串,params 会合并到 path 中。
import urllib
url = 'http://www.baidu.com/urllib.parse.html;python?kw=urllib.parse#modul-urllib'
result = urllib.parse.urlsplit(url)
print(result)
print(result.scheme, result.netloc, result.path, result.query, result.fragment, sep = '\n')

urllib.parse.urlunsplit(parts)

与 urlunparse 函数类似,它也是将 url 中各部分字段组合完整的 url 字符串的方法,唯一的区别是列表或元组的长度必须是5个,因为它把 params 省略了。

urlunsplit 应用举例

# 通过 data 列表或元组构造一个 url 并输出
import urllib
dataList = ['http', 'www.baidu.com', '/urllib.parse.html;python', 'kw=urllib.parse', 'modul-urllib'] # 五个字符串都必须填写,否则会出现 ValueError 错误,如果某一字符串不存在则填入空字符
dataTuple = ('http', 'www.baidu.com', '/urllib.parse.html;python', 'kw=urllib.parse', 'modul-urllib') # 五个字符串都必须填写,否则会出现 ValueError 错误,如果某一字符串不存在则填入空字符
urlList = urllib.parse.urlunsplit(dataList)
urlTuple = urllib.parse.urlunsplit(dataTuple)
print('1.urlList:%s\n2.urlTuple:%s' % (urlList, urlTuple))

urllib.parse.quote(string, safe='/', encoding=None, errors=None)

使用 %xx 转义字符替换字符串中的特殊字符,比如汉字。字母、数字和‘_.-~'字符不会被替换。

quote 函数中参数定义

  • string,可以是 str 字符串或 bytes 类型。
  • safe,可选参数,默认是'/',指明不应该被替换的附加 ASCII 字符。
  • encoding 和 errors,可选参数,用来定义如何处理 non-ASCII 字符。一般默认设置编码方法为 encoding='utf-8',errors='strict',这意味着编码错误将引发 UnicodeError。如果 string 是 bytes 类型,不能设置 encoding 和 errors,否则将引发 TypeError。

quote 函数的返回类型

quote 函数返回一个编码后的字符串。

应用举例

# 采用 quote 对 url 中的汉字进行编码,输出编码后的结果
import urllib
url = 'http://www.baidu.com/爬虫'
result = urllib.parse.quote(url)
print(result)
url = 'http://www.baidu.com/+爬虫'
result = urllib.parse.quote(url, '+') # 更改 safe 参数
print(result)

urllib.parse.unquote(string, encoding='utf-8', errors='replace')

与 quote 函数相反,把 %xx 转义字符替换成字符。

  • unquote 函数的参数定义
  • string,必须是 str 字符串。
  • encoding 和 errors,可选参数,定义如何将 %xx 转义字符解码为 Unicode 字符。encoding 默认为 ‘utf-8',errors 默认为 ‘replace',表示无效的转义字符将会用占位符替换。

unquote 函数的返回类型

unquote 函数返回一个解码后的字符串。

应用举例

# 解码经过 quote 函数处理后的 url,输出解码后的结果。
import urllib
url = 'http://www.baidu.com/爬虫'
result = urllib.parse.quote(url)
print(result)
result = urllib.parse.unquote(url)
print(result)

urllib.parse.urljoin(base, url, allow_fragments=True)

该函数用来将基本 url 与另一个 url 组合,更新基本 url 字符串。它会使用 url 对基本 url 中缺失的部分进行补充,比如 scheme (协议)、netloc (域名)和 path (路径)。即根据 url 字符串中带有的字段,对基本 url 中没有的字段进行补充,已存在的字段进行替换。

  • urljoin 函数中参数定义
  • base,是一个基本 url。
  • url,将 scheme (协议)、netloc (域名)或 path (路径)字段组合进基本 url 的 url。
  • allow_fragments,是否忽略锚点,设置为 False 即 fragment 部分会被忽略,反之不会忽略。

urljoin 函数返回类型

返回组合成功的 url 字符串。

应用举例

# 基于 url 对 base_url 进行重新组合,并输出组合结果。
import urllib
base_url = 'http://www.baidu.com'
url = 'https://www.google.com/urllib.parse.html;python?kw=urllib.parse#module-urllib'
result = urllib.parse.urljoin(base_url,url,False)
print(result)

 urllib.parse.urlencode(query, doseq=False, safe='', encoding=None, errors=None, quote_via=quote_plus)

urlencode 函数可以将字典转化为 GET 请求中的 query (查询条件),或者将字典转化为 POST 请求中需要上传的数据。

  • urlencode 函数中参数定义
  • query,字典类型。
  • doseq,允许字典中一个键对应多个值,编码成 query (查询条件)。
  • safe、encoding 和 errors,这三个参数由 quote_via 指定。

urlencode 函数返回类型

urlencode 函数返回 str 字符串。

应用举例

# 创建 GET 请求
import urllib
params = {'username':'xxx','password':'123'}
base_url='http://www.baidu.com'
url=base_url + '?' + urllib.parse.urlencode(params)
print(url)
params = {'username':['xxx', 'yyy'], 'password':'123'} # username 键对应多个值
base_url='http://www.baidu.com'
url=base_url + '?' + urllib.parse.urlencode(params) # doseq 设置为 False,会解析成乱码
print(url)
url=base_url + '?' + urllib.parse.urlencode(params, True) # doseq 设置为 True
print(url)

 urllib.robotparse 模块

rebotparser 模块提供了一个 RobotFileParser 类,主要用来解析网站上发布的 robots.txt,然后根据解析内容判断爬虫是否有权限来爬取这个网页。

robots.txt 文件

robots.txt,存放于网站根目录下,采用 ASCII 编码的文本文件,记录此网站中的哪些内容是不应被爬虫获取的,哪些是可以被爬虫获取的。

robots.txt 文件内容举例

User-agent: * Disallow: / Allow: /public/

  • User-agent,爬虫的名称,将其设置为 * 代表协议对任何爬虫有效,如果设置为 Baiduspider 则代表协议仅对百度爬虫有效,要是有多条则对多个爬虫有效,至少需要指定一条。
  • Disallow,网页中不允许抓取的目录,上述例子中设置的 / 代表不允许抓取所有的页面。
  • Allow,一般和 Disallow 一起使用,用来排除单独的某些限制,上述例子中设置为 /public/ 表示所有页面不允许抓取,但可以抓取 public 目录。

urllib.robotparser.RobotFileParser(url='') 类及其常用方法

  • set_url(url),设置引用 robots.txt 文件的 url,如果在创建 RobotFileParser 对象时传入了 url,那么就不需要使用这个方法设置 url。
  • read(),读取 robots.txt 文件并将其提供给解析器,不返回任何内容。
  • parse(lines),用来解析 robots.txt 某些行的内容,并安装语法规则来分析内容。
  • can_fetch(useragent, url),传入两个参数,用户代理以及要爬取的网站,返回的内容是该用户代理否可以抓取这个网站,结果为 True 或 False。

到此这篇关于python3 中使用urllib问题以及urllib详解的文章就介绍到这了,更多相关python3使用urllib内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
tensorflow学习笔记之mnist的卷积神经网络实例
Apr 15 Python
python 基本数据类型占用内存空间大小的实例
Jun 12 Python
python切片的步进、添加、连接简单操作示例
Jul 11 Python
Python3enumrate和range对比及示例详解
Jul 13 Python
详解将Python程序(.py)转换为Windows可执行文件(.exe)
Jul 19 Python
Python 合并多个TXT文件并统计词频的实现
Aug 23 Python
Django中自定义模型管理器(Manager)及方法
Sep 23 Python
Python箱型图绘制与特征值获取过程解析
Oct 22 Python
Python ORM编程基础示例
Feb 02 Python
基于python 凸包问题的解决
Apr 16 Python
如何查看Django ORM执行的SQL语句的实现
Apr 20 Python
七个Python必备的GUI库
Apr 27 Python
Python txt文件常用读写操作代码实例
Aug 03 #Python
Python连接Mysql进行增删改查的示例代码
Aug 03 #Python
Python如何在单元测试中给对象打补丁
Aug 03 #Python
Python 数据的累加与统计的示例代码
Aug 03 #Python
Python 爬虫性能相关总结
Aug 03 #Python
python接口自动化之ConfigParser配置文件的使用详解
Aug 03 #Python
Python 利用OpenCV给照片换底色的示例代码
Aug 03 #Python
You might like
解析php5配置使用pdo
2013/07/03 PHP
本地计算机无法启动Apache故障处理
2014/08/08 PHP
PHP中通过fopen()函数访问远程文件示例
2014/11/18 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
javascript中的107个基础知识收集整理 推荐
2010/03/29 Javascript
基于jquery实现漂亮的动态信息提示效果
2011/08/02 Javascript
Jquery提交表单 Form.js官方插件介绍
2012/03/01 Javascript
JS无法捕获滚动条上的mouse up事件的原因猜想
2012/03/21 Javascript
JS 获取select(多选下拉)中所选值的示例代码
2013/08/02 Javascript
jquery表单验证框架提供的身份证验证方法(示例代码)
2013/12/27 Javascript
node.js中的fs.realpath方法使用说明
2014/12/16 Javascript
JavaScript中Function()函数的使用教程
2015/06/04 Javascript
javascript中substring()、substr()、slice()的区别
2015/08/30 Javascript
Javascript实现跨域后台设置拦截的方法详解
2017/08/04 Javascript
详解利用 Express 托管静态文件的方法
2017/09/18 Javascript
简单了解小程序+node梳理登陆流程
2019/06/24 Javascript
[02:57]DOTA2亚洲邀请赛 SECRET战队出场宣传片
2015/02/07 DOTA
[53:43]VP vs NewBee Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
在Python3中初学者应会的一些基本的提升效率的小技巧
2015/03/31 Python
Python字符串、元组、列表、字典互相转换的方法
2016/01/23 Python
Python开发的HTTP库requests详解
2017/08/29 Python
JS设计模式之责任链模式实例详解
2018/02/03 Python
python深度优先搜索和广度优先搜索
2018/02/07 Python
python实现excel读写数据
2021/03/02 Python
Python基于jieba库进行简单分词及词云功能实现方法
2018/06/16 Python
Scrapy-Redis结合POST请求获取数据的方法示例
2019/05/07 Python
TensorFlow车牌识别完整版代码(含车牌数据集)
2019/08/05 Python
Python如何输出警告信息
2020/07/30 Python
详解HTML5中rel属性的prefetch预加载功能使用
2016/05/06 HTML / CSS
app内嵌H5 webview 本地缓存问题的解决
2020/10/19 HTML / CSS
美国专业级皮肤病和spa品质护肤品的高级零售网站:SkinCareRx
2017/02/06 全球购物
阿玛尼意大利官网:Armani意大利
2018/10/30 全球购物
求职信写作要突出重点
2014/01/01 职场文书
2014年公司工作总结
2014/11/22 职场文书
李强感恩观后感
2015/06/17 职场文书
Java工作中实用的代码优化技巧分享
2022/04/21 Java/Android