【Python爬虫】:urllib vs requests,性能与功能的天秤对比
发布时间: 2024-10-04 14:17:55 阅读量: 5 订阅数: 13
![【Python爬虫】:urllib vs requests,性能与功能的天秤对比](https://www.delftstack.com/img/Python/feature-image---urllib2-python-3.webp)
# 1. Python爬虫基础入门
Python爬虫是一种自动获取网页内容的程序,广泛应用于网络数据抓取、数据分析等场景。在开始编写爬虫之前,需要了解几个关键概念:URL、HTML、HTTP协议。
URL,统一资源定位符,是互联网上标准资源的地址。理解URL是编写爬虫的基础,因为爬虫需要通过URL来定位网络资源。
HTML,超文本标记语言,是网页内容的标记语言。通过解析HTML,爬虫可以提取出所需的数据。
HTTP,超文本传输协议,是客户端和服务器之间通信的标准协议。爬虫通常使用HTTP协议发送请求和接收响应。
构建一个基础的Python爬虫,可以使用Python内置的`http.client`或第三方库如`requests`。一个简单的爬虫示例如下:
```python
import requests
url = '***'
response = requests.get(url)
print(response.text)
```
这段代码将发送一个GET请求到指定的URL,并打印出响应的HTML内容。这只是爬虫的一个起点,后续章节中将详细介绍如何处理复杂的爬取任务,包括使用`urllib`和`requests`库,处理异常和优化爬虫性能等高级话题。
# 2. urllib库的详细介绍和应用
## 2.1 urllib库的结构和功能
### 2.1.1 urllib库的基本结构和组件
`urllib` 是 Python 的标准库之一,提供了用于处理 URL 的工具。它由几个模块组成:`urllib.request`(用于打开和读取 URL)、`urllib.error`(包含由 urllib.request 抛出的异常)、`urllib.parse`(用于解析 URL)和 `urllib.robotparser`(用于解析 robots.txt 文件)。
- **urllib.request**:这个模块定义了打开和读取 URL 的函数和类。它通常是最常用的部分,因为它允许你像使用文件一样打开网络资源。
- **urllib.error**:这个模块包含由 urllib.request 模块抛出的异常。这使得异常处理更加清晰。
- **urllib.parse**:这个模块实现了将 URL 分解为组成部分以及重新组合 URL 的功能。这对于需要对 URL 的不同部分进行修改的程序来说非常有用。
- **urllib.robotparser**:这个模块可以分析 robots.txt 文件,并确定某些爬虫是否可以抓取 URL。
代码示例展示如何使用 `urllib.parse` 来解析 URL:
```python
from urllib.parse import urlparse, parse_qs
url = '***'
parsed = urlparse(url)
print(f'Scheme: {parsed.scheme}')
print(f'Netloc: {***loc}')
print(f'Path: {parsed.path}')
print(f'Params: {parsed.params}')
print(f'Query: {parsed.query}')
print(f'Fragment: {parsed.fragment}')
print(f'Username: {parsed.username}')
print(f'Password: {parsed.password}')
print(f'Host: {parsed.hostname}')
print(f'Port: {parsed.port}')
query_params = parse_qs(parsed.query)
print('Query params:')
for param, value in query_params.items():
print(f'{param}: {value}')
```
### 2.1.2 urllib库的基本使用方法
`urllib.request` 模块提供了一个名为 `urlopen` 的函数,它接受一个 URL 字符串,并返回一个类似于文件的对象。这使得可以使用 `read()` 方法来读取内容。
```python
from urllib.request import urlopen
url = '***'
with urlopen(url) as response:
data = response.read()
print(data)
```
上面的代码会输出 "***" 页面的 HTML 内容。需要注意的是,`urlopen` 可以接受一个可选的 `data` 参数,该参数允许你传递一个字典形式的数据作为 POST 请求的负载。
除了 `urlopen`,`urllib.request` 还提供了一个 `Request` 类,它允许你更精细地控制请求:
```python
from urllib.request import Request, urlopen
url = '***'
data = {'key': 'value'}
req = Request(url, data=data.encode())
with urlopen(req) as response:
print(response.read())
```
## 2.2 urllib库的高级用法
### 2.2.1 处理URL编码
在发送请求时,可能需要对查询字符串的参数进行编码。这确保了 URL 的有效性和安全性。`urllib.parse` 模块中的 `urlencode` 函数可以完成这一任务。
```python
from urllib.parse import urlencode
params = {'name': 'Guido', 'age': '73'}
encoded_params = urlencode(params)
url = f'***{encoded_params}'
print(url)
```
输出将是 `***`。如果需要对空格进行编码,将其替换为 `%20`,或者使用 `urlencode` 函数时将 `doseq=True` 传递给它。
### 2.2.2 设置代理和Cookies管理
代理服务器的使用在爬虫中很常见,`ProxyHandler` 可以用来设置代理。Cookie 的管理可以使用 `HTTPCookieProcessor`。
```python
from urllib.request import build_opener, ProxyHandler, HTTPCookieProcessor, Request
from urllib.error import URLError
proxies = {
'http': '***',
'https': '***',
}
proxy_support = ProxyHandler(proxies)
cookie_support = HTTPCookieProcessor()
opener = build_opener(proxy_support, cookie_support)
try:
request = Request("***")
response = opener.open(request)
data = response.read()
print(data)
except URLError as err:
print(err.reason)
```
### 2.2.3 处理HTTP异常和重定向
当请求 URL 时,可能会
0
0