爬虫基本库的使用之使用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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/51071.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装依赖 npm install idealTree:lib: sill idealTree buildDeps 卡着不动

我一直怀疑是网络问题,因为等了很久也能安装成功,就是时间比较长,直到现在完全受不了了,决定好好整治下这个问题! 1、执行命令 npm config get userconfig 查看配置文件所在位置,将其删除。 2、执行 n…

VS+opencv+环境配置

下载opencv库。 版本 - OpenCV 下载完了是一个exe文件,(可以更换目录)直接双击,也就是压缩。 vs配置: 调试-调试属性 点编辑,加入这两个,路径根据自己的opencv库 3、链接器 测试:…

在Postman中引用JS库

前言 在做接口测试时,出于安全因素,请求参数需要做加密或者加上签名才能正常请求,例如:根据填写的请求参数进行hash计算进行签名。postman作为主流的接口调试工具也是支持请求预处理的,即在请求前使用JavaScript脚本对…

windows SSH免密连接ubuntu

前提windows 和linux系统都安装了openssh服务 Linux(安装OPENSSH服务):sudo apt-get install openssh-server Windows:自己百度吧 1.生成Windows公钥 Windows的CMD中执行:ssh-keygen -t rsa,执行过程中直接…

Linux编程:使用 strip 命令优化 ELF 文件大小

0. 概要 在软件开发过程中,经常需要处理各种各样的可执行文件和共享库。 为了提高系统的性能和减少磁盘占用空间,我们可能会对这些文件进行优化。其中之一就是使用 strip 命令来移除 ELF (Executable and Linkable Format) 文件中的非必要数据。 本文将…

Conda与Docker:打造无缝开发环境

Conda与Docker:打造无缝开发环境 在现代软件开发中,容器化技术已经成为一种趋势,它能够为应用提供一个一致的运行环境,无论在何处部署。Docker是实现容器化的首选工具之一。而Conda,作为Python和其他科学计算软件的包…

Redis:AOF持久化

1. 简介 以日志的形式来记录每个写操作,将redis执行的每个写操作记录下来(读操作不记录),只需追加文件但不可以改写文件,redis启动之初会重新构建数据,即redis重启后会将日志中的所有写指令重新执行一遍以达…

扰动观测器DOB设计及其MATLAB/Simulink实现

扰动观测器(Disturbance Observer, DOB)是一种在控制系统中用于估计和补偿未知扰动的重要工具,以增强系统的鲁棒性和稳定性。其设计过程涉及系统建模、观测器结构设计以及控制律的调整。 扰动观测器设计原理 系统建模: 首先,需要建立被控对象的数学模型,明确系统的状态变…

APP重启 - C#小函数类推荐

此文记录的是一个应用程序重启的函数。 /***应用程序重启动Austin Liu 刘恒辉Project Manager and Software DesignerE-Mail: lzhdim163.comBlog: http://lzhdim.cnblogs.comDate: 2024-01-15 15:18:00使用方法:AppUtil.RestartApplication(Application.Executa…

2024第八届全国职工职业技能大赛“网络与信息安全管理员”赛项技术文件及任务书

2024第八届全国职工职业技能大赛“网络与信息安全管理员”赛项技术文件及任务书 一、赛项概述:二、竞赛形式:三、竞赛规则四、竞赛样题4.1、第一场4.1.2、实操闯关赛4.2、第二场4.3、第三场 需要培训可以私信博主 欢迎交流学习! [X] &#x1…

【深入理解SpringCloud微服务】深入理解nacos

【深入理解SpringCloud微服务】深入理解nacos Nacos服务注册内存注册表内存注册表的更新通知客户端服务变更、服务同步、健康检查2.x版本nacos的变化 Nacos服务注册 spring-cloud-alibaba-nacos-discovery通过实现spring-cloud-commons规范定义的接口,完成nacos接入…

昇思25天学习打卡营第11天|xiaoyushao

今天分享ResNet50迁移学习。 在实际应用场景中,由于训练数据集不足,所以很少有人会从头开始训练整个网络。普遍的做法是,在一个非常大的基础数据集上训练得到一个预训练模型,然后使用该模型来初始化网络的权重参数或作为固定特征提…

IT服务运营过程中的资源要素管理(至简)

在IT服务运营管理过程中,所有资源要投入正式、连续、稳定运行,要保持规范化的管理和标准化的操作,具体包括工具管理、知识管理、服务台管理与评价、备件库管理等内容。 一、工具管理 1、工具的基本运营。见下表: 工具的基本运营…

论文阅读:Deep_Generic_Dynamic_Object_Detection_Based_on_Dynamic_Grid_Maps

目录 概要 Motivation 整体框架流程 技术细节 小结 不足 论文地址:Deep Generic Dynamic Object Detection Based on Dynamic Grid Maps | IEEE Conference Publication | IEEE Xplore 概要 该文章提出了一种基于动态网格图(Dynamic Grid Maps&a…

pyarmor,一个超厉害的 Python 库

在当今的软件开发领域,代码保护是一个不可忽视的重要环节。pyarmor作为一个强大的Python代码保护工具,可以帮助我们轻松地对Python脚本进行加密和授权控制,确保源码的安全。本文将深入介绍pyarmor的特性、安装方法、基本功能以及高级功能&…

操作系统面试知识点总结4

#来自ウルトラマンメビウス(梦比优斯) 1 文件系统基础 1.1 文件的相关概念 文件是以计算机硬盘为载体的存储在计算机上的信息集合,可以是文本文档、图片、程序。 文件的结构:数据项、记录、文件(有结构文件、无结构式…

橙单前端项目下载编译遇到的问题与解决

今天下载orange-admin前端项目,不过下载下来运行也出现一些问题。 1、运行出现下面一堆错误,如下: 2、对于下面这个错误 error Expected linebreaks to be LF but found CRLF linebreak-style 这就是eslint的报错了,可能是原作者…

Python学习笔记44:游戏篇之外星人入侵(五)

前言 上一篇文章中,我们成功的设置好了游戏窗口的背景颜色,并且在窗口底部中间位置将飞船加载出来了。 今天,我们将通过代码让飞船移动。 移动飞船 想要移动飞船,先要明白飞船位置变化的本质是什么。 通过上一篇文章&#xff0…

新手小白的pytorch学习第十四弹------十一、十二、十三弹卷积神经网络CNN的习题

习题编号目录 No 1No 2No 3No 4No 5No 6No 7No 8No 9No 10No 11No 12No 13 练习题主要就是 写代码,所以这篇文章大部分是代码哟~ No 1 What are 3 areas in industry where computer vision is currently being used? No 2 工业异常检测,目标检测 Sea…