
你有没有过这样的经历?想做数据分析却卡在数据获取,想批量收集资料却只能复制粘贴?作为互联网开发者,掌握数据获取能力早已成为核心竞争力 —— 而 Python 爬虫正是最低门槛的解决方案。
根据 CSDN 2025 年开发者技能调查显示,83% 的初级开发者认为 Python 爬虫是最易上手的技术工具,但同时有 76% 的人坦言曾因踩坑放弃入门。今天这篇文章,我将结合实战案例拆解爬虫入门全流程,帮你避开那些 “一看就会,一写就崩” 的陷阱。
基础准备:3 步搞定环境搭建
核心环境配置(新手必看)
爬虫入门的第一道坎往往是环境配置,以下是经过千次验证的稳定方案:
安装 Python:优先选择 3.9 版本(兼容性最佳),官网下载时必须勾选「Add Python to PATH」—— 这能解决 90% 的 “命令行找不到 Python” 问题。
配置虚拟环境:用 Anaconda 创建独立环境避免依赖冲突,命令如下:
conda create --name crawler_env python=3.9 # 创建环境
conda activate crawler_env # 激活环境
升级 pip 工具:防止库安装失败,执行升级命令:
python -m pip install --upgrade pip
必备库安装
爬虫核心依赖两个库,安装命令及作用如下:
|
库名称 |
安装命令 |
核心作用 |
|
requests |
pip install requests |
发送 HTTP 请求,模拟浏览器访问 |
|
beautifulsoup4 |
pip install beautifulsoup4 |
解析 HTML,提取目标数据 |
⚠️ 避坑提示:Windows 用户若出现 “安装失败”,需以管理员身份运行命令提示符;Mac 用户可在命令前加sudo获取权限。
手把手写豆瓣电影爬虫
以爬取豆瓣电影 Top250 为例,采用工程化思维拆分代码,这是企业级爬虫的标准写法。
项目结构设计(新手也能写规范代码)
一个健壮的爬虫项目必须模块化,推荐目录结构:
douban_spider/
├── main.py # 主程序入口
├── spider.py # 负责发送请求
├── parser.py # 负责解析数据
├── utils.py # 工具函数(反爬、日志等)
└── requirements.txt # 依赖列表
在requirements.txt中写入依赖,方便他人复用:
requests==2.31.0
beautifulsoup4==4.12.3
工具函数:反爬第一步(伪装浏览器)
网站通过User-Agent识别爬虫,utils.py中编写随机请求头:
import random
# 准备多个浏览器标识,随机选择避免被封
USER_AGENTS = (
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15...",
)
def get_headers():
"""生成随机请求头"""
return {
"User-Agent": random.choice(USER_AGENTS),
"Accept-Language": "zh-CN,zh;q=0.9"
}
发送请求:带异常处理的爬取函数
spider.py中实现请求逻辑,加入超时和错误捕获:
import requests
from utils import get_headers
from requests.exceptions import RequestException
def fetch_html(url):
"""获取网页HTML,带异常处理"""
try:
# 超时设置10秒,避免无限等待
response = requests.get(
url,
headers=get_headers(),
timeout=10
)
# 主动抛出HTTP错误(如404、500)
response.raise_for_status()
# 自动识别编码,解决中文乱码
response.encoding = response.apparent_encoding
return response.text
except RequestException as e:
print(f"请求失败: {e}")
return None
解析数据:用 CSS 选择器精准提取
parser.py中解析页面,选择器独立便于维护:
from bs4 import BeautifulSoup
# 选择器聚焦管理,改页面时只需改这里
SELECTORS = {
"movie_item": ".grid_view li",
"title": ".title",
"rating": ".rating_num",
"quote": ".inq",
"link": "a"
}
def parse_movies(html):
"""解析电影数据"""
soup = BeautifulSoup(html, "html.parser")
movie_list = []
for item in soup.select(SELECTORS["movie_item"]):
# 提取标题,处理多语言标题情况
title = item.select_one(SELECTORS["title"]).text.strip()
# 提取评分,确保数据存在
rating = item.select_one(SELECTORS["rating"]).text.strip()
# 提取名言,处理无名言情况
quote_tag = item.select_one(SELECTORS["quote"])
quote = quote_tag.text.strip() if quote_tag else "暂无名言"
# 提取详情链接
link = item.select_one(SELECTORS["link"])["href"]
movie_list.append({
"title": title,
"rating": rating,
"quote": quote,
"link": link
})
return movie_list
主程序:串联全流程 + 反爬策略
main.py中组织逻辑,加入延迟避免封 IP:
from spider import fetch_html
from parser import parse_movies
import time
BASE_URL = "https://movie.douban.com/top250?start={}&filter="
def main():
all_movies = []
# 分页爬取,共10页(250部电影)
for start in range(0, 250, 25):
url = BASE_URL.format(start)
print(f"正在爬取第{start//25 + 1}页:{url}")
html = fetch_html(url)
if not html:
print(f"第{start//25 + 1}页爬取失败,跳过")
continue
movies = parse_movies(html)
all_movies.extend(movies)
# 关键反爬:间隔1秒,模拟人类浏览
time.sleep(1)
# 保存数据到CSV
save_to_csv(all_movies)
print(f"爬取完成!共获取{len(all_movies)}部电影")
def save_to_csv(data, filename="douban_top250.csv"):
"""保存数据到CSV文件"""
import csv
with open(filename, "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=data[0].keys())
writer.writeheader()
writer.writerows(data)
if __name__ == "__main__":
main()
新手避坑:5 个致命错误及解决方案
根据 51CTO 开发者调研,以下是爬虫入门最高发的问题:
4.1 误区一:无视 Robots 协议(法律风险)
表现:直接爬取网站所有内容,可能触及法律红线。
解决:用robotparser检查权限:
from urllib.robotparser import RobotFileParser
rp = RobotFileParser()
rp.set_url("https://movie.douban.com/robots.txt")
rp.read()
# 检查是否允许爬取Top250页面
if rp.can_fetch("MyCrawler/1.0", "https://movie.douban.com/top250"):
print("允许爬取")
else:
print("禁止爬取")
4.2 误区二:请求头缺失(必被封禁)
表现:用默认User-Agent,10 秒内被封 IP。
解决:必须使用utils.py中的随机请求头,这能将封禁率降低 90%。
4.3 误区三:无异常处理(程序崩溃)
表现:网络波动时程序直接退出,之前的数据白爬。
解决:如spider.py所示,用try-except捕获所有请求异常,关键处加日志。
4.4 误区四:解析器写死(页面一改就崩)
表现:用绝对路径如div[3]/ul/li[2],网站改版直接失效。
解决:用class或id等稳定属性,如本文的SELECTORS设计。
4.5 误区五:不懂动态页面(爬取空数据)
表现:用requests爬取抖音、小红书,返回空 HTML。
解决:先按 F12→Network→XHR 找 API 接口;无接口时用 Selenium 渲染:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://example.com") # 动态页面
html = driver.page_source # 获取渲染后的数据
进阶方向:从入门到实用
5.1 数据持久化升级
除了 CSV,还可存入数据库:
# 示例:存入MySQL
import pymysql
db = pymysql.connect(host="localhost", user="root", password="123456", db="spider_db")
cursor = db.cursor()
sql = "INSERT INTO movies(title, rating) VALUES (%s, %s)"
cursor.execute(sql, ("肖申克的救赎", "9.7"))
db.commit()
5.2 效率优化
- 异步爬取:用aiohttp替代requests,速度提升 5 倍以上。
- 代理池:集成开源proxy_pool,解决 IP 封禁问题。
结语:爬虫入门的 3 个关键认知
合规优先:只爬公开数据,商业用途需获授权。
工程思维:模块化、异常处理、配置分离,这是区别新手与高手的核心。
实践为王:本文的豆瓣爬虫案例,提议亲手敲 3 遍,比看 10 篇教程有用。
最后想问:你在爬取时遇到过最头疼的问题是什么?欢迎在评论区留言,我会逐一解答!


