爬虫获取不同数据类型(如JSON,HTML)的处理方法以及图片相对URL地址的转换
当我们爬取图片的URL地址时,我们要确保它们都是有效的绝对URL,这样就可以直接用这些URL来下载图片了。但是很多时候,它们都不是绝对URL地址,因此我们需要它进行URL转换。
-
这个条件检查URL是否以if img_url.startswith('//'):
//
开头。这种形式的URL称为协议相对URL(protocol-relative URL),它意味着URL的协议(如http:
或https:
)应该与当前页面的协议相同。代码通过将http:
添加到URL的前面来将其转换为绝对URL。注意,这里假设页面是通过HTTP协议加载的;如果页面是通过HTTPS加载的,应该使用https:
。在实际应用中,你可能需要根据页面的实际协议来动态确定这一点。 -
这个条件检查URL是否以elif img_url.startswith('/'):
/
开头。这种形式的URL是相对于网站根目录的路径。代码通过将页面的基础URL(即不包含页面具体路径的URL)与相对路径拼接起来,从而生成绝对URL。 -
这个条件检查URL是否不以elif not img_url.startswith('http'):
http
开头。这通常意味着URL是相对于当前页面路径的。代码通过在页面基础URL后面添加/
(如果需要的话,即如果基础URL不以/
结尾)和相对路径,从而生成绝对URL。
# 处理相对路径,下面只考虑httpif img_url.startswith('//'):img_url = 'http:' + img_urlelif img_url.startswith('/'):img_url = url + img_urlelif not img_url.startswith('http'):img_url = url + '/' + img_url
下面介绍不同的数据类型在python中的处理方法:
JSON
-
获取 JSON 数据:
- 使用
requests.get(url)
获取 JSON 数据。 - 使用
response.raise_for_status()
检查请求是否成功。
- 使用
-
解析 JSON 数据:
- 使用
response.json()
将 JSON 数据解析为 Python 字典。 - 假设 JSON 数据中有一个键(例如
images
)包含图片 URL 列表。
- 使用
-
提取图片 URL 列表:
- 从解析后的 JSON 数据中提取图片 URL 列表。
- 创建保存图片的目录。如果目录不存在,使用
os.makedirs(save_dir)
创建目录。
-
下载图片并保存到本地:
- 处理图片 URL 的相对路径问题(例如,将协议相对 URL 转换为绝对 URL)。
- 使用
requests.get(img_url)
下载图片。 - 提取图片的文件名,并保存到指定目录。
如果网页内容是以 JSON 格式返回的,你可以直接使用 requests
库来获取 JSON 数据,然后解析并保存其中的图片。以下是如何处理 JSON 数据并下载其中的图片的示例代码。
import requests
import os
import json# 1. 获取 JSON 数据
url = 'https://api.example.com/data' # 替换为你的 JSON API URL
response = requests.get(url)
response.raise_for_status() # 检查请求是否成功# 2. 解析 JSON 数据
data = response.json()# 3. 提取图片 URL 列表
# 假设 JSON 数据中有一个 'images' 键,包含图片 URL 列表
image_urls = data.get('images', [])# 创建保存图片的目录
save_dir = 'downloaded_images'
if not os.path.exists(save_dir):os.makedirs(save_dir)# 4. 下载图片并保存到本地
for img_url in image_urls:try:# 处理相对路径if img_url.startswith('//'):img_url = 'http:' + img_urlelif not img_url.startswith('http'):img_url = url + '/' + img_url# 发送请求获取图片img_response = requests.get(img_url)img_response.raise_for_status() # 检查请求是否成功# 提取文件名img_filename = os.path.join(save_dir, img_url.split('/')[-1])# 保存图片with open(img_filename, 'wb') as f:f.write(img_response.content)print(f'Saved image: {img_filename}')except Exception as e:print(f'Failed to download image {img_url}: {e}')print('All images downloaded.')
XML(可扩展标记语言)
- 特点:XML 是一种用于存储和传输数据的标记语言,结构类似于 HTML,但更灵活。
- 处理方法:使用 Python 的
xml.etree.ElementTree
模块解析 XML 数据。
import xml.etree.ElementTree as ET
import requests
import os# 获取 XML 数据
url = 'https://api.example.com/data.xml'
response = requests.get(url)
response.raise_for_status()# 解析 XML 数据
root = ET.fromstring(response.content)# 提取图片 URL 列表
image_urls = [elem.text for elem in root.findall('.//image')]# 创建保存图片的目录
save_dir = 'downloaded_images'
if not os.path.exists(save_dir):os.makedirs(save_dir)# 下载图片并保存到本地
for img_url in image_urls:try:img_response = requests.get(img_url)img_response.raise_for_status()img_filename = os.path.join(save_dir, img_url.split('/')[-1])with open(img_filename, 'wb') as f:f.write(img_response.content)print(f'Saved image: {img_filename}')except Exception as e:print(f'Failed to download image {img_url}: {e}')
CSV(逗号分隔值)
- 特点:CSV 是一种简单的文件格式,用于存储表格数据。
- 处理方法:使用 Python 的
csv
模块读取 CSV 文件,或者直接使用pandas
库进行高级处理。
import csv
import requests
import os# 获取 CSV 数据
url = 'https://api.example.com/data.csv'
response = requests.get(url)
response.raise_for_status()# 解析 CSV 数据
csv_data = response.text
csv_reader = csv.reader(csv_data.splitlines())
next(csv_reader) # 跳过表头image_urls = [row[0] for row in csv_reader]# 创建保存图片的目录
save_dir = 'downloaded_images'
if not os.path.exists(save_dir):os.makedirs(save_dir)# 下载图片并保存到本地
for img_url in image_urls:try:img_response = requests.get(img_url)img_response.raise_for_status()img_filename = os.path.join(save_dir, img_url.split('/')[-1])with open(img_filename, 'wb') as f:f.write(img_response.content)print(f'Saved image: {img_filename}')except Exception as e:print(f'Failed to download image {img_url}: {e}')
Excel(.xls, .xlsx)
- 特点:Excel 文件是一种用于存储表格数据的常见文件格式。
- 处理方法:使用
openpyxl
或pandas
库读取 Excel 文件。
import requests
import os
import openpyxl# 获取 Excel 数据
url = 'https://api.example.com/data.xlsx'
response = requests.get(url)
response.raise_for_status()# 保存 Excel 文件到本地
temp_filename = 'temp.xlsx'
with open(temp_filename, 'wb') as f:f.write(response.content)# 读取 Excel 数据
workbook = openpyxl.load_workbook(temp_filename)
sheet = workbook.activeimage_urls = [cell.value for cell in sheet['A']]# 删除临时文件
os.remove(temp_filename)# 创建保存图片的目录
save_dir = 'downloaded_images'
if not os.path.exists(save_dir):os.makedirs(save_dir)# 下载图片并保存到本地
for img_url in image_urls:try:img_response = requests.get(img_url)img_response.raise_for_status()img_filename = os.path.join(save_dir, img_url.split('/')[-1])with open(img_filename, 'wb') as f:f.write(img_response.content)print(f'Saved image: {img_filename}')except Exception as e:print(f'Failed to download image {img_url}: {e}')
HTML
- 特点:HTML 是网页的标准标记语言,常用于展示网页内容。
- 处理方法:使用
BeautifulSoup
或lxml
库解析 HTML 内容。
import requests
from bs4 import BeautifulSoup
import os# 获取 HTML 数据
url = 'https://example.com'
response = requests.get(url)
response.raise_for_status()# 解析 HTML 数据
soup = BeautifulSoup(response.text, 'html.parser')# 提取图片 URL 列表
image_tags = soup.find_all('img')
image_urls = [img['src'] for img in image_tags if 'src' in img.attrs]# 创建保存图片的目录
save_dir = 'downloaded_images'
if not os.path.exists(save_dir):os.makedirs(save_dir)# 下载图片并保存到本地
for img_url in image_urls:try:img_response = requests.get(img_url)img_response.raise_for_status()img_filename = os.path.join(save_dir, img_url.split('/')[-1])with open(img_filename, 'wb') as f:f.write(img_response.content)print(f'Saved image: {img_filename}')except Exception as e:print(f'Failed to download image {img_url}: {e}')
其他数据格式
- YAML:使用
PyYAML
库解析 YAML 数据。 - SQLite:使用
sqlite3
库连接和查询 SQLite 数据库。 - 二进制文件:使用
struct
模块解析二进制数据。
相关文章:
爬虫获取不同数据类型(如JSON,HTML)的处理方法以及图片相对URL地址的转换
当我们爬取图片的URL地址时,我们要确保它们都是有效的绝对URL,这样就可以直接用这些URL来下载图片了。但是很多时候,它们都不是绝对URL地址,因此我们需要它进行URL转换。 if img_url.startswith(//): 这个条件检查URL是否以//开头…...

Elasticsearch 实战应用
Elasticsearch 实战应用 引言 Elasticsearch 是一个分布式、RESTful 风格的搜索和分析引擎,能够快速、实时地处理大规模数据,广泛应用于全文搜索、日志分析、推荐系统等领域。在这篇博客中,我们将从 Elasticsearch 的基本概念入手ÿ…...
前端数据加载慢的解决方法
都是和前端性能优化非常类似的做法。 1. 懒加载 (Lazy Loading) 对于图片、视频等资源,或者某些组件,在用户滚动到相关区域时再加载,而不是页面一开始就加载所有内容。使用 IntersectionObserver 实现懒加载,或者一些 UI 框架&am…...
探索MultiApp:一款强大的多应用管理工具
探索MultiApp:一款强大的多应用管理工具 在这个数字化时代,多任务并行已经成为我们日常生活的一部分。无论是工作还是娱乐,我们都需要频繁地在多个应用之间切换。今天,我要向大家介绍一款能够帮助你在同一设备上无缝切换和管理多…...

qt QGraphicsItem详解
一、概述 QGraphicsItem是Qt框架中图形视图框架(Graphics View Framework)的一个核心组件,它是用于表示2D图形元素的基类。 它支持的功能包括: 设置和获取图形项的位置和尺寸。控制图形项的外观,如颜色、笔刷、边框…...
LVS搭建负载均衡
LVS搭建负载均衡 引言 在现代互联网应用中,用户对服务的可用性和响应速度要求越来越高。为了应对高并发请求,保证系统的稳定性和容错能力,负载均衡技术应运而生。LVS(Linux Virtual Server)是一种高性能、高可用性的…...

Unity MVC框架演示 1-1 理论分析
本文仅作学习笔记分享与交流,不做任何商业用途,该课程资源来源于唐老狮 1.一般的图解MVC 什么是MVC我就不说了,老生常谈,网上有大量的介绍,想看看这三层都起到什么职责?那就直接上图吧 2.我举一个栗子 我有…...

基于springboot+vue人脸识别的考勤管理系统(源码+定制+开发)
博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...

【api连接ChatGPT的最简单方式】
通过api连接ChatGPT的最简单方式 建立client 其中base_url为代理,若连接官网可省略;配置环境变量 from openai import OpenAI client OpenAI(base_url"https://api.chatanywhere.tech/v1" )或给出api和base_url client OpenAI(api_key&…...

技术成神之路:设计模式(二十)装饰模式
介绍 装饰模式(Decorator Pattern)是一种结构型设计模式,它允许在不改变对象自身的情况下,动态地为对象添加额外的职责。这个模式通常用于增强或改变对象的功能。 1.定义 装饰模式通过创建一个装饰类,将功能动态地添加…...

利用特征点采样一致性改进icp算法点云配准方法
1、index、vector 2、kdtree和kdtreeflann 3、if kdtree.radiusSearch(。。。) > 0)...

LabVIEW惯性导航系统仿真平台
LabVIEW开发捷联惯性导航系统仿真平台,采用模块化设计,利用LabVIEW的图形化编程特性,提高了系统仿真的效率和精度,同时具备良好的可扩展性和用户交互性。 项目背景 当前,惯性导航系统(INS)的研…...
es简单实现文章检索功能
使用的api是:Elasticsearch Java API client 8.0 官网:Package structure and namespace clients | Elasticsearch Java API Client [8.15] | Elastic 1.建立索引库 实现搜索功能字段: title:文章标题content:文章内…...

太速科技-607-基于FMC的12收和12发的光纤子卡
基于FMC的12收和12发的光纤子卡 一、板卡概述 本卡是一个FPGA夹层卡(FMC)模块,可提供高达2个CXP模块接口,提供12路收,12路发的光纤通道。每个通道支持10Gbps,通过Aurora协议,可以组成X4࿰…...

UEFI学习笔记(十):系统表与ACPI表的遍历
一、概述 在 UEFI 系统表中,有几个关键的表用于提供系统信息、服务和硬件抽象。这些表可以通过 EFI_SYSTEM_TABLE 访问,常见的 UEFI 系统表如下: 1、EFI_SYSTEM_TABLE (系统表) EFI_SYSTEM_TABLE 是一个指针,包含多个服务和系统…...

【深度学习基础模型】液态状态机(Liquid State Machines, LSM)详细理解并附实现代码。
【深度学习基础模型】液态状态机(Liquid State Machines, LSM)详细理解并附实现代码。 【深度学习基础模型】液态状态机(Liquid State Machines, LSM)详细理解并附实现代码。 文章目录 【深度学习基础模型】液态状态机࿰…...

深入理解链表(SList)操作
目录: 一、 链表介绍1.1、 为什么引入链表1.2、 链表的概念及结构1.3、 链表的分类 二、 无头单向非[循环链表](https://so.csdn.net/so/search?q循环链表&spm1001.2101.3001.7020)的实现2.1、 [单链表](https://so.csdn.net/so/search?q单链表&spm1001.2…...
03. prometheus 监控 Linux 主机
文章目录 一、prometheus 监控 Linux 主机二、防火墙打开端口1. 方式一:使用 iptables 添加白名单(推荐使用):2. 方式二:重载防火墙 一、prometheus 监控 Linux 主机 1. 官网下载 node_exporter 官网:htt…...

AI占据2024诺贝尔两大奖项,是否预示着未来AI即一切?
本次诺贝尔物理学和学奖的获得者都与AI息息相关,可谓是“AI领域的大丰收”。 2024年诺贝尔物理学奖揭晓:瑞典皇家科学院公布了2024年诺贝尔物理学奖的获得者。他们是美国的约翰霍普菲尔德(John J. Hopfield),以及加拿…...

[已解决] Install PyTorch 报错 —— OpenOccupancy 配环境
目录 关于 常见的初始化报错 环境推荐 torch, torchvision & torchaudio cudatoolkit 本地pip安装方法 关于 OpenOccupancy: 语义占用感知对于自动驾驶至关重要,因为自动驾驶汽车需要对3D城市结构进行细粒度感知。然而,现有的相关基准在城市场…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...

代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章 摘要: 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言,受限于 C 语言本身的内存安全和并发安全问题,开发复杂模块极易引入难以…...

Python环境安装与虚拟环境配置详解
本文档旨在为Python开发者提供一站式的环境安装与虚拟环境配置指南,适用于Windows、macOS和Linux系统。无论你是初学者还是有经验的开发者,都能在此找到适合自己的环境搭建方法和常见问题的解决方案。 快速开始 一分钟快速安装与虚拟环境配置 # macOS/…...
python打卡day49@浙大疏锦行
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 一、通道注意力模块复习 & CBAM实现 import torch import torch.nn as nnclass CBAM(nn.Module):def __init__…...