如何全面掌握Python爬虫模块urllib库的详细用法和技巧?
- 内容介绍
- 文章标签
- 相关推荐
本文共计2206个文字,预计阅读时间需要9分钟。
目录
1.urllib模块简介
2.发送请求:urlopen()方法
3.发送GET请求
4.发送POST请求
5.设置网络超时
6.复杂网络请求:urllib.request.Request()
7.设置请求头
8.获取Cookies
目录- 1.urllib模块简介
- 2.发送请求:urlopen()方法
- 3. 发送GET请求
- 4.发送post请求
- 5. 设置网络超时
- 6. 复杂网络请求_urllib.request.Request()
- 7.设置请求头
- 7.1get请求示例
- 7.2post请求示例
- 8. Cookies的获取与设置
- 9.设置代理IP
- 10.异常处理
- 10.1 URLError
- 10.2HTTPError
- 10.3URLError&HTTPError双重异常捕捉
- 11.解析URL
- 11.1 拆分URL
- 11.2 组合URL
- 11.3 连接URL
- 11.4 URL的编码与解码
- 11.5URL参数的转换
python2有urllib和urllib2两种模块,都用来实现网络请求的发送。python3将urllib和urllib2模块整合并命名为urllib模块。urllib模块有多个子模块,各有不同的功能:
- ①urllib.request模块:用于实现基本的www.python.org/'
response = urllib.request.urlopen(url=url) # 发送网络请求
print('响应数据类型为:', type(response))
print('响应状态码为:', response.status)
print('响应状态码为:', response.getcode())
print('响应头所有信息为:', response.getheaders())
print('响应头指定信息为:', response.getheader('Accept-Ranges'))
# 读取HTML代码并进行utf-8解码
print('Python官网HTML代码如下:\n', response.read().decode('utf-8'))
输出结果如下(部分):
- response是一个<class ‘www.google.com.hk/ HTTP/1.1
- 报文主体
- (POST/GET)参数
当你向对方发送请求后,对方会回应你浏览器的请求,返回两个部分:响应头,Body
Body就是返回给你的主体,比如说请求网站返回的html 响应头讯息里包含了服务器的响应讯息,如fanyi.youdao.com/translate?smartresult=dict&smartresult=rule' # 构建请求对象 req = urllib.request.Request(url, data=data, headers=headers) # 发请求,获取响应对象 res = urllib.request.urlopen(req) # print(res.getcode()) # 得到响应码,200表示请求成功 html = res.read().decode('utf-8') # print(type(html)) # <class 'str'>,得到的是json数据 # json数据转字典 dic = json.loads(html) result = dic["translateResult"] # [[{'src': '你好', 'tgt': 'hello'}]] print(result[0][0]['tgt'])
另一个简单的示例:
import urllib.request # 导入urllib.request模块 import urllib.parse # 导入urllib.parse模块 url = 'www.www.python.org/' response = urllib.request.urlopen(url=url, timeout=0.1) # 设置超时时间为0.1秒 print(response.read().decode('utf-8'))
因为0.1秒设置的过快,结果因超时而产生异常,报错。
通常根据网络环境不同,设置一个合理的时间,如2秒,3秒。
对该网络超时异常进行捕捉并处理:
import urllib.request # 导入urllib.request模块 import urllib.error # 导入urllib.error模块 import socket # 导入socket模块 url = 'www.python.org/' # 请求地址 try: # 发送网络请求,设置超时时间为0.1秒 response = urllib.request.urlopen(url=url, timeout=0.1) print(response.read().decode('utf-8')) # 读取HTML代码并进行utf-8解码 except urllib.error.URLError as error: # 处理异常 if isinstance(error.reason, socket.timeout): # 判断异常是否为超时异常 print('当前任务已超时,即将执行下一任务!')
6. 复杂网络请求_urllib.request.Request()urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
参数说明:
- url:访问网站的完整url地址
- data:默认为None,表示请求方式为get请求;如果需要实现post请求,需要字典形式的数据作为参数。
- headers:设置请求头部信息,字典类型。
- origin_req_host:用于设置请求方的host名称或者IP。
- unverifiable:用于设置网页是否需要验证,默认值为False。
- method:用于设置请求方式,如GET,POST。
url = 'www.baidu.com' # 定义请求头信息 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'} # 创建Request对象 r = urllib.request.Request(url=url, headers=headers) response = urllib.request.urlopen(r) # 发送网络请求 print(response.read().decode('utf-8')) # 读取HTML代码并进行utf-8解码
7.2post请求示例import urllib.request # 导入urllib.request模块 import urllib.parse # 导入urllib.parse模块 url = 'www.www.csdn.net/" opener = urllib.request.build_opener() # 获取opener对象 resp = opener.open(url) print(resp.read().decode())
因为urlopen()方法不支持代理、cookie等其他的HTTP/GTTPS高级功能,所以这里不用urlopen()发送请求,而需要创建一个opener对象(这本来是urllib2中的方法)。示例如下。学习过程中这里作为了解即可,建议重点研究/使用requests库。
import urllib.request # 导入urllib.request模块 import www.python.org/1111111111.html') except urllib.error.URLError as error: # 捕获异常信息 print(error.reason) # 打印异常原因
程序运行结果:
10.2HTTPErrorHTTPError类是URLError的子类,主要用于处理HTTP请求所出现的一次。此类有以下三个属性。
- code :返回HTTP状态码
- reason 返回错误原因
- headers 返回请求头
import urllib.request # 导入urllib.request模块 import urllib.error # 导入urllib.error模块 try: # 向不存在的网络地址发送请求 response = urllib.request.urlopen('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产生的原因主要是
网络没有连接,
服务器连接失
找不到指定的服务器。
当使用urlopen或 opener.open 不能处理的,服务器上都对应一个响应对象,其中包含一个数字(状态码),如果urlopen不能处理,urlopen会产生一个相应的HTTPError对应相应的状态码,HTTP状态码表示HTTP协议所返回的响应的状态码。
import urllib.request # 导入urllib.request模块 import urllib.error # 导入urllib.error模块 try: response = urllib.request.urlopen('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.解析URLurllin模块提供了parse子模块用来解析URL。
11.1 拆分URLurlparse()方法
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('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 = 'docs.python.org/3/library/urllib.parse.html' print(urllib.parse.urlsplit(url)) # 使用urlsplit()方法拆分URL print(urllib.parse.urlparse(url)) # 使用urlparse()方法拆分URL
程序运行结果:
11.2 组合URLurlunparse()方法
urlunparse()方法实现URL的组合 语法:urlunparse(parts) parts表示用于组合url的可迭代对象
import urllib.parse #导入urllib.parse模块 list_url = ['docs.python.org' # 定义基础链接 # 第二参数不完整时 print(urllib.parse.urljoin(base_url,'3/library/urllib.parse.html')) # 第二参数完整时,直接返回第二参数的链接 print(urllib.parse.urljoin(base_url,'docs.python.org/3/library/urllib.parse.html#url-parsing'))
程序运行结果:
11.4 URL的编码与解码使用urlencode()方法编码请求参数,该方法接收的参数值为字典。
示例
import urllib.parse # 导入urllib.parse模块 base_url = 'www.558idc.com/lg.html 复制请保留原URL】
本文共计2206个文字,预计阅读时间需要9分钟。
目录
1.urllib模块简介
2.发送请求:urlopen()方法
3.发送GET请求
4.发送POST请求
5.设置网络超时
6.复杂网络请求:urllib.request.Request()
7.设置请求头
8.获取Cookies
目录- 1.urllib模块简介
- 2.发送请求:urlopen()方法
- 3. 发送GET请求
- 4.发送post请求
- 5. 设置网络超时
- 6. 复杂网络请求_urllib.request.Request()
- 7.设置请求头
- 7.1get请求示例
- 7.2post请求示例
- 8. Cookies的获取与设置
- 9.设置代理IP
- 10.异常处理
- 10.1 URLError
- 10.2HTTPError
- 10.3URLError&HTTPError双重异常捕捉
- 11.解析URL
- 11.1 拆分URL
- 11.2 组合URL
- 11.3 连接URL
- 11.4 URL的编码与解码
- 11.5URL参数的转换
python2有urllib和urllib2两种模块,都用来实现网络请求的发送。python3将urllib和urllib2模块整合并命名为urllib模块。urllib模块有多个子模块,各有不同的功能:
- ①urllib.request模块:用于实现基本的www.python.org/'
response = urllib.request.urlopen(url=url) # 发送网络请求
print('响应数据类型为:', type(response))
print('响应状态码为:', response.status)
print('响应状态码为:', response.getcode())
print('响应头所有信息为:', response.getheaders())
print('响应头指定信息为:', response.getheader('Accept-Ranges'))
# 读取HTML代码并进行utf-8解码
print('Python官网HTML代码如下:\n', response.read().decode('utf-8'))
输出结果如下(部分):
- response是一个<class ‘www.google.com.hk/ HTTP/1.1
- 报文主体
- (POST/GET)参数
当你向对方发送请求后,对方会回应你浏览器的请求,返回两个部分:响应头,Body
Body就是返回给你的主体,比如说请求网站返回的html 响应头讯息里包含了服务器的响应讯息,如fanyi.youdao.com/translate?smartresult=dict&smartresult=rule' # 构建请求对象 req = urllib.request.Request(url, data=data, headers=headers) # 发请求,获取响应对象 res = urllib.request.urlopen(req) # print(res.getcode()) # 得到响应码,200表示请求成功 html = res.read().decode('utf-8') # print(type(html)) # <class 'str'>,得到的是json数据 # json数据转字典 dic = json.loads(html) result = dic["translateResult"] # [[{'src': '你好', 'tgt': 'hello'}]] print(result[0][0]['tgt'])
另一个简单的示例:
import urllib.request # 导入urllib.request模块 import urllib.parse # 导入urllib.parse模块 url = 'www.www.python.org/' response = urllib.request.urlopen(url=url, timeout=0.1) # 设置超时时间为0.1秒 print(response.read().decode('utf-8'))
因为0.1秒设置的过快,结果因超时而产生异常,报错。
通常根据网络环境不同,设置一个合理的时间,如2秒,3秒。
对该网络超时异常进行捕捉并处理:
import urllib.request # 导入urllib.request模块 import urllib.error # 导入urllib.error模块 import socket # 导入socket模块 url = 'www.python.org/' # 请求地址 try: # 发送网络请求,设置超时时间为0.1秒 response = urllib.request.urlopen(url=url, timeout=0.1) print(response.read().decode('utf-8')) # 读取HTML代码并进行utf-8解码 except urllib.error.URLError as error: # 处理异常 if isinstance(error.reason, socket.timeout): # 判断异常是否为超时异常 print('当前任务已超时,即将执行下一任务!')
6. 复杂网络请求_urllib.request.Request()urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
参数说明:
- url:访问网站的完整url地址
- data:默认为None,表示请求方式为get请求;如果需要实现post请求,需要字典形式的数据作为参数。
- headers:设置请求头部信息,字典类型。
- origin_req_host:用于设置请求方的host名称或者IP。
- unverifiable:用于设置网页是否需要验证,默认值为False。
- method:用于设置请求方式,如GET,POST。
url = 'www.baidu.com' # 定义请求头信息 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'} # 创建Request对象 r = urllib.request.Request(url=url, headers=headers) response = urllib.request.urlopen(r) # 发送网络请求 print(response.read().decode('utf-8')) # 读取HTML代码并进行utf-8解码
7.2post请求示例import urllib.request # 导入urllib.request模块 import urllib.parse # 导入urllib.parse模块 url = 'www.www.csdn.net/" opener = urllib.request.build_opener() # 获取opener对象 resp = opener.open(url) print(resp.read().decode())
因为urlopen()方法不支持代理、cookie等其他的HTTP/GTTPS高级功能,所以这里不用urlopen()发送请求,而需要创建一个opener对象(这本来是urllib2中的方法)。示例如下。学习过程中这里作为了解即可,建议重点研究/使用requests库。
import urllib.request # 导入urllib.request模块 import www.python.org/1111111111.html') except urllib.error.URLError as error: # 捕获异常信息 print(error.reason) # 打印异常原因
程序运行结果:
10.2HTTPErrorHTTPError类是URLError的子类,主要用于处理HTTP请求所出现的一次。此类有以下三个属性。
- code :返回HTTP状态码
- reason 返回错误原因
- headers 返回请求头
import urllib.request # 导入urllib.request模块 import urllib.error # 导入urllib.error模块 try: # 向不存在的网络地址发送请求 response = urllib.request.urlopen('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产生的原因主要是
网络没有连接,
服务器连接失
找不到指定的服务器。
当使用urlopen或 opener.open 不能处理的,服务器上都对应一个响应对象,其中包含一个数字(状态码),如果urlopen不能处理,urlopen会产生一个相应的HTTPError对应相应的状态码,HTTP状态码表示HTTP协议所返回的响应的状态码。
import urllib.request # 导入urllib.request模块 import urllib.error # 导入urllib.error模块 try: response = urllib.request.urlopen('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.解析URLurllin模块提供了parse子模块用来解析URL。
11.1 拆分URLurlparse()方法
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('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 = 'docs.python.org/3/library/urllib.parse.html' print(urllib.parse.urlsplit(url)) # 使用urlsplit()方法拆分URL print(urllib.parse.urlparse(url)) # 使用urlparse()方法拆分URL
程序运行结果:
11.2 组合URLurlunparse()方法
urlunparse()方法实现URL的组合 语法:urlunparse(parts) parts表示用于组合url的可迭代对象
import urllib.parse #导入urllib.parse模块 list_url = ['docs.python.org' # 定义基础链接 # 第二参数不完整时 print(urllib.parse.urljoin(base_url,'3/library/urllib.parse.html')) # 第二参数完整时,直接返回第二参数的链接 print(urllib.parse.urljoin(base_url,'docs.python.org/3/library/urllib.parse.html#url-parsing'))
程序运行结果:
11.4 URL的编码与解码使用urlencode()方法编码请求参数,该方法接收的参数值为字典。
示例
import urllib.parse # 导入urllib.parse模块 base_url = 'www.558idc.com/lg.html 复制请保留原URL】

