【Python爬虫开发基础⑦】urllib库的基本使用

news/2024/7/19 8:41:56 标签: python, 爬虫, 开发语言, urllib

专栏python网络爬虫从基础到实战 欢迎订阅!后面的内容会越来越有意思~
往期推荐
【Python爬虫开发基础①】Python基础(变量及其命名规范)
【Python爬虫开发基础②】Python基础(正则表达式)
【Python爬虫开发基础③】Python基础(文件操作方法汇总)
【Python爬虫开发基础④】爬虫原理
【Python爬虫开发基础⑤】HTML概述与基本标签详解
【Python爬虫开发基础⑥】计算机网络基础(Web和HTTP)
上一篇文章已经介绍了爬虫基础中用到的计算机网络的部分,本篇文章来小试牛刀,说一下爬虫用到的第一个库urllib


文章目录


urllib_16">1 什么是urllib

urllib是Python标准库中的一个模块,用于处理URL(Uniform Resource Locator)相关的操作。它提供了一系列函数和类,方便开发人员在Python程序中进行URL请求、数据获取、参数编码等操作。
urllib库包含四个子模块urllib.requesturllib.parseurllib.errorurllib.robotparser

通过urllib库,开发人员可以实现从网络上获取数据、发送HTTP请求、处理URL等功能。它是进行Web开发和网络爬虫编程时常用的工具之一,为Python程序提供了方便和灵活性。


urllibrequest_24">2 urllib.request模块

urllib.request模块是urllib库中的一个子模块,用于发送HTTP请求、获取远程数据和处理URL操作。它提供了一系列函数和类来执行这些操作。

基本用法如下:

  • 导入

由于这个库是python自带的,所以不需要pip install

python">import urllib.request
  • 发送GET请求

在上一篇文章中( 【Python爬虫开发基础⑥】计算机网络基础(Web和HTTP)),我们已经介绍了HTTP报文格式,并且介绍了请求头中开始行的常用方法,下面的GET和POST请求就是其中的方法。
使用urlopen()函数发送HTTP GET请求,并接收服务器返回的数据

python"># 首先定义一个要发送请求的URL
url = 'https://csdn.net'

# 使用urlopen发送get请求
response = urllib.request.urlopen(url)
  • 获取服务器响应

上面一步通过response接收了服务器的响应,可以使用.read()方法读取服务器响应的内容,并将其存储在变量中。

python">content = response.read()
  • 处理响应内容

可以对获取到的响应内容进行进一步的处理,例如解码字节流、解析HTML等操作。

python"># 将获取到的响应解码为utf-8格式
content = content.urldecode('utf-8')
  • 发送POST请求

如果需要发送POST请求,可以使用urllib.parse.urlencode()函数编码POST请求的参数,并使用.data属性传递给请求对象

python">import urllib.parse

data = urllib.parse.urlencode({"key": "value"}).encode()
request = urllib.request.Request(url, data=data, method="POST")  # 创建POST请求对象
response = urllib.request.urlopen(request)  # 发送POST请求并获取响应
  • 设置请求头

这一个操作尤为关键,在一般情况下,为了伪装成一个浏览器,需要设置请求时发送的UA。可以通过创建Request对象,并设置请求头信息发送定制化的请求,例如User-Agent、Referer等。

python">headers = {"User-Agent": "Mozilla/5.0"}
request = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(request)

urllibparse_85">3 urllib.parse模块

urllib.parse 模块是 Python 标准库中的一部分,用于解析和操作 URL。它提供了一组函数,可以将 URL 拆分为各个组成部分,或者将各个组成部分合并为完整的 URL。

  • 解析 URL

urlparse(url, scheme='', allow_fragments=True):解析 URL 字符串并返回一个具名元组,包含 URL 的各个组成部分。

python">from urllib.parse import urlparse

url = 'https://www.example.com/path?query=hello#fragment'
parsed_url = urlparse(url)

print(parsed_url.scheme)       # 输出:https
print(parsed_url.netloc)       # 输出:www.example.com
print(parsed_url.path)         # 输出:/path
print(parsed_url.query)        # 输出:query=hello
print(parsed_url.fragment)     # 输出:fragment
  • 构建 URL

urlunparse(parts):将 URL 的各个部分组合成完整的 URL 字符串。

python">from urllib.parse import urlunparse

parts = ('https', 'www.example.com', '/path', '', 'query=hello', 'fragment')
url = urlunparse(parts)

print(url)    # 输出:https://www.example.com/path?query=hello#fragment
  • 编码和解码 URL 参数

urlencode(query, doseq=False, safe='', encoding=None, errors=None):将字典或元组列表形式的查询参数编码为 URL 字符串。
parse_qs(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace', max_num_fields=None):将 URL 查询字符串解析为字典形式的查询参数。

python">from urllib.parse import urlencode, parse_qs

params = {'key': 'value', 'foo': ['bar', 'baz']}
encoded_params = urlencode(params)

print(encoded_params)    # 输出:key=value&foo=bar&foo=baz

decoded_params = parse_qs(encoded_params)

print(decoded_params)    # 输出:{'key': ['value'], 'foo': ['bar', 'baz']}
  • 编码和解码 URL 特殊字符

quote(string, safe='/', encoding=None, errors=None):将字符串中的特殊字符进行 URL 编码。
unquote(string, encoding='utf-8', errors='replace'):将 URL 编码的字符串进行解码,恢复特殊字符的原始形式。

python">from urllib.parse import quote, unquote

string = 'Hello World!@#$'
quoted_string = quote(string)

print(quoted_string)    # 输出:Hello%20World%21%40%23%24

unquoted_string = unquote(quoted_string)

print(unquoted_string)  # 输出:Hello World!@#$

urlliberror_152">4 urllib.error模块

urllib.error 模块是 Python 标准库中的一部分,用于处理与 urllib 请求和打开 URL 相关的错误。它提供了一些异常类,用于捕获和处理在使用 urllib 过程中可能出现的异常情况。

  • 异常类

URLError:用于处理 URL 相关的错误,如无法连接到服务器、网络问题等。
HTTPError:继承自 URLError,用于处理 HTTP 相关的错误,如页面不存在(404)、权限问题等。

  • 捕获异常

使用 try-except 结构可以捕获并处理 urllib.error 模块抛出的异常。

python">from urllib import request, error

url = 'https://www.example.com/404'

try:
    response = request.urlopen(url)
except error.HTTPError as e:
    print(f'HTTP Error: {e.code} - {e.reason}')
except error.URLError as e:
    print(f'URL Error: {e.reason}')

我们尝试打开一个不存在的 URL 'https://www.example.com/404',如果出现 HTTPError 异常,则打印 HTTP 响应状态码和原因;如果出现 URLError 异常,则打印 URL 错误原因。

  • 获取错误信息

URLErrorHTTPError 异常对象提供了一些属性来获取更详细的错误信息。

python">from urllib import request, error

url = 'https://www.example.com/404'

try:
    response = request.urlopen(url)
except error.HTTPError as e:
    print(f'HTTP Error: {e.code} - {e.reason}')
    print(e.headers)
except error.URLError as e:
    print(f'URL Error: {e.reason}')

如果捕获到 HTTPError 异常,我们可以通过 e.codee.reason 分别获取响应的状态码和原因字符串,通过 e.headers 获取响应的头部信息。


urllibrobotparser__199">5 urllib.robotparser 模块

urllib.robotparser 模块是 Python 标准库中的一部分,用于解析和分析 robots.txt 文件。robots.txt 是一个遵循 Robots Exclusion Protocol(机器人排除协议)的文本文件,用于指示网络爬虫哪些页面可以访问,哪些页面需要排除访问。urllib.robotparser 模块提供了一个 RobotFileParser 类,用于解析 robots.txt 文件并提供方法来判断一个 URL 是否允许被爬取。

  • 创建 RobotFileParser 对象

使用 RobotFileParser 类的构造函数可以创建一个对象,并使用 set_url() 方法传入 robots.txt 文件的 URL。

python">from urllib.robotparser import RobotFileParser

url = 'http://www.example.com/robots.txt'

parser = RobotFileParser()
parser.set_url(url)
  • 读取和分析 robots.txt 文件

使用 read() 方法从 robots.txt 文件中读取内容,并使用 parse() 方法解析读取的内容。

python">from urllib.robotparser import RobotFileParser

url = 'http://www.example.com/robots.txt'

parser = RobotFileParser()
parser.set_url(url)
parser.read()
parser.parse()
  • 判断 URL 是否允许访问

使用 can_fetch() 方法判断给定的 User-Agent 是否允许访问特定的 URL。

python">from urllib.robotparser import RobotFileParser

url = 'http://www.example.com/robots.txt'
user_agent = 'MyCrawler'
path = '/path/to/page'

parser = RobotFileParser()
parser.set_url(url)
parser.read()
parser.parse()

if parser.can_fetch(user_agent, path):
    print(f'{user_agent} is allowed to access {path}')
else:
    print(f'{user_agent} is not allowed to access {path}')

首先创建一个 RobotFileParser 对象,并设置 robots.txt 文件的 URL,然后读取和解析该文件。最后,使用 can_fetch() 方法判断给定的 User-Agent 是否允许访问特定的 URL,并进行相应的输出。


通过urllib库,我们可以实现从网络上获取数据、发送HTTP请求、处理URL等功能。它是进行Web开发和网络爬虫编程时常用的工具之一,为Python程序提供了方便和灵活性。


http://www.niftyadmin.cn/n/466235.html

相关文章

smart Java——Netty实战(上):select/poll/epoll、NIOReactor模型

文章目录 1.多路复用——select、poll、epoll底层原理2.NIOReactor模型(1)单Reactor单线程模型(2)单Reactor多线程模型(3)主从Reactor多线程模型(Netty) 3.Netty核心组件&#xff08…

【金融量化】购买了多只基金,如何进行资产分配?如何基金组合配置?

【金融量化】购买了多只基金,如何进行资产分配?如何基金组合配置? 1 概念 FOF(Fund of fund),即基金中基金,是一种投资于其他投资基金的基金。说白了,就是基金经理是买入多只基金取…

Fast DDS(15)典型用例Typical Use-Cases

15 典型用例Typical Use-Cases FastDDS具有高度可配置性,允许在大量场景中使用。本次提供了处理分布式系统时的典型用例的配置示例: 部署于WIFI上的FastDDS,介绍了一个案例,其中通过多播通信进行发现是一个挑战。此示例显示如何: 使用远程参与者的地址端口对address-port …

Nginx服务性能和安全优化

目录 一、配置Nginx隐藏版本相关信息 1.隐藏版本号 2.修改版本号及相关信息 ​编辑​编辑 二、修改Nginx运行时的属主和属组 三、配置Nginx网页缓存时间 四、配置Nginx站点日志分割 五、设置Nginx长连接及超时时间 六、配置Nginx网页压缩 七、配置Nginx防盗链 1.模拟…

神经网络原理(2)

斯坦福大学的印度学生、机器学习爱好者 PararthShah 在2012年12月22日的使用买芒果的例子解释了神经网络,简单来说就是:如果你需要选芒果,但不知道什么样的芒果最好吃,一个简单粗暴的方法是尝遍所有的芒果,然后总结出个…

Redis使用Bitmap实现数据统计

一、概念 什么是二值状态?二值状态就是元素只有0和1这两种情况,比如在签到的场景中只有签到和未签到两种,或者登陆的场景中只有已登录和未登录的情况。 Bitmap 的底层数据结构用的是 String 类型的 SDS 数据结构来保存位数组,Redis 把每个…

如何搭建产品知识库?让产品知识库管理更有序高效!

在现代企业中,一个完善的产品知识库对于提升团队的工作效率和产品质量至关重要。本文将介绍如何搭建一个高效的产品知识库,并提供一些管理方法,以使知识库的管理更有序、高效。 随着科技的不断进步和市场竞争的加剧,企业对于高效…

采样中断服务程序原理

采样中断服务程序框图如图2-6所示。采样中断服务程序主要包括采样计算,TV、TA断线自检和保护起动元件三个部分。同时还可以根据不同的保护特点,增加一些检测被保护系统状态的程序。 一、采样计算概述 进入采样中断服务程序,首先进…