python爬虫urllib模块详解,建议细读

9.设置代理IP

==============================================================================

import urllib.request # 导入urllib.request模块

url= ‘xxxxxxxxxxxxxxx’

创建代理IP

proxy_handler = urllib.request.ProxyHandler({

‘https’: ‘xxxxxxxxxxxxxxxxx’ # 写入代理IP

})

创建opener对象

opener = urllib.request.build_opener(proxy_handler)

response = opener.open(url,timeout=2)

print(response.read().decode(‘utf-8’))


10.异常处理

=============================================================================

urllib模块中的urllib.error子模块包含了URLError与HTTPError两个比较重要的异常类。

10.1 URLError


URLError类提供了一个reason属性,可以通过这个属性了解错误的原因。示例如下:

import urllib.request # 导入urllib.request模块

import urllib.error # 导入urllib.error模块

try:

向不存在的网络地址发送请求

response = urllib.request.urlopen(‘https://www.python.org/1111111111.html’)

except urllib.error.URLError as error: # 捕获异常信息

print(error.reason) # 打印异常原因

程序运行结果:

在这里插入图片描述

10.2HTTPError


HTTPError类是URLError的子类,主要用于处理HTTP请求所出现的一次。此类有以下三个属性。

  • code :返回HTTP状态码

  • reason 返回错误原因

  • headers 返回请求头

import urllib.request # 导入urllib.request模块

import urllib.error # 导入urllib.error模块

try:

向不存在的网络地址发送请求

response = urllib.request.urlopen(‘https://www.python.org/1111111111.html’)

print(response.status)

except urllib.error.HTTPError as error: # 捕获异常信息

print(‘状态码为:’,error.code) # 打印状态码

print(‘异常信息为:’,error.reason) # 打印异常原因

print(‘请求头信息如下:\n’,error.headers) # 打印请求头

结果如下(部分):

在这里插入图片描述

10.3URLError&HTTPError双重异常捕捉


因为URLError是HTTPError的父类,所以在捕获异常的时候可以先找子类是否异常,父类的异常应当写到子类异常的后面,如果子类捕获不到,那么可以捕获父类的异常。

URLError产生的原因主要是

    1. 网络没有连接,
    1. 服务器连接失
    1. 找不到指定的服务器。

当使用urlopen或 opener.open 不能处理的,服务器上都对应一个响应对象,其中包含一个数字(状态码),如果urlopen不能处理,urlopen会产生一个相应的HTTPError对应相应的状态码,HTTP状态码表示HTTP协议所返回的响应的状态码。

import urllib.request # 导入urllib.request模块

import urllib.error # 导入urllib.error模块

try:

response = urllib.request.urlopen(‘https://www.python.org/’,timeout=0.1)

except urllib.error.HTTPError as error: # HTTPError捕获异常信息

print(‘状态码为:’,error.code) # 打印状态码

print(‘HTTPError异常信息为:’,error.reason) # 打印异常原因

print(‘请求头信息如下:\n’,error.headers) # 打印请求头

except urllib.error.URLError as error: # URLError捕获异常信息

print(‘URLError异常信息为:’,error.reason)

这里访问了一个真实存在的URL,输出结果为:

在这里插入图片描述


11.解析URL

==============================================================================

urllin模块提供了parse子模块用来解析URL。

11.1 拆分URL


urlparse()方法

parse子模块提供了urlparse()方法,实现将URL分解成不同部分,语法格式如下:

urllib.parse.urlparse(urlstring,scheme=’’,allow_fragment=True)

  • urlstring:需要拆分的URL,必选参数。

  • scheme:可选参数,需要设置的默认协议,默认为空字符串,如果要拆分的URL中没有协议,可通过该参数设置一个默认协议。

  • allow_fragment:可选参数,如果该参数设置为False,则表示忽略fragment这部分内容,默认为True。

示例:

import urllib.parse #导入urllib.parse模块

parse_result = urllib.parse.urlparse(‘https://docs.python.org/3/library/urllib.parse.html’)

print(type(parse_result)) # 打印类型

print(parse_result) # 打印拆分后的结果

程序运行结果:

在这里插入图片描述

用此方法,除了返回ParseResult对象以外,还可以直接获取ParseResult对象中的每个属性值:

print(‘scheme值为:’, parse_result.scheme)

print(‘netloc值为:’, parse_result.netloc)

print(‘path值为:’, parse_result.path)

print(‘params值为:’, parse_result.params)

print(‘query值为:’, parse_result.query)

print(‘fragment值为:’, parse_result.fragment)

在这里插入图片描述

urlsplit()方法

urlsplit()方法与urlparse()方法类似,都可以实现URL的拆分。只是urlsplit()方法不再单独拆分params这部分内容,而是将params合并到path中,所以返回结果只有5部分内容。且返回的数据类型为SplitResult。

import urllib.parse #导入urllib.parse模块

需要拆分的URL

url = ‘https://docs.python.org/3/library/urllib.parse.html’

print(urllib.parse.urlsplit(url)) # 使用urlsplit()方法拆分URL

print(urllib.parse.urlparse(url)) # 使用urlparse()方法拆分URL

程序运行结果:

在这里插入图片描述

11.2 组合URL


urlunparse()方法

urlunparse()方法实现URL的组合

语法:urlunparse(parts)

parts表示用于组合url的可迭代对象

import urllib.parse #导入urllib.parse模块

list_url = [‘https’, ‘docs.python.org’, ‘/3/library/urllib.parse.html’, ‘’, ‘’, ‘’]

tuple_url = (‘https’, ‘docs.python.org’, ‘/3/library/urllib.parse.html’, ‘’, ‘’, ‘’)

dict_url = {‘scheme’: ‘https’, ‘netloc’: ‘docs.python.org’, ‘path’: ‘/3/library/urllib.parse.html’, ‘params’: ‘’, ‘query’:‘’, ‘fragment’: ‘’}

print(‘组合列表类型的URL:’, urllib.parse.urlunparse(list_url))

print(‘组合元组类型的URL:’, urllib.parse.urlunparse(tuple_url))

print(‘组合字典类型的URL:’, urllib.parse.urlunparse(dict_url.values()))

程序运行结果:

在这里插入图片描述

urlunsplit()方法

同样用于URL组合,只是参数中的元素必须是5个。

import urllib.parse #导入urllib.parse模块

list_url = [‘https’, ‘docs.python.org’, ‘/3/library/urllib.parse.html’, ‘’, ‘’]

tuple_url = (‘https’, ‘docs.python.org’, ‘/3/library/urllib.parse.html’, ‘’, ‘’)

dict_url = {‘scheme’: ‘https’, ‘netloc’: ‘docs.python.org’, ‘path’: ‘/3/library/urllib.parse.html’, ‘query’: ‘’, ‘fragment’: ‘’}

print(‘组合列表类型的URL:’, urllib.parse.urlunsplit(list_url))

print(‘组合元组类型的URL:’, urllib.parse.urlunsplit(tuple_url))

print(‘组合字典类型的URL:’, urllib.parse.urlunsplit(dict_url.values()))

程序运行结果

在这里插入图片描述

11.3 连接URL


用**urljoin()**方法来实现URL的连接。

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

  • base 表示基础链接

  • url 表示新的链接

  • allow_fragments 为可选参数,默认为Ture,设为False则忽略fragment这部分内容。

import urllib.parse #导入urllib.parse模块

base_url = ‘https://docs.python.org’ # 定义基础链接

第二参数不完整时

print(urllib.parse.urljoin(base_url,‘3/library/urllib.parse.html’))

第二参数完整时,直接返回第二参数的链接

print(urllib.parse.urljoin(base_url,‘https://docs.python.org/3/library/urllib.parse.html#url-parsing’))

程序运行结果:

在这里插入图片描述

11.4 URL的编码与解码


使用urlencode()方法编码请求参数,该方法接收的参数值为字典

示例

import urllib.parse # 导入urllib.parse模块

base_url = ‘http://httpbin.org/get?’ # 定义基础链接

params = {‘name’: ‘Jack’, ‘country’: ‘China’, ‘age’: 18} # 定义字典类型的请求参数

url = base_url+urllib.parse.urlencode(params) # 连接请求地址

print(‘编码后的请求地址为:’, url)

程序运行结果:

在这里插入图片描述

使用quote方法编码请求参数,该方法接收的参数值类型为字符串

示例:

import urllib.parse #导入urllib.parse模块

base_url = ‘http://httpbin.org/get?country=’ # 定义基础链接

url = base_url + urllib.parse.quote(‘中国’) # 字符串编码

print(‘编码后的请求地址为:’, url)

程序运行结果:

在这里插入图片描述

使用unquote()方法解码请求参数,即逆向解码。

示例:

import urllib.parse #导入urllib.parse模块

u = urllib.parse.urlencode({‘country’: ‘中国’}) # 使用urlencode编码

q = urllib.parse.quote(‘country=中国’) # 使用quote编码

print(‘urlencode编码后结果为:’, u)

print(‘quote编码后结果为:’, q)

print(‘对urlencode解码:’, urllib.parse.unquote(u))

print(‘对quote解码:’, urllib.parse.unquote(q))

程序运行结果:

在这里插入图片描述

11.5URL参数的转换


使用parse_qs()方法将参数转换为字典类型。

import urllib.parse #导入urllib.parse模块

定义一个请求地址

url = ‘http://httpbin.org/get?name=Jack&country=%E4%B8%AD%E5%9B%BD&age=30’

q = urllib.parse.urlsplit(url).query # 获取需要的参数

q_dict = urllib.parse.parse_qs(q) # 将参数转换为字典类型的数据

print(‘数据类型为:’, type(q_dict))

print(‘转换后的数据:’, q_dict)

(其中query是前边拆分部分提到的拆分结果对象的一个属性)

程序运行结果:

在这里插入图片描述

使用parse_qsl()方法将参数转换为元组组成的列表

import urllib.parse # 导入urllib.parse模块

str_params = ‘name=Jack&country=%E4%B8%AD%E5%9B%BD&age=30’ # 字符串参数

list_params = urllib.parse.parse_qsl(str_params) # 将字符串参数转为元组所组成的列表

print(‘数据类型为:’, type(list_params))

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img



既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
img

现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。

分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

存中…(img-o7pZk041-1712163555298)]

现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。

分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值