Python对于urllib库的使用

TOC

urllib库主要用于操作网页URL,并对网页的内容进行抓取处理。
urllib库的四个模块:

  • urllib.request
  • urllib.error
  • urllib.parse
  • urllib.robotparser

一、urllib.request

urllib.request方法可以模拟浏览器请求发起过程。
我们可以使用urllib.request.urlopen()方法来打开一个网页。
使用方法:

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
  • url:url 地址。
  • data:发送到服务器的其他数据对象,默认为 None。
  • timeout:设置访问超时时间。
  • cafile 和 capath:cafile 为 CA 证书, capath 为 CA 证书的路径,使用 HTTPS 需要用到。
  • cadefault:已经被弃用。
  • context:ssl.SSLContext类型,用来指定 SSL 设置。
    请求实例:
from urllib.request import urlopen

request = urlopen("https://www.baidu.com/")
print(myURL.read())

1.urllib.request常用方法

from urllib.request import urlopen

request = urlopen("https://www.baidu.com/")
"""
read()       读取获取的网页内容
readline()   读取一行获取的网页内容
readlines()  读取网页内容,保存为列表的数据类型
getcode()    获取状态码
"""
print(request.read())
print(request.read(200))  #指定内容长度
print(request.readline())
print(request.getcode())

2.url的解码和编码

urllib.request.quote()和urllib.request.unquote()方法

import urllib.request 

# 编码
encode_url = urllib.request.quote("https://www.baidu.com/")
print(encode_url)

# 解码
unencode_url = urllib.request.unquote(encode_url)
print(unencode_url)

3.header请求头模拟

则需要使用urllib.request.Request类
使用方法:

urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
  • url:url 地址。
  • data:发送到服务器的其他数据对象,默认为 None。
  • headers:HTTP 请求的头部信息,字典格式。
  • origin_req_host:请求的主机地址,IP 或域名。
  • unverifiable:很少用这个参数,用于设置网页是否需要验证,默认是 False。
  • method:请求方法, 如 GET、POST、DELETE、PUT等。
    请求实例:
import urllib.request
import urllib.parse

# 菜鸟教程搜索页面
url = 'https://www.runoob.com/?s='
 # 对请求的内容进行编码
key_code = urllib.request.quote('Python')
url_all = url + key_code
# herder头部信息
header = {
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0"
}
request = urllib.request.Request(url_all, headers=header)
reponse = urllib.request.urlopen(request).read()

fh = open("./urllib_test_runoob_search.html","wb")    # 将文件写入到当前目录中
fh.write(reponse)
fh.close()

二、urllib.error

urllib.error 模块为 urllib.request 所引发的异常定义了异常类,主要包含了URLError 和 HTTPError两个方法。
使用实例:

from urllib.request import urlopen
import urllib.error

try:  
    request = urlopen("https://www.baidu.com/") 
except urllib.error.HTTPError as e:  
    if e.code == 404:  
        print(404)

三、urllib.parse

urllib.parse用于解析URL全部的内容
使用方法:

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

1.urlparse()方法

from urllib.parse import urlparse

url_data = urlparse("https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E7%AF%AE%E7%90%83&fenlei=256&rsv_pq=0xe6fa6395005a9917&rsv_t=d94dergyyLwemjAHP2%2BeaoanN%2BdkEM0dd2lrgqyYw4DHEvg8DKfIhNIu9Lh6&rqlang=en&rsv_dl=tb&rsv_enter=1&rsv_sug3=10&rsv_sug1=7&rsv_sug7=101&rsv_sug2=0&rsv_btype=i&prefixsug=%25E7%25AF%25AE%25E7%2590%2583&rsp=5&inputT=3876&rsv_sug4=5997")
print(url_data)
"""
输出结果如下:
ParseResult(scheme='https', netloc='www.baidu.com', path='/s', params='', query='ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E7%AF%AE%E7%90%83&fenlei=256&rsv_pq=0xe6fa6395005a9917&rsv_t=d94dergyyLwemjAHP2%2BeaoanN%2BdkEM0dd2lrgqyYw4DHEvg8DKfIhNIu9Lh6&rqlang=en&rsv_dl=tb&rsv_enter=1&rsv_sug3=10&rsv_sug1=7&rsv_sug7=101&rsv_sug2=0&rsv_btype=i&prefixsug=%25E7%25AF%25AE%25E7%2590%2583&rsp=5&inputT=3876&rsv_sug4=5997', fragment='')
"""
# 获取协议信息
print(url_data.scheme)

结果是个元组的形式,其中内容包括协议,位置,路径,参数,查询,判断,我们还可以直接获取其中某一个信息,比如协议。

2.urlsplit()方法

该方法可以将url分解为多个组件,并返回一个SplitResult对象。包含以下几个部分:

  • scheme:协议(如 http、https、ftp 等)
  • netloc:网络位置(主机名和可选的端口)
  • path:路径(URL 的路径部分)
  • query:查询参数(URL 中的查询字符串)
  • fragment:片段标识符(URL 的锚点部分)
    使用实例:
from urllib.parse import urlsplit

url = 'https://www.runoob.com/python3/python3-intro.html'
# 查看请求的协议
print(urlsplit(url).scheme)
# 查看请求url的路径
print(type(urlsplit(url).path))

3.urlencode()方法

用于将字典或包含二元组的序列转换为 URL 查询字符串(query string)的格式,常用于构造 GET 请求中的参数部分。
使用实例:

from urllib.parse import urlencode  
wd = '帅哥图片'  
encode_res = urlencode({'word': wd}, encoding='utf-8')  
print(encode_res)
'''
输出结果如下:
word=%E5%B8%85%E5%93%A5%E5%9B%BE%E7%89%87
'''