爬虫获取不同数据类型(如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城市结构进行细粒度感知。然而,现有的相关基准在城市场…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...
