爬虫基本库的使用之使用urllib

在Python的爬虫开发领域,urllib是一个非常重要的基础库。它提供了丰富的接口来发送HTTP请求并处理响应,非常适合初学者以及需要快速实现HTTP请求的开发者。本文将详细介绍如何使用urllib库进行基本的网络爬虫开发。

1、urllib库简介

urllib是Python标准库中用于处理URL的模块集合,包含多个模块,如urllib.request、urllib.parse、urllib.error等。其中,urllib.request用于发送HTTP请求,urllib.parse用于解析URL,urllib.error用于处理请求过程中出现的异常。

import urllib.request  
  
# 目标URL  
url = 'http://example.com'  
  
# 发送GET请求  
response = urllib.request.urlopen(url)  
  
# 读取响应内容  
html = response.read().decode('utf-8')  
  
# 打印响应内容  
print(html)  
  
# 关闭响应对象  
response.close() 
  
# 目标URL  
url = 'http://example.com'  
  
# 发送GET请求  
response = urllib.request.urlopen(url)  
  
# 读取响应内容  
html = response.read().decode('utf-8')  
  
# 打印响应内容  
print(html)  
  
# 关闭响应对象  
response.close()
发送POST请求
python
import urllib.request  
import urllib.parse  
  
# 目标URL  
url = 'http://example.com/login'  
  
# POST数据  
data = {  
    'username': 'your_username',  
    'password': 'your_password'  
}  
  
# 将数据编码为字节串  
data = urllib.parse.urlencode(data).encode('utf-8')  
  
# 创建一个请求对象  
request = urllib.request.Request(url, data=data, method='POST')  
  
# 添加请求头  
request.add_header('Content-Type', 'application/x-www-form-urlencoded')  
  
# 发送请求  
response = urllib.request.urlopen(request)  
  
# 读取响应内容  
html = response.read().decode('utf-8')  
  
# 打印响应内容  
print(html)  
  
# 关闭响应对象  
response.close()

2、处理异常

在发送HTTP请求时,可能会遇到各种网络问题或服务器错误,因此使用try...except语句来捕获并处理异常是非常必要的。

from urllib.request import urlopen  
from urllib.error import URLError, HTTPError  
  
try:  
    url = 'http://example.com'  
    response = urlopen(url)  
    html = response.read().decode('utf-8')  
    print(html)  
except HTTPError as e:  
    print('HTTP Error:', e.code, e.reason)  
except URLError as e:  
    print('URL Error:', e.reason)  
finally:  
    if 'response' in locals():  
        response.close()
使用urllib.parse解析URL

3.解析链接

3.1urlparse 与 urlsplit

urlparse 和 urlsplit 函数用于将URL分解为不同的组件。它们的主要区别在于urlparse会将查询参数(query string)进一步分割为字典,而urlsplit则将其视为一个整体字符串。

from urllib.parse import urlparse, urlsplit  
  
url = 'http://www.example.com:80/path?query=string#fragment'  
parsed_url = urlparse(url)  
split_url = urlsplit(url)  
  
print(parsed_url)  
print(split_url)

3.2 urlunparse 与 urlunsplit

这两个函数是urlparse和urlsplit的逆操作,用于将URL的各个组件重新组合成一个完整的URL字符串。

from urllib.parse import urlunparse, urlunsplit  
  
# 假设已有解析后的组件  
components = ('http', 'www.example.com', '/path', '', 'query=string', 'fragment')  
reconstructed_url = urlunparse(components)  
  
# 对于urlsplit,需要省略查询参数的字典形式  


split_components = ('http', 'www.example.com', '/path', 'query=string', 'fragment')  
reconstructed_split_url = urlunsplit(split_components)  
  
print(reconstructed_url)  
print(reconstructed_split_url)

3.3 urljoin

urljoin函数用于将基本URL(base URL)和另一个URL(通常是相对路径)合并成一个完整的URL。

from urllib.parse import urljoin  
  
base_url = 'http://www.example.com/path'  
relative_url = 'newpath/file.html'  
full_url = urljoin(base_url, relative_url)  
  
print(full_url)  # 输出: http://www.example.com/newpath/file.html

3.4 urlencode

urlencode函数用于将字典或包含两个元素的元组(键和值)的列表转换为经过URL编码的查询字符串。

from urllib.parse import urlencode  
  
params = {'query': 'string', 'limit': 10}  
encoded_params = urlencode(params)  
  
print(encoded_params)  # 输出: query=string&limit=10

3.5 parse_qs 与 parse_qsl

这两个函数用于解析查询字符串(query string),将其转换为Python数据结构。parse_qs返回字典,其中键是查询参数的名字,值是参数值的列表(因为可能有多个相同的参数名);而parse_qsl返回的是查询参数名和值组成的元组列表。

from urllib.parse import parse_qs, parse_qsl  
  
query_string = 'query=string&limit=10&limit=20'  
parsed_qs = parse_qs(query_string)  
parsed_qsl = parse_qsl(query_string)  
  
print(parsed_qs)  # 输出: {'query': ['string'], 'limit': ['10', '20']}  
print(parsed_qsl)  # 输出: [('query', 'string'), ('limit', '10'), ('limit', '20')]

3.6 quote 与 unquote

quote函数用于对URL中的非ASCII字符和某些特殊字符进行百分比编码(percent-encoding),而unquote则用于对百分比编码的字符串进行解码。

from urllib.parse import quote, unquote  
  
encoded_string = quote('Hello, 世界!')  
decoded_string = unquote(encoded_string)  
  
print(encoded_string)  # 输出类似: Hello%2C%20%E4%B8%96%E7%95%8C%21  
print(decoded_string)  # 输出: Hello, 世界!

urllib是Python中处理HTTP请求和URL解析的强大工具。通过urllib.request,我们可以轻松发送GET和POST请求,并处理响应;通过urllib.parse,我们可以解析、组合和编码URL。

相关推荐
梧桐树04291 小时前
python常用内建模块:collections
python
Dream_Snowar1 小时前
速通Python 第三节
开发语言·python
蓝天星空3 小时前
Python调用open ai接口
人工智能·python
jasmine s3 小时前
Pandas
开发语言·python
郭wes代码3 小时前
Cmd命令大全(万字详细版)
python·算法·小程序
leaf_leaves_leaf3 小时前
win11用一条命令给anaconda环境安装GPU版本pytorch,并检查是否为GPU版本
人工智能·pytorch·python
夜雨飘零13 小时前
基于Pytorch实现的说话人日志(说话人分离)
人工智能·pytorch·python·声纹识别·说话人分离·说话人日志
404NooFound3 小时前
Python轻量级NoSQL数据库TinyDB
开发语言·python·nosql
天天要nx3 小时前
D102【python 接口自动化学习】- pytest进阶之fixture用法
python·pytest
minstbe3 小时前
AI开发:使用支持向量机(SVM)进行文本情感分析训练 - Python
人工智能·python·支持向量机