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

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



1 什么是urllib

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

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


2 urllib.request模块

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

基本用法如下:

  • 导入

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

import urllib.request
  • 发送GET请求

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

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

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

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

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

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

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

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

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等。

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

3 urllib.parse模块

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

  • 解析 URL

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

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 字符串。

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 查询字符串解析为字典形式的查询参数。

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 编码的字符串进行解码,恢复特殊字符的原始形式。

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!@#$

4 urllib.error模块

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

  • 异常类

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

  • 捕获异常

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

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 异常对象提供了一些属性来获取更详细的错误信息。

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 获取响应的头部信息。


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。

from urllib.robotparser import RobotFileParser

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

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

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

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。

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程序提供了方便和灵活性。

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
### 回答1: 为了开发 Python 爬虫,你需要先学习 Python 编程语言。一旦你熟悉了 Python基础知识,你就可以使用 Python 标准中的 `urllib` 模块来打开和读取网页内容。但是,如果你要爬取的网站使用了 JavaScript,你就需要使用更高级的,比如 `Selenium` 或者 `Beautiful Soup`。这些可以解析网页并提取你感兴趣的信息。 如果你想爬取大量的数据,你可能需要考虑使用分布式爬虫。这种爬虫由多个节点组成,可以同时爬取多个网站。有许多 Python 可以帮助你实现分布式爬虫,比如 `Scrapy` 和 `Apache Nutch`。 总之,开发 Python 爬虫需要学习 Python 编程语言,了解网页结构和数据提取方法,并选择合适的和工具。 ### 回答2: Python爬虫开发分为以下几个步骤: 1. 确定需求和目标:首先需要明确需要爬取的网站或数据,并确定所需的信息和数据类型。这可以帮助我们选择合适的爬虫框架和工具。 2. 安装Python环境和依赖:确保在本地安装Python解释器,并安装相关的第三方,比如Scrapy、Beautiful Soup、Requests等。 3. 分析网站结构:通过查看网页源代码,分析网站的结构和数据位置。这可以帮助我们制定爬取策略和选择合适的解析方法。 4. 编写爬虫代码:使用选择的爬虫框架或,编写爬虫代码。代码中需要包含以下几个核心部分: - 发送请求:使用HTTP请求发送请求,获取网页内容。 - 解析网页:使用HTML解析解析网页,提取需要的数据。 - 保存数据:将提取到的数据保存到本地文件或数据中。 5. 调试和测试:运行爬虫代码,检查是否能够正确提取和保存数据。如果出现问题,通过日志和调试工具进行排查和修复。 6. 遵守爬虫规则和道德:在开发爬虫的过程中,需要遵守网站的爬虫规则和道德准则。避免给网站带来过大的压力或侵犯用户隐私。 7. 定期维护和更新:定期检查和更新爬虫代码,保持其正常运行并适应网站结构的变化。 总结来说,开发Python爬虫需要确定需求和目标、安装环境和依赖、分析网站结构、编写爬虫代码、调试和测试、遵守规则和道德、定期维护和更新等步骤。熟悉并掌握这些步骤,可以帮助我们开发高效、可靠的Python爬虫

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

为梦而生~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值