当前位置: 首页 > 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城市结构进行细粒度感知。然而,现有的相关基准在城市场…...

6. PH47 代码框架硬件开发环境搭建

概述 PH47代码框架的硬件开发环境搭建同样简单, 建立基本的 PH47 框架学习或二次开发的硬件开发环境所需设备如下: BBP 飞控板及相关软硬件: BBP飞控板,或者至少一块Stm32F411核心板(WeAct Studio)Stm32程序烧录工具…...

package.json配置

package.json配置 描述配置文件配置脚本配置依赖配置发布配置系统配置第三方配置 描述配置 name : 项目名称,第三方包可以通过npm install 包名安装 "name":"react"version : 项目版本,项目版本号 "version" : "18.2…...

视频怎么转gif动图?5个简单转换方法快来学(详细教程)

相信大家在社交平台上会经常看到一些有趣的gif动图表情包,有些小伙伴就会问:这些GIF动图是如何制作的呢?一般GIF动图表情包可以用视频来制作,今天小编就来给大家分享几个视频转成GIF动图的方法,相信通过以下的几个方法…...

10月更新:优维EasyOps®需求解决更彻底,功能体验再升级

升 级 不 止 步 欢迎来到 需求至上,功能完善 的 \ EasyOps 7.5版本 / 👇 >> 联动架构视图:深度融合监控与资源拓扑 传统上,依赖监控态势感知系统固有的分层拓扑结构虽有其优势,但在处理复杂系统尤其是核心数…...

黑马javaWeb笔记重点备份1:三层架构、IOC、DI

来自:【黑马程序员JavaWeb开发教程,实现javaweb企业开发全流程(涵盖SpringMyBatisSpringMVCSpringBoot等)】 https://www.bilibili.com/video/BV1m84y1w7Tb/?p75&share_sourcecopy_web&vd_source9332b8fc5ea8d349a54c398…...

大坝渗流监测设备——渗压计

渗压计是一种用于监测大坝等水工建筑物渗流压力的重要设备,其准确性和可靠性对于保障大坝安全运行至关重要。南京峟思将为大家详细介绍渗压计的工作原理、安装方法及其在大坝渗流监测中的应用。 渗压计主要利用振弦频率的变化来测量渗透水压力。设备由透水部件、感应…...

Pikachu-Sql Inject-宽字节注入

基本概念 宽字节是相对于ascII这样单字节而言的;像 GB2312、GBK、GB18030、BIG5、Shift_JIS 等这些都是常说的宽字节,实际上只有两字节 GBK 是一种多字符的编码,通常来说,一个 gbk 编码汉字,占用2个字节。一个…...

如何制作低代码开发的视频教程?

如何制作低代码开发的视频教程? 随着数字化转型的加速,越来越多的企业和组织开始采用低代码开发平台来加速应用程序的构建。对于许多开发者和业务人员来说,学习如何使用这些平台可以显著提高工作效率。因此,创建一份清晰、实用且…...

Flink学习地址

--基础概念 概览 | Apache Flink --应用系列 如何学习Flink:糙快猛的大数据之路(图文并茂)_flink 学习-CSDN博客 --Python系列 pyflink实时接收kafka数据至hive_pyflink下kafka数据经过处理后插入hive-CSDN博客 Pyflink教程(一)&#…...

05_23 种设计模式之《建造者模式》

文章目录 一、建造者模式基础知识建造者模式的结构建造者模式的应用场景 一、建造者模式基础知识 建造者模式(Builder Pattern)是一种创建型设计模式,它提供了一种优雅的方式来创建复杂对象,同时隐藏其构建过程。这种模式允许你通…...