「Python系列」Python urllib库(操作网页URL对网页的内容进行抓取处理)

本文涉及的产品
性能测试 PTS,5000VUM额度
容器镜像服务 ACR,镜像仓库100个 不限时长
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
简介: `urllib` 是 Python 的一个标准库,用于打开和读取 URLs。它提供了一组模块,允许你以编程方式从网络获取数据,如网页内容、文件等。

一、Python urllib

urllib 是 Python 的一个标准库,用于打开和读取 URLs。它提供了一组模块,允许你以编程方式从网络获取数据,如网页内容、文件等。urllib 包括以下模块:

  1. urllib.request:用于打开和读取 URLs。
  2. urllib.error:定义了在打开和读取 URLs 时可能引发的异常。
  3. urllib.parse:用于解析 URLs 和 URL 组件。
  4. urllib.robotparser:用于解析 robots.txt 文件,该文件指示网络爬虫哪些页面可以或不可以抓取。

下面是一些使用 urllib 模块的基本示例:

1. 使用 urllib.request 打开和读取 URL

使用 urllib.request 的 urlopen 方法来打开一个 URL,语法格式如下:

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 设置。

urllib.request 是 Python 的一个标准库模块,用于打开和读取 URL。这个模块提供了一个高级接口,使得你可以轻松地以编程方式从网络获取数据。它支持常见的网络协议,如 HTTP、HTTPS、FTP 等,并允许你定制请求头、处理重定向、使用代理等。

下面是一些使用 urllib.request 的基本示例:

打开并读取 URL

import urllib.request

url = 'http://example.com'
with urllib.request.urlopen(url) as response:
    html_content = response.read()
    print(html_content)

设置请求头

import urllib.request

url = 'http://example.com'
req = urllib.request.Request(url, headers={
   'User-Agent': 'Mozilla/5.0'})
with urllib.request.urlopen(req) as response:
    html_content = response.read()
    print(html_content)

处理重定向

urllib.request 默认会处理 HTTP 重定向。

import urllib.request

url = 'http://example.com/redirect'
with urllib.request.urlopen(url) as response:
    redirected_url = response.geturl()
    html_content = response.read()
    print(redirected_url)
    print(html_content)

使用代理

你可以通过创建一个自定义的 OpenerDirector 来使用代理。

import urllib.request
from urllib.request import ProxyHandler, build_opener

proxy_handler = ProxyHandler({
   'http': 'http://proxy.example.com:8080'})
opener = build_opener(proxy_handler)

url = 'http://example.com'
with opener.open(url) as response:
    html_content = response.read()
    print(html_content)

错误处理

使用 try...except 来处理可能出现的异常,如 URLErrorHTTPError

import urllib.request
from urllib.error import URLError, HTTPError

url = 'http://invalid-url.com'

try:
    with urllib.request.urlopen(url) as response:
        html_content = response.read()
        print(html_content)
except URLError as e:
    print('We failed to reach a server.')
    print('Reason:', e.reason)
except HTTPError as e:
    print('The server couldn\'t fulfill the request.')
    print('Error code:', e.code)
    print('Error message:', e.read())

发送 POST 请求

import urllib.request
import urllib.parse

url = 'http://example.com/post'
data = urllib.parse.urlencode({
   'key1': 'value1', 'key2': 'value2'}).encode()

req = urllib.request.Request(url, data, method='POST')
with urllib.request.urlopen(req) as response:
    html_content = response.read()
    print(html_content)

urllib.request 提供了许多其他功能和选项,可以满足大多数基本的网络请求需求。然而,对于更复杂的用例,如使用 OAuth 进行身份验证、发送 JSON 数据、处理 cookies 等,你可能需要查看更高级的库,如 requestsrequests 库提供了一个更加友好和强大的 API,使得发送 HTTP 请求变得更加简单和直观。

2. 使用 urllib.parse 解析 URL

urllib.parse 是 Python 标准库中的一个模块,它提供了用于解析 URL 的各种功能。这个模块允许你拆分、合并、引用和转义 URL 组件。以下是 urllib.parse 的一些常用功能:

拆分 URL

使用 urlparse() 函数可以将 URL 字符串拆分为组件。

from urllib.parse import urlparse

url = 'http://www.example.com/path?name=value#fragment'
parsed = urlparse(url)

print(parsed.scheme)    # http
print(parsed.netloc)    # www.example.com
print(parsed.path)      # /path
print(parsed.params)    # None
print(parsed.query)     # name=value
print(parsed.fragment)  # fragment

合并 URL

使用 urlunparse() 函数可以将组件重新组合成 URL 字符串。

from urllib.parse import urlunparse

parts = ('http', 'www.example.com', '/path', None, 'name=value', 'fragment')
url = urlunparse(parts)

print(url)  # http://www.example.com/path?name=value#fragment

引用和转义 URL

quote()unquote() 函数用于对 URL 字符串中的特殊字符进行转义和解转义。

from urllib.parse import quote, unquote

# 转义
escaped_string = quote('Hello, World!')
print(escaped_string)  # Hello%2C%20World%21

# 解转义
unescaped_string = unquote(escaped_string)
print(unescaped_string)  # Hello, World!

解析查询字符串

parse_qs()parse_qsl() 函数用于解析 URL 查询字符串。

from urllib.parse import parse_qs, parse_qsl

query_string = 'key1=value1&key2=value2'

# 返回一个字典,键是唯一的,如果有多个相同的键,则它们的值是一个列表
query_dict = parse_qs(query_string)
print(query_dict)  # {'key1': ['value1'], 'key2': ['value2']}

# 返回一个列表,每个元素都是一个元组,包含键和值
query_list = parse_qsl(query_string)
print(query_list)  # [('key1', 'value1'), ('key2', 'value2')]

构建查询字符串

urlencode() 函数用于将字典或元组列表转换为查询字符串。

from urllib.parse import urlencode

params = {
   'key1': 'value1', 'key2': 'value2'}
query_string = urlencode(params)

print(query_string)  # key1=value1&key2=value2

urllib.parse 模块还提供了其他一些功能,如 urljoin()(用于连接基础 URL 和相对路径),urldefrag()(用于移除 URL 的片段部分),以及 unquote_plus()(用于处理空格和其他特殊字符)。

在处理 URL 时,urllib.parse 模块是非常有用的,它可以帮助你解析、构建和操纵 URL。

3. 使用 urllib.error 处理异常

urllib.error 是 Python 的一个标准库模块,它定义了与 urllib.request 一起使用的异常类。当使用 urllib.request 来打开或读取 URL 时,可能会遇到各种错误,例如网络问题、无效的 URL 或服务器错误。urllib.error 模块提供了异常类,以帮助你更好地处理这些错误。

以下是 urllib.error 模块中定义的一些异常类:

URLError

这是一个基础异常类,用于处理与 URL 相关的错误。当你尝试打开一个 URL 但由于某种原因失败时,通常会抛出这个异常。

   from urllib.error import URLError
   from urllib.request import urlopen

   try:
       response = urlopen('http://invalid-url')
   except URLError as e:
       print(f"URL Error: {e.reason}")

HTTPError

这是一个特定于 HTTP 错误的异常类,继承自 URLError。当服务器返回一个 HTTP 错误代码(如 404 Not Found)时,会抛出此异常。

   from urllib.error import HTTPError
   from urllib.request import urlopen

   try:
       response = urlopen('http://example.com/nonexistent')
   except HTTPError as e:
       print(f"HTTP Error: {e.code} {e.reason}")

ContentTooShortError

当从 URL 读取的内容比预期的要短时,会抛出此异常。这通常在使用 urlopen 与文件类对象(如 urlopen(url, data))一起使用时发生。

RequestError

当请求中发生错误时,会抛出此异常。它通常不直接由用户处理,而是作为其他更具体错误的基类。

处理 urllib.request 产生的异常时,通常使用 try...except 块来捕获并处理这些异常。你可以根据异常的类型执行不同的操作,如记录错误、重试请求或向用户显示友好的错误消息。

例如:

from urllib.error import URLError, HTTPError
from urllib.request import urlopen

try:
    response = urlopen('http://example.com')
    # 处理响应...
except HTTPError as e:
    # 处理 HTTP 错误...
    print(f"HTTP Error: {e.code} {e.reason}")
except URLError as e:
    # 处理其他 URL 错误...
    print(f"URL Error: {e.reason}")

这样,你的代码就能更健壮地处理网络请求中可能出现的各种错误情况。

4. 使用urllib.robotparser解析 robots.txt文件

urllib.robotparser 是 Python 标准库中的一个模块,它用于解析 robots.txt 文件。robots.txt 是一个放置在网站根目录下的文本文件,用于指示网络爬虫(web crawlers)或搜索引擎机器人(search engine robots)哪些页面可以访问,哪些页面不能访问。

urllib.robotparser 模块提供了一个 RobotFileParser 类,你可以使用这个类来解析 robots.txt 文件,并查询特定的用户代理(user agent)是否允许访问特定的路径。

下面是一个使用 urllib.robotparser 的基本示例:

import urllib.robotparser

# 创建一个 RobotFileParser 实例
rp = urllib.robotparser.RobotFileParser()

# 设置要解析的 robots.txt 文件的 URL(通常是一个本地文件路径或网络 URL)
# 这里我们使用一个示例的字符串来代替实际的文件内容
robots_txt_content = """
User-agent: *
Disallow: /private/
Disallow: /temp/

User-agent: Googlebot
Allow: /temp/
"""

# 使用 set_url 方法来设置要解析的内容,通常这是一个 URL,但也可以是字符串内容
rp.set_url("http://example.com/robots.txt", robots_txt_content)

# 检查特定用户代理是否可以访问特定路径
user_agent = "Googlebot"
path = "/temp/somefile.html"
if rp.can_fetch(user_agent, path):
    print(f"{user_agent} is allowed to fetch {path}")
else:
    print(f"{user_agent} is not allowed to fetch {path}")

# 对于不在 robots.txt 中明确允许的路径,默认是允许的
path = "/public/index.html"
if rp.can_fetch(user_agent, path):
    print(f"{user_agent} is allowed to fetch {path} (by default)")
else:
    print(f"{user_agent} is not allowed to fetch {path} (by default)")

在这个示例中,我们创建了一个 RobotFileParser 实例,并使用 set_url 方法来设置要解析的 robots.txt 文件内容。然后,我们使用 can_fetch 方法来检查特定的用户代理(例如 "Googlebot")是否可以访问特定的路径(例如 "/temp/somefile.html")。

请注意,urllib.robotparser 模块并不提供网络功能来自动下载 robots.txt 文件。你需要手动获取 robots.txt 文件的内容,并将其传递给 set_url 方法。如果你想要从网络上下载并解析 robots.txt 文件,你需要使用其他工具,如 urllib.request

二、相关链接

  1. Python下载安装中心
  2. Python官网
  3. Python软件下载
  4. 「Python系列」Python简介及案例
  5. 「Python系列」Python基础语法/数据类型
  6. 「Python系列」Python解释器
  7. 「Python系列」Python运算符
  8. 「Python系列」Python数据结构
  9. 「Python系列」Python元组
  10. 「Python系列」Python集合
  11. 「Python系列」Python列表
相关文章
|
1月前
|
数据采集 UED Python
如何应对动态图片大小变化?Python解决网页图片截图难题
随着互联网技术的发展,电商平台如京东(JD.com)广泛采用动态内容加载技术,给爬虫获取商品图片带来挑战:图片无法直接保存,尺寸动态变化,且存在反爬机制。本文介绍如何利用Python结合代理IP、多线程技术解决这些问题,通过Selenium和Pillow库实现动态网页图片的屏幕截图,有效绕过反爬措施,提升数据抓取效率和稳定性。具体步骤包括设置代理IP、使用Selenium抓取图片、多线程提升效率以及设置cookie和user-agent伪装正常用户。实验结果显示,该方法能显著提升抓取效率,精准截图保存图片,并成功绕过反爬机制。
|
2月前
|
移动开发 Python Windows
python编程获取网页标题title的几种方法及效果对比(源代码)
python编程获取网页标题title的几种方法及效果对比(源代码)
|
22天前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
8天前
|
数据采集 Web App开发 iOS开发
如何使用 Python 语言的正则表达式进行网页数据的爬取?
使用 Python 进行网页数据爬取的步骤包括:1. 安装必要库(requests、re、bs4);2. 发送 HTTP 请求获取网页内容;3. 使用正则表达式提取数据;4. 数据清洗和处理;5. 循环遍历多个页面。通过这些步骤,可以高效地从网页中提取所需信息。
|
19天前
|
数据采集 Python
python爬虫抓取91处理网
本人是个爬虫小萌新,看了网上教程学着做爬虫爬取91处理网www.91chuli.com,如果有什么问题请大佬们反馈,谢谢。
27 4
|
25天前
|
云计算 Python
用python给你写个简单的计算器功能网页啊
这张图片展示了阿里巴巴集团的组织架构图,涵盖了核心电商、云计算、数字媒体与娱乐、创新业务等主要板块,以及各板块下的具体业务单元和部门。
|
20天前
|
数据采集 Java Python
如何用Python同时抓取多个网页:深入ThreadPoolExecutor
在信息化时代,实时数据的获取对体育赛事爱好者、数据分析师和投注行业至关重要。本文介绍了如何使用Python的`ThreadPoolExecutor`结合代理IP和请求头设置,高效稳定地抓取五大足球联赛的实时比赛信息。通过多线程并发处理,解决了抓取效率低、请求限制等问题,提供了详细的代码示例和解析方法。
如何用Python同时抓取多个网页:深入ThreadPoolExecutor
|
1月前
|
iOS开发 MacOS Python
Python编程小案例—利用flask查询本机IP归属并输出网页图片
Python编程小案例—利用flask查询本机IP归属并输出网页图片
|
27天前
|
前端开发 Python
帮我用python作为网页前端输出“hallow world
帮我用python作为网页前端输出“hallow world
|
1月前
|
JSON API 开发者
深入解析Python网络编程与Web开发:urllib、requests和http模块的功能、用法及在构建现代网络应用中的关键作用
深入解析Python网络编程与Web开发:urllib、requests和http模块的功能、用法及在构建现代网络应用中的关键作用
15 0