Python - 爬虫-网页抓取数据-库urllib

urllib库是Python内置的HTTP请求库。无需额外安装,可以直接使用。urllib库包含以下四个模块。

  • urllib.request - 打开和读取 URL。
  • urllib.error - 包含 urllib.request 抛出的异常。
  • urllib.parse - 解析 URL。
  • urllib.robotparser - 解析 robots.txt 文件。

1、request:最基本的HTTP请求模块,可以模拟请求的发送。只需给该库方法传入URL以及对应的参数,就可以模拟浏览器发送请求了

2、error:异常处理模块。如果出现请求异常,我们可以捕获这些异常,然后进行重试或其他操作保证程序运行不会意外终止

3、parse:一个工具模块。提供了许多URL的处理方法,如拆分、解析、合并等

4、robotparser:主要用来识别网站的robot.txt文件,判断哪些网站可以爬,哪些网站不可以,一般使用较少

一、urllib.request

urllib.request 定义了一些打开 URL 的函数和类,包含授权验证、重定向、浏览器 cookies等。

urllib.request 可以模拟浏览器的一个请求发起过程。

使用 urllib.request 的 urlopen 方法来打开一个 URL,语法格式如下:

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
  • url:url 地址。
  • data:发送到服务器的其他数据对象,默认为 None。
  • timeout:设置访问超时时间。
  • cafile 和 capath:cafile 为 CA 证书, capath 为 CA 证书的路径,使用 HTTPS 需要用到。
  • cadefault:已经被弃用。
  • context:ssl.SSLContext类型,用来指定 SSL 设置。

推荐一个测试网站,用于提交各种请求:http://httpbin.org/,该网站的更多的用法自行搜索

r = urllib.request.urlopen('http://httpbin.org/get')
# 读取response内容
text = r.read()
# http返回状态码和msg
print("http返回状态码:%s;返回msg:%s"%(r.status,r.msg)) # http返回状态码:200;返回msg:OK
r.close()

read() 是读取整个网页内容 

除了 read() 函数外,还包含以下两个读取网页内容的函数:

  • readline() - 读取文件的一行内容

from urllib.request import urlopenmyURL = urlopen("https://www.baidu.com/")
print(myURL.readline()) #读取一行内容
  • readlines() - 读取文件的全部内容,它会把读取的内容赋值给一个列表变量。

from urllib.request import urlopenurl= urlopen("https://www.baidu.com/")
lines = url.readlines()
for line in lines:print(line) 
import urllib
import json
from urllib import robotparser'''
urllib使用
Python urllib 库用于操作网页 URL,并对网页的内容进行抓取处理
'''print('--------返回状态码和msg---------')
r = urllib.request.urlopen('http://httpbin.org/get')
# 读取response内容
text = r.read()
# http返回状态码和msg
print("http返回状态码:%s;返回msg:%s"%(r.status,r.msg)) # http返回状态码:200;返回msg:OK
r.close()print('--------error---------')
url = urllib.request.urlopen("https://www.baidu.com/")
print(url.getcode())   # 200try:url = urllib.request.urlopen("https://www.baidu.com/index11.html")
except urllib.error.HTTPError as e:if e.code == 404:print(404)   # 404print('--------load函数加载的Json内容---------')
# load函数加载json格式内容
obj = json.loads(text)
print(f"load函数加载的Json内容: {obj}") # load函数加载的Json内容: {'args': {}, 'headers': {'Accept-Encoding': 'identity', 'Host': 'httpbin.org', 'User-Agent': 'Python-urllib/3.13', 'X-Amzn-Trace-Id': 'Root=1-67a6c6a7-273842674fbc43b01cdc3fba'}, 'origin': '58.241.18.10', 'url': 'http://httpbin.org/get'}print('--------headers参数---------')
# r.headers是一个HTTPMessage对象
print(r.headers)
# Date: Sat, 08 Feb 2025 02:51:19 GMT
# Content-Type: application/json
# Content-Length: 274
# Connection: close
# Server: gunicorn/19.9.0
# Access-Control-Allow-Origin: *
# Access-Control-Allow-Credentials: true
for key,value in r.headers._headers:print('header每行参数-%s:%s' %(key,value))# header每行参数-Date:Sat, 08 Feb 2025 02:51:19 GMT# header每行参数 - Content - Type: application / json# header每行参数 - Content - Length: 274# header每行参数 - Connection: close# header每行参数 - Server: gunicorn / 19.9.0# header每行参数 - Access - Control - Allow - Origin: *# header每行参数 - Access - Control - Allow - Credentials: trueprint('--------headers参数---------')
ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
# 添加自定义的头信息
req = urllib.request.Request('http://httpbin.org/user-agent')
req.add_header('User-Agent', ua)
# 接受一个urllib.request.Request对象
r = urllib.request.urlopen(req)
resp = json.loads(r.read())
# 打印httpbin网站返回信息里的user-agent
print('网站返回的user-agent:', resp["user-agent"]) # 网站返回的user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3print('--------auth验证登录---------')
auth_handler = urllib.request.HTTPBasicAuthHandler()
auth_handler.add_password(realm='httpbin auth',uri='/basic-auth/admin/admin123',user='admin',passwd='admin123')
opener = urllib.request.build_opener(auth_handler)
urllib.request.install_opener(opener)
r = urllib.request.urlopen('http://httpbin.org')
print(r.read().decode('utf-8'))print('--------GET参数---------')
params = urllib.parse.urlencode({'name': 'admin', 'password': 'admin123'})
url = 'http://httpbin.org/get?%s'%params
with urllib.request.urlopen(url) as r:print(json.load(r)) # {'args': {'name': 'admin', 'password': 'admin123'}, 'headers': {'Accept-Encoding': 'identity', 'Host': 'httpbin.org', 'User-Agent': 'Python-urllib/3.13', 'X-Amzn-Trace-Id': 'Root=1-67a6c6a9-78e0111069464ef205e85476'}, 'origin': '58.241.18.10', 'url': 'http://httpbin.org/get?name=admin&password=admin123'}print('--------POST参数---------')
data = urllib.parse.urlencode({'name': 'admin', 'password': 'admin123'})
data = data.encode()
with urllib.request.urlopen('http://httpbin.org/post', data) as r:print(json.load(r)) # {'args': {}, 'data': '', 'files': {}, 'form': {'name': 'admin', 'password': 'admin123'}, 'headers': {'Accept-Encoding': 'identity', 'Content-Length': '28', 'Content-Type': 'application/x-www-form-urlencoded', 'Host': 'httpbin.org', 'User-Agent': 'Python-urllib/3.13', 'X-Amzn-Trace-Id': 'Root=1-67a6c6aa-3d49564d145ee67e2d47dd95'}, 'json': None, 'origin': '58.241.18.10', 'url': 'http://httpbin.org/post'}print('--------代理IP请求远程URL---------')
proxy_handler = urllib.request.ProxyHandler({'http': 'http://127.0.0.1:8080'})
# proxy_auth_handler = urllib.request.ProxyBasicAuthHandler()
opener = urllib.request.build_opener(proxy_handler)
# r = opener.open('http://httpbin.org/ip')
# print(r.read())print('--------urlparse模块---------')
o = urllib.parse.urlparse('http://httpbin.org/get')
print(o) # ParseResult(scheme='http', netloc='httpbin.org', path='/get', params='', query='', fragment='')print('--------robotparser模块---------')
# 在 Python 3 中,robotparser 是一个独立的模块,而不是 urllib 的一个属性
# 使用 import robotparser 来直接导入 robotparser 模块。
# 或者使用 from urllib import robotparser 来从 urllib 包中导入 robotparser
rp = robotparser.RobotFileParser()
rp.set_url("http://httpbin.org/robots.txt")
print(rp.read())

二、urllib.error

urllib.error 模块为 urllib.request 所引发的异常定义了异常类,基础异常类是 URLError。

urllib.error 包含了两个方法,URLError 和 HTTPError。

URLError 是 OSError 的一个子类,用于处理程序在遇到问题时会引发此异常(或其派生的异常),包含的属性 reason 为引发异常的原因。

HTTPError 是 URLError 的一个子类,用于处理特殊 HTTP 错误例如作为认证请求的时候,包含的属性 code 为 HTTP 的状态码, reason 为引发异常的原因,headers 为导致 HTTPError 的特定 HTTP 请求的 HTTP 响应头。

url = urllib.request.urlopen("https://www.baidu.com/")
print(url.getcode())   # 200try:url = urllib.request.urlopen("https://www.baidu.com/index11.html")
except urllib.error.HTTPError as e:if e.code == 404:print(404)   # 404

三、urllib.parse

urllib.parse 用于解析 URL,格式如下:

urllib.parse.urlparse(urlstring, scheme='', allow_fragments=True)

urlstring 为 字符串的 url 地址,scheme 为协议类型

o = urllib.parse.urlparse('http://httpbin.org/get')
print(o) # ParseResult(scheme='http', netloc='httpbin.org', path='/get', params='', query='', fragment='')

完整内容如下:

属性

索引

值(如果不存在)

scheme

0

URL协议

scheme 参数

netloc

1

网络位置部分

空字符串

path

2

分层路径

空字符串

params

3

最后路径元素的参数

空字符串

query

4

查询组件

空字符串

fragment

5

片段识别

空字符串

username

用户名

None

password

密码

None

hostname

主机名(小写)

None

port

端口号为整数(如果存在)

None

四、urllib.robotparser

urllib.robotparser 用于解析 robots.txt 文件。

robots.txt(统一小写)是一种存放于网站根目录下的 robots 协议,它通常用于告诉搜索引擎对网站的抓取规则。

urllib.robotparser 提供了 RobotFileParser 类,语法如下:

class urllib.robotparser.RobotFileParser(url='')

这个类提供了一些可以读取、解析 robots.txt 文件的方法:

  • set_url(url) - 设置 robots.txt 文件的 URL。

  • read() - 读取 robots.txt URL 并将其输入解析器。

  • parse(lines) - 解析行参数。

  • can_fetch(useragent, url) - 如果允许 useragent 按照被解析 robots.txt 文件中的规则来获取 url 则返回 True。

  • mtime() -返回最近一次获取 robots.txt 文件的时间。 这适用于需要定期检查 robots.txt 文件更新情况的长时间运行的网页爬虫。

  • modified() - 将最近一次获取 robots.txt 文件的时间设置为当前时间。

  • crawl_delay(useragent) -为指定的 useragent 从 robots.txt 返回 Crawl-delay 形参。 如果此形参不存在或不适用于指定的 useragent 或者此形参的 robots.txt 条目存在语法错误,则返回 None。

  • request_rate(useragent) -以 named tuple RequestRate(requests, seconds) 的形式从 robots.txt 返回 Request-rate 形参的内容。 如果此形参不存在或不适用于指定的 useragent 或者此形参的 robots.txt 条目存在语法错误,则返回 None。

  • site_maps() - 以 list() 的形式从 robots.txt 返回 Sitemap 形参的内容。 如果此形参不存在或者此形参的 robots.txt 条目存在语法错误,则返回 None

在 Python 3 中,robotparser 是一个独立的模块,而不是 urllib 的一个属性;

使用 import robotparser 来直接导入 robotparser 模块;

或者使用 from urllib import robotparser 来从 urllib 包中导入 robotparser

# 在 Python 3 中,robotparser 是一个独立的模块,而不是 urllib 的一个属性
# 使用 import robotparser 来直接导入 robotparser 模块。
# 或者使用 from urllib import robotparser 来从 urllib 包中导入 robotparser
rp = robotparser.RobotFileParser()
rp.set_url("http://httpbin.org/robots.txt")
print(rp.read())

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

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

相关文章

C++进阶知识复习 1~15

C 进阶总复习 (1~15) 目的1. 介绍下程序从编写到可执行的整个过程2. C中的auto和decltype的区别3. 介绍下多态的实现原理4. C中的new[] 和delete[] 为什么一定要配对使用?5. C中malloc申请的内存 可以使用delete释放嘛6. 什么情况下会出现内存…

输电线路航空标志球:低空飞行的安全路标 / 恒峰智慧科技

在现代社会,随着航空业的快速发展,低空飞行活动日益频繁。为了确保飞行安全,避免飞机与高压电线等障碍物发生碰撞,输电线路航空标志球应运而生。这种装置被广泛应用于高压输电线路上,尤其是超高压和跨江输电线&#xf…

Debian/Ubuntu的networking的`/etc/network/interfaces`配置文件详解

Debian/Ubuntu的networking的/etc/network/interfaces配置文件详解 Debian/Ubuntu 的 /etc/network/interfaces 配置文件详解 在 Debian/Ubuntu 系统中,/etc/network/interfaces 是传统网络接口配置文件,用于定义网络接口的静态/动态配置。以下是逐项解…

OpenCV 图形API(或称G-API)(1)

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 引言 OpenCV 图形API(或称G-API)是一个新的OpenCV模块,旨在使常规图像处理更快且更便携。通过引入一种新的基于图的执行…

Leetcode 3505. Minimum Operations to Make Elements Within K Subarrays Equal

Leetcode 3505. Minimum Operations to Make Elements Within K Subarrays Equal 1. 解题思路2. 代码实现 题目链接:3505. Minimum Operations to Make Elements Within K Subarrays Equal 1. 解题思路 这一题大的思路上不难想到就是一个动态规划的思路。我们分别…

win10之mysql server 8.0.41安装

一 mysql server 下载 官网下载地址页面 https://dev.mysql.com/downloads/mysql/二 免装版使用步骤 1 解压 下载完成后,解压文件夹,如下所示: 2 执行安装命令 D:\soft\mysql\mysql-8.0.41-winx64\mysql-8.0.41-winx64\bin>mysqld --install Service successfully in…

第十二届蓝桥杯省赛软件类(cc++组)

第一题&#xff08;空间&#xff09; 解题思路 答案 #include <stdio.h>int main() {// 计算256MB对应的字节数&#xff0c;1MB 1024KB&#xff0c;1KB 1024Blong long total_bytes 256 * 1024 * 1024; // 每个32位二进制整数占4个字节&#xff08;32 / 8 4&#xf…

C++ 新特性 | C++ 11 | 移动语义

文章目录 一、移动语义1、为什么需要移动语义&#xff1f;2、怎么“偷”&#xff1f;——右值引用&#xff08;&&&#xff09;3、如何实现移动语义&#xff1f;——移动构造函数/赋值4、什么时候触发移动&#xff1f;5、移动 vs 拷贝 一、移动语义 1、为什么需要移动语…

wsl下ubuntu安装宝塔

在 WSL (Windows Subsystem for Linux) 下的 Ubuntu 中安装宝塔面板的步骤如下&#xff1a; 1. 确保 WSL 环境正常 已安装 WSL 2 并启用 Ubuntu 发行版&#xff08;推荐 Ubuntu 20.04/22.04&#xff09;。 在 PowerShell 中检查 WSL 版本&#xff1a; wsl --list --verbose 如…

UDP网络通信

UDP网络通信&#xff1a; 步骤1 创建套接字&#xff1a; #include <sys/types.h> #include <sys/socket.h>int socket(int domain, int type, int protocol);参数一 domain&#xff1a; AF_UNIX Local communication unix(7) 本地通信 AF_INET IPv4 Inte…

教你快速理解linux中的NUMA节点探测是干什么用的?

想象一个大城市被划分成几个区&#xff08;比如东区、西区&#xff09;。每个区有自己的超市&#xff08;内存&#xff09;&#xff0c;居民&#xff08;CPU&#xff09;去本区的超市买东西最快&#xff0c;去其他区的超市会慢一些。 NUMA节点探测&#xff0c;就是Linux系统在…

使用 Less 实现 PC 和移动端样式适配

&#x1f310; 使用 Less 实现 PC 和移动端样式适配 —— 以 position 属性为例 在前端开发中&#xff0c;我们常常会遇到这样一个场景&#xff1a; 在 PC 页面中需要某个元素是 position: relative;&#xff0c;但在移动端却希望它是 position: inherit;&#xff0c;以便更灵…

企业战略管理(设计与工程师类)-2-战略规划及管理过程-1-概述

战略管理过程 参考资料&#xff1a; 战略管理 - 清华大学- 蔡临宁公司战略与风险管理 - 华中科技大学 - 贺远琼战略管理 - 北京理工大学 - 杨万荣DeepSeek - 深度思考与联网检索 AFI框架 战略管理最典型的就是采用传统的AFI通用战略管理框架&#xff08;模型&#xff09;&a…

Swoole 的 Hyperf 框架和 Go 的 Gin 框架高并发原理以及技术实现对比分析

Swoole 的 Hyperf 框架和 Go 的 Gin 框架虽然都支持高并发&#xff0c;但它们的实现原理、底层机制和适用场景有显著差异。以下从 高并发原理、技术实现区别、优缺点 三个方面详细分析&#xff1a; 一、高并发实现原理 1. Hyperf (PHP Swoole) Hyperf 的高并发能力基于 Swoo…

【教程】如何利用bbbrisk一步一步实现评分卡

利用bbbrisk一步一步实现评分卡 一、什么是评分卡1.1.什么是评分卡1.2.评分卡有哪些 二、评分卡怎么弄出来的2.1.如何制作评分卡2.2.制作评分卡的流程 三、变量的分箱3.1.数据介绍3.2.变量自动分箱3.3.变量的筛选 四、构建评分卡4.1.评分卡实现代码4.2.评分卡表4.3.阈值表与分数…

AI日报 - 2025年4月2日

&#x1f31f; 今日概览&#xff08;60秒速览&#xff09; ▎&#x1f916; AGI突破 | 研究揭示零RL训练可诱发模型顿悟&#xff0c;Anthropic发布Claude 3.5内部机制研究&#xff0c;简化语言模型推理优化新方法提出。 DeepSeek-R1无需额外指令即可深度推理&#xff1b;Anthro…

探索 Kubernetes 网络穿透:如何从外部访问 K8s Pod 地址

文章目录 探索 Kubernetes 网络穿透&#xff1a;如何从外部访问 K8s Pod 地址为什么需要外部访问 Pod 地址&#xff1f;常见的网络穿透方案NodePortLoadBalancerIngressPort-ForwardHostNetworkkt-connect&#xff1a;为开发调试提供便捷穿透 实践建议与注意事项各方案对比表总…

深入理解 Apache Dagster:数据管道编排实战指南

本文系统介绍了 Apache Dagster 的核心概念与实践方法&#xff0c;涵盖环境搭建、管道定义、运行调试及高级功能&#xff0c;帮助开发者快速掌握这一现代化数据编排工具&#xff0c;提升数据工程效率。 1. 背景与核心优势 随着数据驱动应用的复杂化&#xff0c;传统工具在可维…

Minio集群部署

Minio集群部署 资源规划 IP服务规划配置192.168.116.138minio-116核32G磁盘10T192.168.116.139minio-216核32G磁盘10T192.168.116.140minio-316核32G磁盘10T192.168.116.141minio-416核32G磁盘10T192.168.116.128nginx代理8核16G磁盘500G 基本环境配置 下面命令minio4台设备…

操作系统高频(六)linux内核

操作系统高频&#xff08;六&#xff09;linux内核 1.内核态&#xff0c;用户态的区别⭐⭐⭐ 内核态和用户态的区别主要在于权限和安全性。 权限&#xff1a;内核态拥有最高的权限&#xff0c;可以访问和执行所有的系统指令和资源&#xff0c;而用户态的权限相对较低&#x…