python爬虫 - 数据提取

  🌈个人主页: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).contentwith 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 jsonresponse = 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.rhkb.cn/news/443621.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【设计模式】软件设计原则——开闭原则里氏替换单一职责

开闭原则内容引出 开闭原则 定义&#xff1a;一个软件实体&#xff0c;类&#xff0c;函数&#xff0c;模块&#xff1b;对扩展开放&#xff0c;对修改关闭。用抽象构建框架&#xff0c;用实现扩展细节。可以提高软件的可复用性和可维护性。 开发新功能时&#xff0c;尽量不修…

猿人学— 第一届第1题(解题思路附源码)

猿人学 — 第一届第1题&#xff08;解题思路附源码&#xff09; F12进入开发者工具—> 发现停止在debugger处 —> 右键点击Never pause here后下一步 翻页&#xff0c;抓包后发现请求携带page和m两个参数&#xff0c;page应该就是页数&#xff0c;m则需要逆向 依次查…

微服务中传递公共参数,在网关层header添加参数,各子微服务,openfeign,线程池等地方拿到网关传递过来的参数

需求&#xff1a; 网关层在header中添加参数&#xff0c;header-user_id1001&#xff0c;header-user_name小明 各个子微服务&#xff0c;可以通过openfeign&#xff0c;线程池等方式拿到上面的参数1 网关层 gateway添加需要传递的参数信息 import cn.hutool.core.net.URLEnco…

MySQL从0到1基础语法笔记(下)

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;Java Web关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 多表问题分析&#xff1a; 部门数据可以直接删除&#xff0c;然后还有部分员工…

Python对PDF文件的合并操作

在处理 PDF 文件时&#xff0c;合并多个 PDF 文件为一个单一文件或者将某个单一文件插入某个PDF文件是一个常见的需求。Python 提供了多种库来实现这一功能&#xff0c;其中 PyPDF2 是一个非常流行的选择。该库提供了简单易用的接口&#xff0c;包括 merge() 方法&#xff0c;可…

Linux系统和数据库常用的命令2

Linux系统和数据库常用的命令2 1、两台Linux机器ssh免密登录 client端登录server端需要免密&#xff0c;只需把公钥发送到server就可&#xff0c;会在server端生成一个authorized_keys文件 # 108机器上[rootclient ~]# ssh-keygen -t rsa // 非对称算法 Generating public/…

全闪 SDS 一体机提供 FC 能力承载医院核心业务

邹平市人民医院使用 X3000 SDS 一体机组建分布式存储集群&#xff0c;通过 FC 接口 与 VMware 集群连接&#xff0c;以全闪池承载核心业务&#xff0c;对象存储承载 PACS 数据&#xff0c;实现存储架构的升级改造。 “新医改”的不断推进&#xff0c;对医院的运营管理、服务质…

基础教程 | 用VuePress搭建一个简单的个人博客(附源码)

先附上自己个人博客页面&#xff1a;https://illusionno.github.io/ 源码也在这里&#xff1a;https://github.com/illusionno/my-blog &#xff08;如果觉得有帮助&#xff0c;可以点颗star✨&#xff09; 使用的主题是vuepress-theme-reco2.x&#xff0c;并在上面进行了一些调…

红外变电站分割数据集,标注为json格式,总共有5类,避雷器(289张),绝缘子(919张),电流互感器(413张),套管(161张),电压互感器(153张)

红外变电站分割数据集&#xff0c;标注为json格式&#xff0c;总共有5类 避雷器&#xff08;289张&#xff09;&#xff0c;绝缘子&#xff08;919张&#xff09;&#xff0c;电流互感器&#xff08;413张&#xff09;&#xff0c;套管&#xff08;161张&#xff09;&#xff0…

【星汇极客】单片机竞赛之2024睿抗机器人大赛-火线速递赛道(持续更新)

前言 本人是一名嵌入式学习者&#xff0c;在大学期间也参加了不少的竞赛并获奖&#xff0c;包括&#xff1a;江苏省电子设计竞赛省一、睿抗机器人国二、中国高校智能机器人国二、嵌入式设计竞赛国三、光电设计竞赛国三、节能减排竞赛国三等。 暑假的时候参加了太多的比赛&#…

设备多久(60/50/40min)未上报,类似场景发送通知实现方案

场景描述 设备比较多&#xff0c;几十万甚至上百万&#xff0c;设备在时不时会上报消息。 用户可以设置设备60分钟、50分钟、40分钟、30分钟未上报数据&#xff0c;发送通知给用户&#xff0c;消息要及时可靠。 基本思路 思路&#xff1a; 由于设备在一直上报&#xff0c;如果…

Airtest脚本的重构与优化:提升测试效率和可读性

在自动化测试的工作里&#xff0c;编写高效且易于维护的测试脚本是一项挑战&#xff0c;尤其是在应对复杂的测试场景时。Airtest作为一款常用的自动化测试工具&#xff0c;它提供了丰富的API和灵活的脚本编写方式&#xff0c;帮助测试人员高效地开展UI自动化测试。然而&#xf…

Linux的环境与历史

目录 引言 1. Linux 背景介绍 2. 开源 3. 官网 4. 企业应用现状 5. 发行版本 6.见见猪跑 引言 在这个信息化时代&#xff0c;掌握一门操作系统技能显得尤为重要。Linux作为一款开源、稳定且功能强大的操作系统&#xff0c;不仅在服务器领域占据主导地位&#xff0c;也逐渐…

哈希表结构

哈希表结构&#xff1a;数组链表 案例一&#xff1a;HashSet集合的常见使用方法 package com.collection;import java.util.HashSet; import java.util.Iterator;/*** HashSet集合的使用* 存储结构&#xff1a;哈希表(数组链表红黑树)*/ public class Demo07 {public static v…

性能测试学习6:jmeter安装与基本配置/元件/线程组介绍

一.JDK安装 官网&#xff1a;https://www.oracle.com/ 二.Jmeter安装 官网&#xff1a;http://jmeter.apache.org/download_jmeter.cgi 下载zip包&#xff0c;zip后缀那个才是Windows系统的jmeter 三.Jmeter工作目录介绍 四.Jmeter功能 1&#xff09;修改默认配置-汉化 2&am…

SapGUI For Windows捕获技术

一、SapGUI For Windows捕获技术 文章目录 一、SapGUI For Windows捕获技术SAP GUI:SAP NetWeaver Business Client:SAP Fiori:二.Sap的自动化配置SAP客户端配置三.Sap GUI自动化脚本四.Sap GUI自动化开发SAP GUI: SAP图形用户界面,是最常用的SAP前端界面。它是一个桌面应…

React(一) 认识React、熟悉类组件、JSX书写规范、嵌入变量表达式、绑定属性

文章目录 一、初始React1. React的基本认识2. Hello案例2.1 三个依赖2.2 渲染页面2.3 hello案例完整代码 二、类组件1. 封装类组件2. 组件里的数据3. 组件里的函数 (重点)4. 案例练习(1) 展示电影列表 三、JSX语法1. 认识JSX2. JSX书写规范及注释3. JSX嵌入变量作为子元素4. JS…

leetcode58:最后一个单词的长度

给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大 子字符串 。 示例 1&#xff1a; 输入&#xff1a;s "Hello World" 输出&#xff…

Linux SSH服务

Linux SSH&#xff08;Secure Shell&#xff09;服务是一种安全的远程登录协议&#xff0c;用于在Linux操作系统上远程登录和执行命令。它提供了加密的通信通道&#xff0c;可以在不安全的网络环境中安全地进行远程访问。 SSH服务在Linux系统中通常使用OpenSSH软件包来实现。它…

【Java SE 题库】输出一个数的二进制的奇数位和偶数位

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 目录 1. 题目 2. 分析 3. 代码实现 3.1 运行结果 4. 小结 1. 题目 输入一个数&#xff0c;请分别打印这个数二进制的奇数位和偶数位 例&#xff1a;15 …