从网页中提取结构化数据
数据提取是爬虫的核心环节,我们需要将解析后的HTML数据转换为结构化的格式, 如列表、字典或JSON,以便后续处理和分析。
提取同类元素的集合
键值对形式的结构化数据
复杂数据的层次化组织
小华需要定期收集新闻网站的头条新闻,包括标题、发布时间、作者和阅读量。 她通过分析网页结构,建立了一个完整的数据提取流程。
<div class="news-item"> <h2 class="title">Python新版本发布</h2> <span class="time">2023-11-22 14:30</span> <span class="author">科技记者</span> <span class="views">1.2万阅读</span> </div>
{
"title": "Python新版本发布",
"time": "2023-11-22 14:30",
"author": "科技记者",
"views": 12000,
"url": "https://news..."
}
import requests
from bs4 import BeautifulSoup
import re
def extract_news_data(url):
"""提取新闻数据"""
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
news_list = []
items = soup.find_all('div', class_='news-item')
for item in items:
# 提取并清洗数据
title = item.find('h2', class_='title').text.strip()
time_str = item.find('span', class_='time').text.strip()
author = item.find('span', class_='author').text.strip()
views_text = item.find('span', class_='views').text.strip()
# 数据清洗
views = clean_views_count(views_text)
news_list.append({
'title': title,
'time': time_str,
'author': author,
'views': views
})
return news_list
def clean_views_count(text):
"""清洗阅读量数据"""
match = re.search(r'(\d+\.?\d*)万?', text)
if match:
count = float(match.group(1))
if '万' in text:
count *= 10000
return int(count)
return 0
从文本中提取价格数字,处理"¥1,999"等格式。
# 目标:将"¥1,999"转换为1999
将不同格式的日期统一为YYYY-MM-DD格式。
# 提示:处理"2023年11月22日"等格式
处理提取过程中可能遇到的缺失数据。
# 目标:为缺失值设置合理的默认值
验证提取的数据是否符合预期格式和范围。
# 提示:检查邮箱格式、手机号等
批量处理多个网页的数据提取任务。
# 目标:循环处理URL列表
去除提取数据中的重复项。
# 提示:使用set()或字典去重
将提取的数据保存为JSON格式文件。
# 目标:使用json.dump()保存数据
优化数据提取过程,提高处理速度。
# 提示:批量处理和缓存策略