欢迎来到 铁岭市某某化工涂料运营部
全国咨询热线:020-123456789
联系我们

地址:联系地址联系地址联系地址

电话:020-123456789

传真:020-123456789

邮箱:admin@aa.com

新闻中心
urllib 包基本使用
  来源:铁岭市某某化工涂料运营部  更新时间:2024-04-30 06:47:08

urllib 包基本使用

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 请求 ,输出响应上下文nfrom urllib.request import urlopennresponse = urlopen("http://www.python.org")nprint(response.read())

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

# 创建一个 HTTP GET 请求 ,设置超时时间为0.1snimport urllib.requestnimport urllib.errorntry:n response=urllib.request.urlopen('http://www.python.org',timeout=0.1)n print(response.read()) nexcept urllib.error.URLError as e:n print(e.reason)

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 请求的方法模拟谷歌浏览器访问网站,输出响应上下文nfrom urllib import request,parsenurl = 'http://www.python.org'nheaders = { n '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'n}nreq = request.Request(url, headers = headers, method = 'GET')nresponse = request.urlopen(req) nprint(response.read())

# 采用 HTTP POST 请求的方法模拟谷歌浏览器访问网站 ,输出响应上下文nfrom urllib import requestnfrom urllib import parsenurl = 'https://fanyi.baidu.com/sug'ndata = { 'kw' : 'python'}ndata = bytes(parse.urlencode(data), encoding = 'utf-8')nheaders = { n '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'n}nreq = request.Request(url, data, headers, method = 'POST')nresponse = request.urlopen(req) nprint(response.read().decode('unicode_escape'))

# 创建一个 HTTP GET 请求 ,通过 add_header 添加一个 UserAgentnimport urllib.requestnimport randomnurl = 'http://www.python.org'nheaderUserAgentList = ['Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36',n'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0']nrandomHeaderUserAgent = random.choice(headerUserAgentList) # 随机选取一个 UserAgentnreq = urllib.request.Request(url) nreq.add_header('User-Agent', randomHeaderUserAgent) # 添加 UserAgentnresponse=urllib.request.urlopen(req)nprint(req.get_header('User-agent'))nprint(req.headers) # 打印请求的 header 信息

urllib.error 模块

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

urllib.error.URLError 异常

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

应用实例:

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

urllib.error.HTTPError 异常

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

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

应用举例 :

# 返回401未授权错误nfrom urllib import request,errorntry:n response=request.urlopen('http://pythonscraping.com/pages/auth/login.php')n print(response.getcode())nexcept error.HTTPError as e:n print('1.错误原因 :n%sn2.状态码 :n%sn3.响应头信息:n%s' %(e.reason, e.code, e.headers))nexcept error.URLError as e:n 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 中每个字段的字符串nimport urllibnurl = 'http://www.baidu.com/urllib.parse.html;python?kw=urllib.parse#module-urllib'nresult = urllib.parse.urlparse(url)nprint(result)nprint(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 并输出nimport urllibndataList = ['http', 'www.baidu.com', '/urllib.parse.html', 'python', 'kw=urllib.parse', 'modul-urllib'] # 六个字符串都必须填写,否则会出现 ValueError 错误,如果某一字符串不存在则填入空字符ndataTuple = ('http', 'www.baidu.com', '/urllib.parse.html', '', 'kw=urllib.parse', 'modul-urllib') # 六个字符串都必须填写,否则会出现 ValueError 错误 ,如果某一字符串不存在则填入空字符nurlList = urllib.parse.urlunparse(dataList)nurlTuple = urllib.parse.urlunparse(dataTuple)nprint('1.urlList:%sn2.urlTuple:%s' % (urlList, urlTuple))

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

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

urlsplit 应用举例

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

urllib.parse.urlunsplit(parts)

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

urlunsplit 应用举例

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

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 。

应用举例

# 使用两种爬虫代理分别查看是否可以对 'http://www.baidu.com' 网站进行爬取nfrom urllib.robotparser import RobotFileParsernrp = RobotFileParser()nrp.set_url("http://www.baidu.com/robots.txt")nrp.read()nprint(rp.can_fetch('Baiduspider', 'http://www.baidu.com')) nprint(rp.can_fetch('*', 'http://www.baidu.com'))n


友情链接韩国乒乓球队损失惨重,6人出局。梁夏银三局大逆转,张禹珍3-0詹姆斯:我执着于不夺冠就失败,让我失眠的是并非每个队友都这么想800万,曝切尔西竞争曼联,签法国国脚接替AZP,图赫尔笑了确实有价值!米切尔生涯前五季场均得分均20+ 艾弗森后首位后卫张稀哲世界波破门送广州城12连败中国女排,切不可重新踏上中国女足曾经走过的歧路英超-哈兰德上演帽子戏法,B席建功,曼城4:2大逆转水晶宫卡梅伦-托马斯:哈登西蒙斯交易很疯狂,我学到了这是生意贝吉里斯坦:罗德里是顶级职业球员的完美典范,那是主教练的梦想10年前的今天维拉蒂加盟巴黎,至今斩获28个冠军中超官方:受疫情影响 调整第16轮和17轮比赛安排世界男足历史最佳阵容23人0-1!中国女足5连不胜,水庆霞17场首败,2队长首发+留洋7星缺席意甲|萨里巧妙换人 拉齐奥战胜国际米兰热火新援戴斯谈PJ-塔克:他注重细节能防守能抢篮板 他是我的榜样国米张主席已完成6笔补强,清理冗员也在进行,国米在稳步发展英超新赛季将引入新规!采用“多球制”英超卫冕冠军曼城官方宣布:曼城与罗德里续约至2027年里瓦尔多是怎么陨落的?2022中超武汉三镇不败夺冠将创最强升班马记录足坛30年来最佳阵容!门将卡西,后卫马队卡纳瓦罗,前锋梅罗大罗弗洛伦蒂诺二进宫执掌13年,皇马最赚钱的七笔转会交易曼晚评“双红会”曼联球员表现:桑乔最佳、拜利马夏尔等多人高分一切为了流量——欧冠小组赛抽签感受3-0,又赢了!前曼联主帅神了,2场6球+淘汰鱼腩,剑指队史首冠哈登:我和恩比德经常交流 我们是各自位置上的顶级球员&球队基石22-23赛季德甲最新积分榜,拜仁以净胜球优势领跑,勒沃库森第11从2-0到2-3!德甲神鬼6分钟:5.13亿强队被打懵,到手3分变0分内线被对手完爆,曾是中国男篮劲敌的菲律宾,单节狂输19个篮板恒大跌倒,郜林吃饱,前恒大球星出售豪宅:1.45亿Shams:湖人用塔伦-霍顿-塔克从爵士换回后卫贝弗利篮网全队打出精彩战术配合清空防守,助小后卫隔扣绿军大中锋维埃里做出争议表态,C罗遭重大打击,梅西很意外,球迷骂声一片夸梅布朗12年职业生涯签了6份合同,被乔丹一手毁掉的天才状元1-0到1-1!穆帅神换人奏效,迪巴拉世界级助攻,旧主面前秀操作巴黎抵达日本召开新闻发布会,“MMN”组合齐亮相展望cba新赛季,看看哪些广东籍球员能成为球队主力苏炳添世锦赛百米跑出10秒159-0!尤文虐菜不留情面!迪马利亚首球,小基恩戴帽杜锋一把拉住翟晓川 手舞足蹈激情指导
联系我们

地址:联系地址联系地址联系地址

电话:020-123456789

传真:020-123456789

邮箱:admin@aa.com

0.2116

Copyright © 2024 Powered by 铁岭市某某化工涂料运营部   sitemap