十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

百度大数据项目手写实现:3步解决教程不会写代码的难题

百度大数据项目手写实现:3步解决教程不会写代码的难题 百度大数据项目手写实现:3步解决教程不会写代码的难题 看了一堆百度大数据的教程,视频里跑得飞快,自己上手连个爬虫都配不明白,这是不是你的现状?别慌,问题不在你脑子慢,而在于没人带你把“手写实现”的坑一个个填平。今天这篇不画饼,直接上代码,带你从零搭建一个能跑通的数据采集与清洗小项目,专治“看懂了但不会写”的绝症。 项目目标与避坑指南 很多新手一上来就想搞分布式、搞Hadoop集群,结果环境配了三天没跑起来,心态直接崩了。做百度大数据相关的数据处理,核心其实是数据获取、数据清洗和数据入库。我们这个项目不追求高大上,就聚焦这三个最基础的环节。 目标很明确:用Python写一个简易的网页爬虫,抓取百度公开数据集或模拟数据,用Pandas进行清洗,最后存入SQLite本地数据库。为什么选SQLite?因为轻量,不用装服务,打开就能用,适合初学者验证逻辑。 这里有个大坑必须提醒:百度内部的数据平台架构非常复杂,涉及Flink、Hive、DataX等组件,但我们个人或小团队学习时,不要试图复刻百度全链路。你要做的是理解数据流动的逻辑。很多教程只讲理论,代码全是TODO,这就是你卡住的原因。我们的策略是:手写实现每一个关键环节,哪怕代码写得烂,只要逻辑闭环,你就赢了80%的人。 目录结构与依赖管理 工程化思维是区分“玩具代码”和“项目代码”的分水岭。别再把所有代码扔进一个main.py里了,那样维护起来就是灾难。 建议采用以下目录结构: baidu_data_demo/ ├── config.py # 配置文件,存放URL、DB路径等 ├── requirements.txt # 依赖库 ├── src/ │ ├── crawler.py # 爬虫模块 │ ├── cleaner.py # 清洗模块 │ ├── db.py # 数据库操作模块 │ └── utils.py # 通用工具函数 ├── data/ # 存放原始数据和清洗后数据 │ ├── raw/ │ └── clean/ └── main.py # 程序入口requirements.txt 文件内容很简单,确保环境可复现: requests pandas sqlite3 beautifulsoup4 lxml安装依赖时,建议使用虚拟环境。在终端执行: python -m venv venv source venv/bin/activate # Windows用户: venv\Scripts\activate pip install -r requirements.txt这一步看似简单,但很多新手在这里翻车。如果你用的是系统全局Python,很容易因为库版本冲突导致报错。养成用虚拟环境的习惯,是成为合格工程师的第一步。 核心代码实现详解 这是重头戏。我们将分模块讲解,每个模块都给出手写实现的代码,并逐行注释关键逻辑。 1. 配置模块 config.py 把所有可变参数抽离出来,方便后期修改,不用改代码逻辑。 import os# 项目根目录 BASE_DIR = os.path.dirname(os.path.abspath(__file__))# 数据存放路径 RAW_DATA_DIR = os.path.join(BASE_DIR, 'data', 'raw') CLEAN_DATA_DIR = os.path.join(BASE_DIR, 'data', 'clean')# 确保目录存在 os.makedirs(RAW_DATA_DIR, exist_ok=True) os.makedirs(CLEAN_DATA_DIR, exist_ok=True)# 数据库路径 DB_PATH = os.path.join(BASE_DIR, 'data', 'app.db')# 爬虫配置 HEADERS = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' } TARGET_URL = https://www.baidu.com # 示例URL,实际项目替换为具体数据源2. 爬虫模块 src/crawler.py 这里我们不用复杂的Scrapy框架,直接用requests + BeautifulSoup。因为我们要的是手写实现的过程,框架封装太多,反而看不清本质。 import requests import pandas as pd from bs4 import BeautifulSoup import os import configdef fetch_html(url):获取网页HTML内容try:response = requests.get(url, headers=config.HEADERS, timeout=10)response.raise_for_status() # 如果状态码不是200,抛出异常return response.textexcept requests.RequestException as e:print(f请求失败: {e})return Nonedef parse_data(html_content):解析HTML,提取文本数据注意:百度首页动态内容多,这里仅演示静态文本提取逻辑soup = BeautifulSoup(html_content, 'lxml')# 假设我们要提取所有标题为h1,h2,h3的文本# 实际项目中,需要根据目标网站的DOM结构调整选择器titles = soup.find_all(['h1', 'h2', 'h3'])data = []for tag in titles:text = tag.get_text(strip=True)if text:data.append({'title': text})df = pd.DataFrame(data)return dfdef save_raw_data(df, filename):保存原始数据到CSVfilepath = os.path.join(config.RAW_DATA_DIR, filename)# index=False 表示不保存行索引df.to_csv(filepath, index=False, encoding='utf-8-sig')print(f原始数据已保存: {filepath})3. 清洗模块 src/cleaner.py 数据刚爬下来通常是“脏”的,有重复值、空值、格式不一致。手写实现清洗逻辑,能帮你深刻理解数据质量的重要性。 import pandas as pd import os import configdef load_raw_data(filename):加载原始数据filepath = os.path.join(config.RAW_DATA_DIR, filename)df = pd.read_csv(filepath, encoding='utf-8-sig')return dfdef clean_data(df):核心清洗逻辑# 1. 去除完全重复的行df.drop_duplicates(inplace=True)# 2. 去除标题为空的行df.dropna(subset=['title'], inplace=True)# 3. 去除标题过短或过长的异常数据(假设正常标题长度在5-50之间)df['title_length'] = df['title'].apply(len)df = df[(df['title_length'] = 5) (df['title_length'] = 50)]# 4. 去除标题中的特殊字符或空格df['title'] = df['title'].apply(lambda x: x.strip().replace('\n', ' '))# 5. 重置索引df.reset_index(drop=True, inplace=True)# 删除辅助列df.drop(columns=['title_length'], inplace=True)return dfdef save_clean_data(df, filename):保存清洗后的数据filepath = os.path.join(config.CLEAN_DATA_DIR, filename)df.to_csv(filepath, index=False, encoding='utf-8-sig')print(f清洗后数据已保存: {filepath})4. 数据库模块 src/db.py 数据清洗完后,存入数据库才是最终形态。SQLite是Python内置模块,无需额外安装驱动,非常适合本地演示。 import sqlite3 import pandas as pd import configdef init_db():初始化数据库,创建表conn = sqlite3.connect(config.DB_PATH)cursor = conn.cursor()# 创建数据表# IF NOT EXISTS 防止重复创建报错cursor.execute('''CREATE TABLE IF NOT EXISTS articles (id INTEGER PRIMARY KEY AUTOINCREMENT,title TEXT NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)''')conn.commit()conn.close()def insert_data(df):将DataFrame数据插入数据库conn = sqlite3.connect(config.DB_PATH)# to_sql 方法可以直接将DataFrame写入SQLite# if_exists='append' 表示如果表存在,则追加数据# 注意:生产环境建议先删除旧数据或做增量更新,避免数据重复try:df.to_sql('articles', conn, if_exists='append', index=False)print(f成功插入 {len(df)} 条数据到数据库)except Exception as e:print(f插入数据库失败: {e})conn.close()5. 主程序 main.py 将所有模块串联起来,形成完整的数据流水线。 import os import sys from src.crawler import fetch_html, parse_data, save_raw_data from src.cleaner import load_raw_data, clean_data, save_clean_data from src.db import init_db, insert_data import config import timedef main():print(=== 百度大数据简易项目启动 ===)# 1. 初始化数据库init_db()# 2. 爬取数据print(步骤1: 正在爬取数据...)html = fetch_html(config.TARGET_URL)if html is None:print(爬取失败,程序退出)returndf_raw = parse_data(html)if df_raw.empty:print(未解析到有效数据,程序退出)return# 生成唯一文件名,避免覆盖filename = fraw_{int(time.time())}.csvsave_raw_data(df_raw, filename)# 3. 清洗数据print(步骤2: 正在清洗数据...)df_clean = load_raw_data(filename)df_clean = clean_data(df_clean)if df_clean.empty:print(清洗后无有效数据,程序退出)returnclean_filename = fclean_{int(time.time())}.csvsave_clean_data(df_clean, clean_filename)# 4. 入库print(步骤3: 正在写入数据库...)insert_data(df_clean)print(=== 流程执行完毕 ===)print(f原始数据: {filename})print(f清洗数据: {clean_filename})print(f数据库: {config.DB_PATH})if __name__ == __main__:main()运行与测试策略 代码写完不能直接跑,必须经过测试。很多新手喜欢“边写边试”,导致后期排查bug极其痛苦。单元测试:针对cleaner.py中的clean_data函数,构造几个特殊的DataFrame(包含空值、重复值、超长文本),验证清洗逻辑是否正确。 集成测试:运行main.py,观察控制台输出。检查data/raw和data/clean目录下是否生成了对应的CSV文件。 数据验证:使用Python连接SQLite,查询数据条数是否与清洗后的CSV一致。import sqlite3 import configdef check_db_count():conn = sqlite3.connect(config.DB_PATH)cursor = conn.cursor()cursor.execute(SELECT COUNT(*) FROM articles)count = cursor.fetchone()[0]conn.close()print(f数据库中总记录数: {count})# 在main.py最后调用 check_db_count()如果运行报错,90%的情况是路径问题或依赖缺失。请仔细检查config.py中的路径拼接,以及requirements.txt是否完整安装。参考Python官方开发者文档中关于os.path的使用规范,确保跨平台兼容性。 优化扩展与实战建议 基础流程跑通后,如何向真实百度大数据场景靠拢?并发处理:当前爬虫是单线程的。如果数据量大,可以使用concurrent.futures.ThreadPoolExecutor进行多线程爬取。但要注意百度反爬机制,必须控制频率,加入time.sleep。 异常重试:网络波动是常态。在fetch_html中加入重试机制,使用tenacity库或手动编写重试逻辑。 日志系统:打印print在生产环境是不专业的。引入logging模块,记录不同级别的信息(INFO, WARNING, ERROR),方便排查问题。 容器化:将项目打包成Docker镜像,确保在任何环境下都能一键运行。编写Dockerfile:FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD [python, main.py]小结与互动 通过这个项目,你完成了从手写实现爬虫、清洗到入库的全链路闭环。虽然数据源只是简单的HTML文本,但工程化的思维、模块化的设计、异常的处理,这些才是百度大数据工程师日常工作中最核心的能力。 不要觉得这个例子太简单。很多大型数据项目,底层逻辑依然是“输入-处理-输出”,只是处理环节换成了Spark或Flink,存储换成了HDFS或HBase。底层逻辑通了,上层框架只是工具而已。 现在,轮到你了。你公司项目里是怎么处理数据清洗规则的?是硬编码在代码里,还是配置化? 欢迎在评论区聊聊你的实践,或者分享你踩过的坑,我们一起避坑。
返回列表