当前位置: 首页 > news >正文

爬虫获取不同数据类型(如JSON,HTML)的处理方法以及图片相对URL地址的转换

        当我们爬取图片的URL地址时,我们要确保它们都是有效的绝对URL,这样就可以直接用这些URL来下载图片了。但是很多时候,它们都不是绝对URL地址,因此我们需要它进行URL转换。

  1. if img_url.startswith('//'):

    这个条件检查URL是否以//开头。这种形式的URL称为协议相对URL(protocol-relative URL),它意味着URL的协议(如http:https:)应该与当前页面的协议相同。代码通过将http:添加到URL的前面来将其转换为绝对URL。注意,这里假设页面是通过HTTP协议加载的;如果页面是通过HTTPS加载的,应该使用https:。在实际应用中,你可能需要根据页面的实际协议来动态确定这一点。
  2. elif img_url.startswith('/'):

    这个条件检查URL是否以/开头。这种形式的URL是相对于网站根目录的路径。代码通过将页面的基础URL(即不包含页面具体路径的URL)与相对路径拼接起来,从而生成绝对URL。
  3. elif not img_url.startswith('http'):

    这个条件检查URL是否不以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

  1. 获取 JSON 数据

    • 使用 requests.get(url) 获取 JSON 数据。
    • 使用 response.raise_for_status() 检查请求是否成功。
  2. 解析 JSON 数据

    • 使用 response.json() 将 JSON 数据解析为 Python 字典。
    • 假设 JSON 数据中有一个键(例如 images)包含图片 URL 列表。
  3. 提取图片 URL 列表

    • 从解析后的 JSON 数据中提取图片 URL 列表。
    • 创建保存图片的目录。如果目录不存在,使用 os.makedirs(save_dir) 创建目录。
  4. 下载图片并保存到本地

    • 处理图片 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 的基本概念入手&#xff…...

前端数据加载慢的解决方法

都是和前端性能优化非常类似的做法。 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&#xff0…...

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)详细理解并附实现代码。 文章目录 【深度学习基础模型】液态状态机&#xff0…...

深入理解链表(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城市结构进行细粒度感知。然而,现有的相关基准在城市场…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...