【Python爬虫实战】从多类型网页数据到结构化JSON数据的高效提取策略

  🌈个人主页: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 动态加载的内容,理解数据结构并合理选择工具,是高效爬取数据的关键。

好的,我可以为您介绍一下如何使用 Python 爬虫来爬取房产数据并保存到本地。 首先,您需要选择一个合适的网站来进行爬取。例如,可以选择链家网、安居客等房产网站。然后,您需要分析该网站的页面结构和数据请求方式,确定需要爬取哪些数据,以及如何获取这些数据。 接着,您可以使用 Python 的 requests 库来发送 HTTP 请求,获取网页内容。然后,可以使用 BeautifulSoup 库来解析网页内容,提取需要的数据。 最后,您可以使用 Python 的 Pandas 库将数据保存到本地的 Excel 或 CSV 文件中。以下是一个示例代码: ```python import requests from bs4 import BeautifulSoup import pandas as pd # 发送 HTTP 请求获取网页内容 url = 'https://bj.lianjia.com/ershoufang/' headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} response = requests.get(url, headers=headers) soup = BeautifulSoup(response.content, 'html.parser') # 解析网页内容,提取需要的数据 house_list = soup.find_all('div', {'class': 'info'}) data = [] for house in house_list: name = house.find('div', {'class': 'title'}).text.strip() price = house.find('div', {'class': 'price'}).text.strip() area = house.find('div', {'class': 'houseInfo'}).text.strip() data.append([name, price, area]) # 将数据保存到本地文件 df = pd.DataFrame(data, columns=['名称', '价格', '面积']) df.to_excel('house_data.xlsx', index=False) ``` 这是一个简单的示例代码,您可以根据您需要爬取的数据和网站的不同来进行修改和优化。
评论 73
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值