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

news/2024/9/24 18:53:54/

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

urllib_2">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。


http://www.ppmy.cn/news/1499850.html

相关文章

2.6基本算法之动态规划6045:开餐馆

描述 北大信息学院的同学小明毕业之后打算创业开餐馆.现在共有n 个地点可供选择。小明打算从中选择合适的位置开设一些餐馆。这 n 个地点排列在同一条直线上。我们用一个整数序列m1, m2, ... mn 来表示他们的相对位置。由于地段关系,开餐馆的利润会有所不同。我们用pi 表示在m…

Vue Router高级用法:动态路由与导航守卫

Vue Router是Vue.js官方的路由管理器,它和Vue.js的核心深度集成,让构建单页应用变得轻而易举。 动态路由 动态路由允许你在路由路径中使用变量,这些变量可以从实际的URL中获取,并传递给对应的路由组件。 定义动态路由 在route…

el-menu根据多层树形结构递归遍历展示菜单栏

文章目录 前提条件假设菜单等级只有两个等级结果如下所示 但是如果菜单等级超过两个等级或者多个等级的话App.vueMenuItems.vue结果如下所示 关于遍历时图标前的展示后续完善关于点击路由跳转参考element plus的官网即可 前提条件 package.json如下所示,这是一个Vi…

redis高可用之主从复制、哨兵以及Cluster集群

目录 一、Redis主从复制 1)主从复制的作用 2)主从复制流程 3)搭建Redis主从复制 1、部署redis服务器 2、修改Redis配置文件(所有节点操作) 3、验证主从复制结果 二、哨兵模式 1)哨兵的作用 2&…

Rabbitmq从入门到精通

文章目录 1. RabbitMQ简介1.2 组件介绍1.1 消息队列的选择1.2 Docker 安装rabbitmq1.4 消息应答机制 2.1 交换机类型2.1 direct2.2 fanout2.3 topic:2.4header 3 RabbitMQ集群搭建3.1docker 搭建 rabbitmq集群 4 死信队列4.1 ttl消息过期:生产者添加延迟…

在CentOS 7上安装和使用PostgreSQL的方法

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 关系数据库管理系统是许多网站和应用程序的关键组成部分。它们提供了一种结构化的方式来存储、组织和访问信息。 PostgreSQL&…

qt设置过滤器

1.创建事件过滤器类,在主窗口中安装事件过滤器 class PasteFilter : public QObject {Q_OBJECTpublic:PasteFilter(QObject *parent nullptr) : QObject(parent) {}protected:bool eventFilter(QObject *obj, QEvent *event) override {if (event->type() QEv…

上传文件传参 pc端vue的formData

formData let formData new FormData(); formData.append("file", blob, ref ".png"); //添加参数并且重新命名文件名称 if(ref.toString().indexOf(qrcode) > 0) formData.append(noStbg, true)//添加参数 uploadType(formData, sour…