python爬虫 - 数据提取

news2024/11/26 17:44:55

  🌈个人主页:https://blog.csdn.net/2401_86688088?type=blog
🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html

目录

前言

一、数据类型及其对应的提取策略

(一)文本数据

(二)数值数据

(三)链接

(四)图像数据

(五)表格数据

(六)JSON数据

(七)动态数据

(八)元数据

(九)总结

二、结构化数据提取-json

(一)JSON数据的特点

(二)解析JSON数据的步骤

(三)JSON 数据的典型结构

(四)提取嵌套数据

(五)常见操作

(六)解析动态JSON数据

(七)总结

三、总结


前言

在互联网爬虫的过程中,面对大量网页数据,理解和区分不同类型的数据至关重要。无论是网页上的文本、数值信息,还是图片、链接、表格等内容,每一种数据类型都有其独特的结构和解析方法。通过合理利用相应的提取策略,爬虫可以高效获取有价值的数据。本篇文章将深入探讨不同类型网页数据的解析方法,并以 JSON 数据为例,详细介绍结构化数据的提取步骤,帮助读者更好地理解并掌握网页数据的爬取技术。


一、数据类型及其对应的提取策略

在爬虫中爬取的数据往往是多种类型的,不同类型的数据需要采用不同的方法进行提取和解析。了解数据的不同类型有助于我们根据其特性进行高效、有规律的处理。以下是常见的数据类型及其相应的提取和解析策略。

(一)文本数据

文本数据是最常见的数据类型,包括网页上的文章、标题、段落、评论等。它通常是非结构化的,需要通过解析 HTML 或者 XML 来提取。

解析方法:

  • 使用 BeautifulSouplxml 解析 HTML。

  • 使用 .get_text() 获取标签中的文本。

  • 如果文本在特定的 HTML 标签内,可以通过 .find().find_all() 方法来定位并提取。

示例:

# 提取页面中的所有段落文本
paragraphs = soup.find_all('p')
for p in paragraphs:
    print(p.get_text())

(二)数值数据

数值数据通常嵌入在网页中的某些位置,比如价格、评分、时间戳等。这类数据在解析后可以直接用于统计分析或进一步处理。

解析方法:

  • 数值数据通常伴随在特定的标签中,如 <span>, <div>,可以通过精确定位提取。

  • 对于带有单位的数值(如价格),需要在提取后进一步清理或转换为合适的格式。

示例:

# 提取价格信息
price = soup.find('span', class_='price').get_text()
cleaned_price = price.replace('$', '').strip()  # 去掉美元符号
print(float(cleaned_price))

(三)链接

爬虫常常需要提取网页中的链接,尤其是进行多页面爬取时,提取下一页或相关页面的链接是非常重要的。

解析方法:

  • 使用 .find_all('a') 查找所有超链接标签。

  • 提取 href 属性中的 URL。

  • 对相对路径的链接需要结合基础 URL 拼接为完整的绝对路径。

示例:

# 提取页面中的所有链接
links = soup.find_all('a')
for link in links:
    url = link.get('href')
    if url and url.startswith('http'):
        print(url)

(四)图像数据

网页中通常会嵌入大量图像文件,如商品图片、用户头像等。爬虫可以通过提取图像的 src 属性下载图像。

解析方法:

  • 使用 .find_all('img') 获取所有 <img> 标签。

  • 提取 src 属性中的图片 URL。

  • 对相对路径进行处理,拼接为绝对路径。

  • 使用 requests 下载图片。

示例:

# 提取并下载图片
images = soup.find_all('img')
for img in images:
    img_url = img.get('src')
    if img_url:
        full_img_url = urljoin(base_url, img_url)
        img_data = requests.get(full_img_url).content
        with open('image.jpg', 'wb') as f:
            f.write(img_data)

(五)表格数据

很多网站以表格形式展示数据,如产品信息、财务数据等。提取表格中的数据需要根据表格结构解析 HTML。

解析方法:

  • 使用 .find().find_all() 方法查找 <table> 标签。

  • 解析 <tr> 获取行数据,解析 <td> 获取列数据。

  • 可以使用 pandas 库将表格数据转换为 DataFrame 格式,便于后续处理。

示例:

import pandas as pd

# 提取表格数据
table = soup.find('table', class_='data')
rows = table.find_all('tr')
table_data = []
for row in rows:
    cols = row.find_all('td')
    table_data.append([col.get_text() for col in cols])

# 使用 pandas 创建 DataFrame
df = pd.DataFrame(table_data)
print(df)

(六)JSON数据

有些网站直接返回 JSON 格式的数据,这种数据通常出现在通过 API 接口获取的内容或动态网页加载的后台数据中。JSON 是一种半结构化数据格式,非常适合用于存储和传输数据。

解析方法:

  • 通过 requests 获取返回的 JSON 数据。

  • 使用 json.loads() 解析为 Python 的字典或列表。

示例:

import json

response = requests.get('https://api.example.com/data')
json_data = json.loads(response.text)

# 提取特定字段
for item in json_data['items']:
    print(item['name'], item['value'])

(七)动态数据

某些网页的数据是通过 JavaScript 动态加载的,普通的 HTML 解析无法直接获取到这些数据。这时需要模拟浏览器行为,执行 JavaScript 来获取动态加载的内容。

解析方法:

  • 使用 SeleniumPlaywright 等工具来模拟浏览器行为,执行 JavaScript 并获取渲染后的页面。

  • 提取渲染后的 HTML 内容,继续使用 BeautifulSoup 解析。

示例:

from selenium import webdriver

# 使用 Selenium 获取动态加载的页面
driver = webdriver.Chrome()
driver.get('https://example.com')
html_content = driver.page_source
soup = BeautifulSoup(html_content, 'lxml')

# 提取所需数据
data = soup.find('div', class_='dynamic-data').get_text()
print(data)

# 关闭浏览器
driver.quit()

(八)元数据

元数据是嵌入在网页中的描述性数据,通常用来描述网页的标题、关键词、作者等信息。常见于 <meta> 标签。

解析方法:

  • 使用 .find().find_all() 提取特定的 <meta> 标签。

  • 通过 attrs 获取 content 属性中的元数据内容。

示例:

# 提取网页的描述元数据
meta_description = soup.find('meta', attrs={'name': 'description'})
if meta_description:
    print(meta_description['content'])

(九)数据类型总结

爬虫过程中,网页包含的不同类型的数据需要不同的解析方法。通过了解网页中的文本、数值、图像、链接、表格、JSON 等数据类型,结合相应的解析技术,可以高效地从网页中提取有用信息。掌握这些数据解析方法能够提升爬虫的灵活性和适应性,满足不同场景下的爬取需求。


二、结构化数据提取-json

结构化数据提取指从已定义且有固定格式的数据源(如JSON、数据库、CSV等)中提取数据。对于JSON格式的数据,由于其具有明确的层次结构和键值对,提取过程相对简单且直接。

(一)JSON数据的特点

  • 键值对形式:数据以 key: value 的形式存储,类似Python中的字典。

  • 层次结构:可以嵌套对象和数组,允许数据嵌套在多个层级中。

  • 可读性强:相比于 XML,JSON 更加简洁,易于阅读和解析。

(二)解析JSON数据的步骤

解析的步骤分为以下三步:

(1)获取 JSON 数据

  • JSON 数据可以从 API 请求中获取,也可以从本地文件加载。

  • 可以通过 requests 库获取 JSON 格式的网页数据,或者直接读取 JSON 文件。

(2)解析 JSON

  • Python 提供了 json 模块来处理 JSON 格式的数据,可以将其解析为 Python 的字典或列表类型。

(3)提取数据

  • 通过字典的键访问 JSON 数据中的值,或者通过遍历列表来提取嵌套数据。

示例1:从 API 获取并解析 JSON 数据

使用 requests 获取 JSON 数据,并通过 json 模块解析和提取。

import requests
import json

# 发出请求并获取响应
url = 'https://api.example.com/data'
response = requests.get(url)

# 检查请求状态
if response.status_code == 200:
    json_data = response.json()  # 将响应转换为字典
    # 打印整个 JSON 数据
    print(json.dumps(json_data, indent=4))

    # 提取特定字段
    for item in json_data['items']:
        print(f"Name: {item['name']}, Value: {item['value']}")
else:
    print("Failed to retrieve data")

示例2:从本地文件加载并解析 JSON 数据

如果你有一个本地的 JSON 文件,可以直接读取文件并解析。

import json

# 读取本地 JSON 文件
with open('data.json', 'r') as file:
    json_data = json.load(file)  # 将 JSON 解析为字典

# 打印整个 JSON 数据
print(json.dumps(json_data, indent=4))

# 提取特定字段
for item in json_data['items']:
    print(f"Name: {item['name']}, Value: {item['value']}")

(三)JSON 数据的典型结构

一个典型的 JSON 数据结构可能包含对象、数组、嵌套对象,示例如下:

{
    "items": [
        {
            "name": "Item1",
            "value": 100,
            "details": {
                "category": "A",
                "in_stock": true
            }
        },
        {
            "name": "Item2",
            "value": 200,
            "details": {
                "category": "B",
                "in_stock": false
            }
        }
    ]
}

在上述 JSON 结构中,items 是一个数组,数组中的每个元素都是一个对象,包含多个字段(name, value, details 等)。

(四)提取嵌套数据

对于嵌套的 JSON 数据,可以通过链式访问的方式获取内部字段。例如:

# 提取嵌套字段
for item in json_data['items']:
    name = item['name']
    value = item['value']
    category = item['details']['category']
    in_stock = item['details']['in_stock']
    
    print(f"Name: {name}, Value: {value}, Category: {category}, In Stock: {in_stock}")

(五)常见操作

(1)提取数组中的特定项

如果 JSON 中包含数组数据,你可以通过遍历数组来提取数据。

# 提取 JSON 中数组的第一个元素
first_item = json_data['items'][0]
print(first_item['name'])

(2)根据条件筛选数据

可以根据特定条件从 JSON 数据中筛选出符合条件的对象。

# 筛选出所有 in_stock 为 True 的 items
for item in json_data['items']:
    if item['details']['in_stock']:
        print(item['name'])

(3)处理复杂的嵌套结构

有时 JSON 结构较为复杂,层级较多。你可以递归地访问嵌套数据,或者将深度嵌套的部分先提取到局部变量中再操作。

# 提取深度嵌套的数据
for item in json_data['items']:
    details = item.get('details', {})
    category = details.get('category', 'Unknown')
    print(f"Category: {category}")

(六)解析动态JSON数据

有时候,JSON 数据是动态生成的,可能通过 AJAX 请求或其它形式加载。可以使用 Selenium 等工具模拟浏览器操作,获取这些动态生成的 JSON 数据。

from selenium import webdriver
import json

# 启动浏览器
driver = webdriver.Chrome()
driver.get('https://example.com')

# 提取动态加载的 JSON 数据
json_data = driver.execute_script("return window.__INITIAL_STATE__")
parsed_data = json.loads(json_data)

# 提取字段
print(parsed_data['some_key'])

# 关闭浏览器
driver.quit()

(七)json结构化数据总结

  • JSON 格式数据具有结构化和层次化的特点,便于解析和提取。

  • 使用 requests 获取 JSON 数据,使用 json 模块解析。

  • 对于嵌套结构,需按层级逐步提取数据。

  • 可通过条件筛选、遍历数组等方式灵活处理 JSON 数据。


三、总结

爬虫过程中,数据的类型多种多样,不同类型的数据需要采用不同的提取和解析策略。本文详细介绍了从文本、数值、链接、图像、表格等多种常见数据的提取方法,并对结构化数据中的 JSON 数据进行深入解析。通过了解这些方法,爬虫程序可以更加灵活地应对复杂的数据场景,提取出有用的信息。无论是简单的静态页面,还是通过 JavaScript 动态加载的内容,理解数据结构并合理选择工具,是高效爬取数据的关键。

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

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

相关文章

网约巴士订票系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;巴士信息管理&#xff0c;积分兑换管理&#xff0c;积分纪录管理&#xff0c;新闻信息管理&#xff0c;基础数据管理 微信端账号功能包括&#xff1a;系统…

国产长芯微LDC8531低功耗轨到轨输出 16 位串行输入数模转换器完全P2P替代DAC8531

描述 LDC8531是一款低功耗、单16位缓冲电压输出数模转换器&#xff08;DAC&#xff09;。其片上精密输出放大器允许实现轨到轨输出摆动。LDC8531使用多功能三线串行接口&#xff0c;其时钟频率高达30MHz&#xff0c;与标准SPI、QSPI、Microwire和数字信号处理器&#xff08;DSP…

数据库迁移中的权限问题及解决方法——以Error 1142为例

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

无线领夹麦克风哪个降噪好?选购领夹麦克风需注意的五大隐藏风险

不知道大家有没有遇到这样一个情况&#xff0c;为什么有些视频或直播的声音听起来那么清晰&#xff0c;仿佛身临其境&#xff0c;而自己拍的视频却总是嘈杂不堪&#xff0c;尤其是在户外拍摄的时候&#xff0c;音频中更是充斥着各种各样的噪音。这种问题主要还是麦克风的原因所…

3dmax笔记-ALT X 透明度设置

1 降低max的模型的透明度 ALTX 看区别 区别对比

Sentinel最全笔记,详细使用步骤教程清单

一、Sentinel的基本功能 1、流量控制 流量控制在网络传输中是一个常用的概念&#xff0c;它用于调整网络包的发送数据。然而&#xff0c;从系统稳定性角度考虑&#xff0c;在处理请求的速度上&#xff0c;也有非常多的讲究。任意时间到来的请求往往是随机不可控的&#xff0c;…

分辨率提高4到8倍!AI高清修复工具-upscayl使用方法!

你还在为手中的模糊照片苦恼吗&#xff1f; 是不是想把老照片或低分辨率的图片用于大尺寸印刷&#xff0c;却因为画质糟糕而无从下手&#xff1f; 现在你不再需要高深的Photoshop技能&#xff0c;也不用花费巨资找人修图。借助AI高清修复工具Upscayl&#xff0c;只需几秒钟&am…

一文解读数据中台附搭建指南

数据是企业的核心资产&#xff0c;更是企业数字化转型的关键驱动力。为了更好地管理和利用数据&#xff0c;进行数据共享&#xff0c;充分发挥数据的作用&#xff0c;越来越多的企业开始构建实时数据中台。 一数据中台 定义&#xff1a;数据中台是将企业内部各个部门、系统、应…

【嵌入式软件-STM32】STM32简介

目录 一、STM32定义 二、STM32用途 三、STM32特点 四、STM32 四个系列 五、了解ARM 六、芯片解释 七、片上资源 八、命名规则 九、系统结构 内核 Flash DMA 外设种类和分布 十、引脚定义 类型 名称 引脚 十一、启动配置 十二、STM32最小系统电路 STM32及供电 供电引脚 滤波电容…

机器人动力学和轨迹规划

路径规划&#xff08;way&#xff09;&#xff1a;规划连接位置A与位置B间序列点或曲线的策略。 注意&#xff1a;这个路径规划是非常重要的&#xff0c;是机器人智能的一个体现。 路径规划主要有3个方法&#xff1a;MoveJ&#xff1a;关节点到点运动&#xff0c;MoveL&#…

Spring Boot学习资源库:Java开发者的新篇章

2 相关技术简介 2.1Java技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xff0c;任…

crossover和虚拟机哪个好用?Mac电脑玩游戏用哪个软件?

由于大多数热门游戏都是针对Windows平台开发的&#xff0c;这对于Mac用户来说可能会带来一些困扰。幸运的是&#xff0c;有几款虚拟机软件可以帮助解决这个问题&#xff0c;其中最常提到的是Parallels Desktop&#xff08;简称PD虚拟机&#xff09;和CrossOver。 PD虚拟机&…

Nodejs-Nestjs框架 RBAC(基于角色的访问控制模型) 微服务 仿小米商城实战视频教程-2024年-试看学习记录

文章目录 前提-安装环境Nestjs框架介绍Nestjs框架环境搭建创建nestjs项目运行nestjs项目demonestjs新项目结构解释nestjs中的控制器、路由、Get、Post、方法参数装饰器nestjs模板引擎、配置静态资源(了解即可)nestjs中的服务(Model)nestjs中的cookie(了解即可)nestjs中的se…

企业工作者如何提高对数据治理的认知度

提高对数据治理的认知度是一个涉及多方面努力的过程&#xff0c;以下是一些建议&#xff0c;可以帮助企业或个人增强对数据治理的理解和重视&#xff1a; 一、教育与培训 组织内部培训&#xff1a;定期举办数据治理相关的培训课程&#xff0c;邀请行业专家或内部资深人士进行…

AI用得好,升职加薪早

最近&#xff0c;K哥在公司里经常说的一句话就是&#xff1a;“AI用得好&#xff0c;升职加薪早&#xff01;” 而且我们团队每个人都增加了一条KPI&#xff0c;叫做“含AI量”。什么意思呢&#xff1f;就是完成一项工作&#xff0c;使用了多少AI工具。 我不仅这样要求团队&…

JS 数组去重 — 各类场景适合方法大全

JS 数组去重 — 各类场景适合方法大全 本文介绍各种场景 JS 去重 方法使用 性能最好、用的最多、场景大全 文章目录 JS 数组去重 — 各类场景适合方法大全 一、基础篇&#xff1a;简单直观的去重方法1. 使用Set数据结构2. 利用filter和indexOf方法3. reduce方法的应用 二、进阶…

国产长芯微LDC5422单通道、16位、电流源和电压输出DAC,HART连接完全P2P替代AD5422

描述 LDC5422是低成本、精密、完全集成、16位数模转换器(DAC)&#xff0c;内置可编程电流源和可编程电压输出&#xff0c;设计用于满足工业过程控制应用的需要。 输出电流范围可编程设置为4 mA至20 mA、0 mA至20 mA或者超量程的0 mA至24 mA。 此产品的LFCSP版本有一个CAP2引脚…

Linux运维_安全狗Apache版本安装

--------->安全狗官网(网站安全狗-网站安全防护,防后门|防SQL注入|防CC攻击|网马查杀|防篡改) 1.下载解压安全狗 2.

《Windows PE》4.3 延迟加载导入表

延迟加载导入表&#xff08;Delayed Import Table&#xff09;是PE文件中的一个数据结构&#xff0c;用于实现延迟加载&#xff08;Lazy Loading&#xff09;外部函数的机制。 延迟加载是指在程序运行时&#xff0c;只有当需要使用某个外部函数时才进行加载和绑定&#xff0c;…

【最新华为OD机试E卷-支持在线评测】最小的调整次数(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…