urllib
是 Python 中处理 URL 和网络请求的标准库,针对不同需求分为多个子模块。从 Python 3 起,重构后的 urllib
包括 urllib.request
用于发送 HTTP 请求,urllib.parse
处理 URL,urllib.error
定义异常,以及 urllib.robotparser
解析 robots.txt 文件,提供了强大且清晰的接口。
urllib.request
urllib.request模块主要用于打开及读取URLs。它为用户提供了一个简洁的接口来访问HTTP为主的URLs,操作方式类似于处理本地文件或文件类对象。
示例:使用 urllib.request 打开一个网页
from urllib.request import urlopen
打开一个网页
response = urlopen('http://www.baidu.com')
读取网页内容
html = response.read()
打印网页内容的前50个字符
print(html[:50].decode('utf-8')) # 需要解码,因为read()返回的是bytes
关闭连接
response.close()
urllib.parse
urllib.parse模块专门用于解析URLs,不仅能够将URL字符串拆解为其构成元素,还支持将这些元素重新组合成完整的URL字符串。
示例:使用 urllib.parse 解析URL
from urllib.parse import urlparse
解析URL
parsed_url = urlparse('http://www.baidu.com/path?query=string#fragment')
访问解析后的URL的各个部分
print(parsed_url.scheme) # http
print(parsed_url.netloc) # www.baidu.com
print(parsed_url.path) # /path
print(parsed_url.query) # query=string
print(parsed_url.fragment)# fragment
urllib.error
urllib.error
模块集成了urllib.request
引发的各种异常。这些异常能有效帮助开发者处理网络请求过程中可能遇到的问题,比如连接失败或HTTP错误等,确保程序稳定运行。
示例:处理 urllib.request 引发的异常
import logging
from urllib.request import urlopen
from urllib.error import HTTPError, URLError
def fetch_html(url):
try:
with urlopen(url) as response: # 使用 with 语句自动关闭资源
html = response.read()
return html[:50].decode('utf-8')
except HTTPError as e:
logging.error(f'HTTP error: {e.code}')
return None
except URLError as e:
logging.error(f'URL error: {e.reason}')
return None
except Exception as e:
logging.error(f'An unexpected error occurred: {e}')
return None
调用函数
url = 'http://www.baidu.com' # 示例 URL
result = fetch_html(url)
if result is not None:
print(result)
urllib.robotparser
urllib.robotparser模块专注于解析robots.txt文件。此文件是网站用来指导搜索引擎抓取页面的文本,通过它网站拥有者可以声明哪些页面允许被抓取,哪些禁止。这为搜索引擎提供了一种遵循的规范以尊重网站的抓取权限设定。
示例:使用 urllib.robotparser 解析 robots.txt
from urllib.robotparser import RobotFileParser
def can_fetch_url(robots_url, target_url):
try:
rp = RobotFileParser()
rp.set_url(robots_url)
rp.read()
can_fetch = rp.can_fetch("*", target_url)
return can_fetch
except Exception as e:
logging.error(f"An error occurred while checking the robots.txt: {e}")
return False
调用函数
robots_url = "http://www.baidu.com/robots.txt"
target_url = "http://www.baidu.com/some/page.html"
result = can_fetch_url(robots_url, target_url)
print(result)