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

今天遇到一个蛮奇怪的问题:当我在控制台中使用 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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 解决python3 urllib中urlopen报错的问题

    前言 最近更新了Python版本,准备写个爬虫,意外的发现urllib库中属性不存在urlopen,于是各种google,然后总结一下给出解决方案 问题的出现 AttributeError: 'module' object has no attribute 'urlopen' 问题的解决途径 我们先来看下官方文档的解释: a new urllib package was created. It consists of code from urllib, urllib2, urlparse, an

  • python3.6使用urllib完成下载的实例

    如下所示: url = u'http://tieba.baidu.com/f?kw=权利的游戏&ie=utf-8&pn=50' url = quote(url, safe = string.printable) response=urllib.request.urlopen( url ) response.read() 以上这篇python3.6使用urllib完成下载的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • Python3学习urllib的使用方法示例

    urllib是python的一个获取url(Uniform Resource Locators,统一资源定址符)了,可以利用它来抓取远程的数据进行保存,本文整理了一些关于urllib使用中的一些关于header,代理,超时,认证,异常处理处理方法. 1.基本方法 urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None) url:  需要

  • python3使用urllib模块制作网络爬虫

    urllib urllib模块是python3的URL处理包 其中: 1.urllib.request主要是打开和阅读urls 个人平时主要用的1: 打开对应的URL:urllib.request.open(url) 用urllib.request.build_opener([handler, ...]),来伪装成对应的浏览器 import urllib #要伪装成的浏览器(我这个是用的chrome) headers = ('User-Agent','Mozilla/5.0 (Windows N

  • 对python3 urllib包与http包的使用详解

    urllib包和http包都是面向HTTP协议的.其中urllib主要用于处理 URL,使用urllib操作URL可以像使用和打开本地文件一样地操作.而 http包则实现了对 HTTP协议的封装,是urllib.request模块的底层. 1.urllib包简介 2. http 包简介 1.urllib包简介 urllib包主要模块有: 1.urllib.request -----用于打开 URL网址: 2.urllib.error ---------定义了常见的urllib.request会引

  • Python2.X/Python3.X中urllib库区别讲解

    本文介绍urllib库在不同版本的Python中的变动,并以Python3.X讲解urllib库的相关用法. urllib库对照速查表 Python2.X Python3.X urllib urllib.request, urllib.error, urllib.parse urllib2 urllib.request, urllib.error urllib2.urlopen urllib.request.urlopen urllib.urlencode urllib.parse.urlenc

  • 解决python3 urllib 链接中有中文的问题

    环境python3,开发平台pycharm,使用urllib时,当url中存在中文时会出现以下错误: UnicodeEncodeError: 'ascii' codec can't encode characters in position 69-78: ordinal not in range(128) 解决方法 单独处理url中的中文如: import urllib s='中文' s=urllib.parse.quote(s) url='some english url character

  • python33 urllib2使用方法细节讲解

    Proxy 的设置 urllib2 默认会使用环境变量 http_proxy 来设置 HTTP Proxy.如果想在程序中明确控制 Proxy 而不受环境变量的影响,可以使用下面的方式 复制代码 代码如下: import urllib2 enable_proxy = Trueproxy_handler = urllib2.ProxyHandler({"http" : 'http://some-proxy.com:8080'})null_proxy_handler = urllib2.P

  • Python3中urlencode和urldecode的用法详解

    在Python3中,将中文进行urlencode编码使用函数 urllib.parse.quote(string, safe='/', encoding=None, errors=None) 而将编码后的字符串转为中文,则使用 urllib.parse.unquote(string, encoding='utf-8', errors='replace') 示例代码如下: test = "微信公众账号比特量化" print(test) new = urllib.parse.quote(t

  • Python3中的bytes和str类型详解

    Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分.文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示.Python 3不会以任意隐式的方式混用str和bytes,你不能拼接字符串和字节流,也无法在字节流里搜索字符串(反之亦然),也不能将字符串传入参数为字节流的函数(反之亦然). 下面让我们深入分析一下二者的区别和联系. 编码发展的历史 在谈bytes和str之前,需要先说说关于编码是如何发展的.. 在计算机历史的早期,美国为代表的英语系国家主导了整

  • 对python3中, print横向输出的方法详解

    Python 2 : print打印的时候,如果结尾有逗号,打出来时候不会换行.但是在python3里面就不行了. Python3 : 3.0的print最后加个参数end=""就可以了 以上这篇对python3中, print横向输出的方法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • python3中numpy函数tile的用法详解

    tile函数位于python模块 numpy.lib.shape_base中,他的功能是重复某个数组.比如tile(A,n),功能是将数组A重复n次,构成一个新的数组,我们还是使用具体的例子来说明问题:(至于为什么是在numpy.lib.shape_base中,我还是不太清楚.) 其实tile就是重复的意思,把一个数组a,当做模板,重复几次,生成另一个数组b 至于矩阵可以不以这样,还没有试过. 例子: 创建一个a,使用tile来创建b from numpy import * a=[0,1,2]

  • python3中TQDM库安装及使用详解

    在一众有趣的Python库中,TQDW也算是独树一帜了,原因主要是因为自身所存在的功能效果,比如我们如果在写项目,往往会忘记我们要完成多少量,而这个库主要就是帮我们实时掌握进度,现在这样跟大家讲解,是不是都来了兴趣呢?因此,那就开启本章正题,给大家详解TQDM库的安装及使用. 先来说下安装,常用方式: pipinstall tqdm 当for循环使用range函数时,只是把它替换为tqdm中的trange即可. fromtqdm import trangefor i in trange(100)

  • python urllib库的使用详解

    相关:urllib是python内置的http请求库,本文介绍urllib三个模块:请求模块urllib.request.异常处理模块urllib.error.url解析模块urllib.parse. 1.请求模块:urllib.request python2 import urllib2 response = urllib2.urlopen('http://httpbin.org/robots.txt') python3 import urllib.request res = urllib.r

  • Python爬虫库urllib的使用教程详解

    目录 Python urllib库 urllib.request模块 urlopen函数 Request 类 urllib.error模块 URLError 示例 HTTPError示例 URLError和HTTPError混合使用 urllib.parse模块 urlparse() urlunparse() urlsplit() urljoin() URL 转码 编码quote(string) 编码urlencode() 解码 unquote(string) urllib.robotparse

  • 在Python3 numpy中mean和average的区别详解

    mean和average都是计算均值的函数,在不指定权重的时候average和mean是一样的.指定权重后,average可以计算一维的加权平均值. 具体如下: import numpy as np a = np.array([np.random.randint(0, 20, 5), np.random.randint(0, 20, 5)]) print('原始数据\n', a) print('mean函数'.center(20, '*')) print('对所有数据计算\n', a.mean(

  • python3中datetime库,time库以及pandas中的时间函数区别与详解

    1介绍datetime库之前 我们先比较下time库和datetime库的区别 先说下time 在 Python 文档里,time是归类在Generic Operating System Services中,换句话说, 它提供的功能是更加接近于操作系统层面的.通读文档可知,time 模块是围绕着 Unix Timestamp 进行的. 该模块主要包括一个类 struct_time,另外其他几个函数及相关常量. 需要注意的是在该模块中的大多数函数是调用了所在平台C library的同名函数, 所以

  • Python中__init__.py文件的作用详解

    __init__.py 文件的作用是将文件夹变为一个Python模块,Python 中的每个模块的包中,都有__init__.py 文件. 通常__init__.py 文件为空,但是我们还可以为它增加其他的功能.我们在导入一个包时,实际上是导入了它的__init__.py文件.这样我们可以在__init__.py文件中批量导入我们所需要的模块,而不再需要一个一个的导入. # package # __init__.py import re import urllib import sys impo

随机推荐