从零开始的技术探索与实践:用爬虫打造你的第一个数据产品
大家好,我是一名开源项目的维护者,也经常在社区里教新手朋友入门编程。今天我想写这篇教程,是因为我看到太多初学者一听到“爬虫”、“产品”这些词就望而却步,觉得它们高深莫测。其实不然!技术探索的核心,就是从一个小小的想法出发,一步步把它变成能用、有用的东西。
我当初学的时候,也是从一行代码、一个报错开始的。所以在这篇文章里,我会手把手带你用最简单的语言和最清晰的步骤,完成一个真正可用的小项目——用爬虫抓取天气信息,做成一个简易的“天气查询产品”。即使你从来没有写过代码,只要跟着做,也能成功!
一、什么是爬虫?什么是产品?
爬虫:互联网上的“自动抄写员”
想象一下,你想知道北京明天的天气。你会打开浏览器,输入网址(比如中国天气网),然后看到结果。这个过程需要你手动操作。
而爬虫(Web Crawler 或 Spider),就是一个程序,它能自动帮你完成这些事:
- 自动访问网页
- 自动从网页中提取你需要的信息(比如温度、湿度)
- 把这些信息保存下来,供你使用
简单说:爬虫 = 自动访问 + 自动提取 + 自动保存
产品:解决实际问题的工具
“产品”听起来很商业,但在技术世界里,任何能解决用户问题的东西都可以叫产品。比如:
- 一个能查天气的小程序
- 一个自动整理新闻的网站
- 甚至是一个帮你记录每日股价的 Excel 文件
我们今天的目标,就是用爬虫抓取天气数据,做一个命令行版的天气查询工具——这就是你的第一个“数据产品”!
二、环境准备:5分钟搭好开发环境
别担心!我们只需要安装两个东西:
步骤1:安装 Python
Python 是一门非常适合初学者的编程语言,也是写爬虫最常用的工具之一。
- 打开 Python 官网
- 下载最新版(比如 Python 3.11 或 3.12)
- 安装时务必勾选 “Add Python to PATH”(这一步很重要!)
💡 验证是否安装成功:
打开终端(Windows 按Win+R输入cmd;Mac 打开“终端”),输入:python --version如果显示类似
Python 3.11.5,说明安装成功!
步骤2:安装必要的库
我们需要两个 Python 库:
requests:用来访问网页beautifulsoup4:用来从网页中提取信息
在终端中运行以下命令:
pip install requests beautifulsoup4
⏱️ 这个过程大约需要1-2分钟。如果遇到网络慢,可以加上国内镜像源:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests beautifulsoup4
步骤3:准备一个代码编辑器
推荐使用 VS Code(免费且强大):
- 下载安装 VS Code
- 安装后打开,按
Ctrl+N(Windows)或Cmd+N(Mac)新建一个文件 - 保存为
weather_crawler.py
现在,你的开发环境就 ready 了!
三、核心概念:用大白话讲清楚
1. HTTP 请求:程序如何“访问”网页?
当你在浏览器输入 https://www.example.com,浏览器会向服务器发送一个 HTTP 请求,服务器返回网页内容(HTML)。
我们的爬虫也要做同样的事。用 requests 库,一行代码就能做到:
import requests
response = requests.get("https://www.example.com")
print(response.text) # 打印网页内容
2. HTML 与解析:如何从乱码中找到有用信息?
网页内容是用 HTML 写的,看起来像这样:
<div class="weather">
<span class="temp">25°C</span>
<span class="desc">晴</span>
</div>
我们要从中提取“25°C”和“晴”。这时候就需要 BeautifulSoup,它能像“筛子”一样,把我们需要的部分筛出来。
from bs4 import BeautifulSoup
html = '<div class="weather"><span class="temp">25°C</span></div>'
soup = BeautifulSoup(html, 'html.parser')
temp = soup.find('span', class_='temp').text
print(temp) # 输出:25°C
3. 数据产品:从“能跑”到“有用”
很多新手写完爬虫就停了,但真正的价值在于把数据变成用户能用的东西。比如:
- 命令行直接输出
- 保存到文件
- 做成网页或小程序
我们今天的目标是:用户输入城市名,程序返回天气。
四、实战项目:做一个天气查询小产品
我们将分四步完成这个项目。
第一步:选择目标网站
为了教学安全,我们使用一个公开、允许爬取、结构简单的测试网站:
⚠️ 注意:不要随意爬取商业网站! 很多网站禁止爬虫,可能封 IP。教学请选择明确允许爬取的站点。
我们以“北京”为例,URL 是:https://tianqi.2345.com/wea_history/54527.htm
第二步:分析网页结构
打开上述链接,右键 → “查看网页源代码”(或按 Ctrl+U)。
搜索关键词“℃”,你会发现天气数据在一个 <ul class="history-list"> 里,每天的数据在一个 <li> 标签中,例如:
<li>
<span class="date">07/01</span>
<span class="wea">晴</span>
<span class="tem">32℃/22℃</span>
</li>
我们的目标:提取 date、wea、tem 的内容。
第三步:编写爬虫代码
创建文件 weather_crawler.py,输入以下代码:
import requests
from bs4 import BeautifulSoup
def get_weather(city_code):
"""
根据城市代码获取最近7天天气
北京: 54527, 上海: 58362, 广州: 59287
"""
url = f"https://tianqi.2345.com/wea_history/{city_code}.htm"
# 发送请求
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
response = requests.get(url, headers=headers)
response.encoding = 'gbk' # 该网站使用GBK编码
# 解析HTML
soup = BeautifulSoup(response.text, 'html.parser')
weather_list = soup.find_all('li')
results = []
for item in weather_list[1:8]: # 跳过第一个(表头),取最近7天
date = item.find('span', class_='date').text
wea = item.find('span', class_='wea').text
tem = item.find('span', class_='tem').text
results.append({
'date': date,
'weather': wea,
'temperature': tem
})
return results
# 测试:获取北京天气
if __name__ == "__main__":
beijing_weather = get_weather("54527")
for day in beijing_weather:
print(f"{day['date']} | {day['weather']} | {day['temperature']}")
🔍 代码说明:
headers:模拟浏览器访问,避免被当成机器人encoding='gbk':该网站用 GBK 编码,不是常见的 UTF-8weather_list[1:8]:跳过第一个<li>(它是表头)
第四步:升级为交互式产品
现在让它更“产品化”——让用户输入城市名!
# 在文件末尾添加
CITY_CODES = {
"北京": "54527",
"上海": "58362",
"广州": "59287",
"深圳": "59493",
"杭州": "58457"
}
def main():
print("🌤️ 欢迎使用天气查询小助手!")
print("支持城市:", ", ".join(CITY_CODES.keys()))
city = input("请输入城市名:")
if city not in CITY_CODES:
print("抱歉,暂不支持该城市。")
return
print(f"\n正在查询 {city} 的天气...\n")
try:
weather_data = get_weather(CITY_CODES[city])
for day in weather_data:
print(f"📅 {day['date']} | {day['weather']} | {day['temperature']}")
except Exception as e:
print("查询失败,请检查网络或稍后再试。")
print("错误信息:", str(e))
if __name__ == "__main__":
main()
保存后,在终端运行:
python weather_crawler.py
试试输入“北京”,看看效果!
五、新手常见问题解答
| 问题 | 原因 | 解决方案 |
|---|---|---|
ModuleNotFoundError: No module named 'requests' |
没安装库 | 运行 pip install requests |
| 网页返回乱码 | 编码问题 | 设置 response.encoding = 'gbk' 或 'utf-8' |
| 返回空数据 | 网站结构变了 / 被反爬 | 检查 HTML 结构是否匹配;加 headers 模拟浏览器 |
| 程序卡住不动 | 网络超时 | 加 timeout=10 参数:requests.get(..., timeout=10) |
报错 find() returned None |
没找到对应标签 | 先打印 response.text[:500] 看是否拿到正确页面 |
💡 我当初学的时候,最常犯的错误就是忘记加 headers,结果网站返回“禁止访问”。记住:模拟真人访问是爬虫的基本礼仪。
六、学习建议与下一步
恭喜你!你已经完成了:
- ✅ 搭建开发环境
- ✅ 理解爬虫原理
- ✅ 写出可运行的代码
- ✅ 打造了一个微型数据产品
但这只是开始。接下来你可以:
1. 扩展功能
- 支持更多城市(找城市代码表)
- 保存结果到 CSV 文件
- 用
schedule库每天自动抓取
2. 学习进阶知识
| 主题 | 推荐学习内容 |
|---|---|
| 反爬对抗 | User-Agent 轮换、代理 IP、验证码识别 |
| 数据存储 | SQLite、MySQL、MongoDB |
| 产品形态 | 用 Flask 做 Web 页面,用 Tkinter 做桌面 GUI |
| 合法合规 | 阅读 robots.txt,遵守网站条款 |
3. 重要提醒:遵守法律与道德
- 不要高频请求(每秒一次都算高!建议间隔 3 秒以上)
- 不要爬取隐私或付费内容
- 商用前务必获得授权
🌱 技术探索的意义,不在于“能爬多少”,而在于“能创造什么”。你今天做的这个小工具,也许明天就能帮家人查天气、帮朋友看旅游预报——这就是产品的价值。
结语
我写这篇教程,就是希望你能体会到:技术不是高墙,而是一级一级的台阶。只要你愿意迈出第一步,后面每一步都会更稳、更自信。
你现在手里的 weather_crawler.py,虽然简单,但它是一个完整的、端到端的数据产品——从数据获取,到处理,再到用户交互。这比很多只停留在“Hello World”的教程更有意义。
如果你成功运行了代码,不妨在评论区告诉我你查了哪个城市的天气?或者遇到什么问题?我很乐意继续帮你!
继续探索吧,未来的开源贡献者!

评论 0