✅ 纯白话拆解+代码示例+实战场景,零基础可直接上手
✅ 技术适配:基于Python 3.12 + Requests + BeautifulSoup4 + Selenium 4.x + Scrapy入门,聚焦静态网页爬取、动态网页爬取、数据存储三大核心场景
✅ 条理清晰:从"环境搭建→基础语法→爬虫核心→实战案例"层层拆解,无冗余知识点
✅ 核心目标:小白掌握爬虫入门核心能力,能独立爬取静态网页数据并完成基础数据存储
一、前置准备:认知与环境搭建
1. 爬虫是什么?
爬虫是模拟浏览器请求网页、提取并保存数据的程序,核心用途:
- 数据采集:如爬取电商商品信息、新闻资讯、豆瓣影评等;
- 数据分析:为后续数据处理、可视化提供原始数据;
- 自动化:替代人工复制粘贴,提升数据获取效率。
2. 必备环境搭建
(1)Python安装
官网下载对应系统版本(https://www.python.org/downloads/),安装时勾选"Add Python to PATH"(避免手动配置环境变量)。
验证:终端/命令行输入 python --version,显示Python 3.12+即成功。
(2)核心库安装(终端/命令行执行)
bash
# 发送HTTP请求(爬虫核心)
pip install requests
# 解析网页数据
pip install beautifulsoup4
# 处理HTML/XML
pip install lxml
# 动态网页爬取(模拟浏览器)
pip install selenium
# 数据存储辅助
pip install pandas
3. 爬虫合规性(必看)
- 遵守网站
robots.txt协议(如https://www.xxx.com/robots.txt); - 控制请求频率,避免给服务器造成压力;
- 不爬取敏感数据(隐私、付费内容),不用于商业违规用途。
二、第一部分:爬虫基础核心
1. HTTP请求基础(爬虫底层逻辑)
核心概念
- 请求:爬虫向网站服务器发送"获取网页"的指令(如GET请求);
- 响应:服务器返回的网页数据(状态码200=成功,403=禁止访问,500=服务器错误);
- 请求头:模拟浏览器标识(如User-Agent),避免被网站识别为爬虫。
代码示例:用Requests发送基础请求
python
import requests
# 1. 发送GET请求
url = "https://www.baidu.com"
# 请求头:模拟Chrome浏览器
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}
# 发送请求并获取响应
response = requests.get(url, headers=headers)
# 2. 响应处理
response.encoding = "utf-8" # 设置编码,避免乱码
print("响应状态码:", response.status_code)
print("网页内容:", response.text[:500]) # 打印前500个字符
关键要点:
headers必须设置User-Agent,否则易被网站拦截;response.text返回网页源码,response.json()用于获取接口JSON数据;- 常用请求方法:GET(获取数据)、POST(提交数据,如登录)。
2. 静态网页数据解析(BeautifulSoup4)
白话解释
BeautifulSoup4(简称BS4)是解析HTML/XML的工具,能快速提取网页中的文本、链接、图片等数据,无需手动正则匹配。
核心用法:
python
from bs4 import BeautifulSoup
import requests
# 1. 获取网页源码
url = "https://book.douban.com/top250"
headers = {"User-Agent": "Chrome/120.0.0.0"}
response = requests.get(url, headers=headers)
response.encoding = "utf-8"
html = response.text
# 2. 初始化BS4解析器
soup = BeautifulSoup(html, "lxml") # lxml解析器效率高,需提前安装
# 3. 数据提取(以豆瓣Top250书籍为例)
# 方法1:根据标签+属性查找(推荐)
book_items = soup.find_all("div", class_="pl2") # 查找所有class为pl2的div标签
for item in book_items[:3]: # 只取前3本
# 提取书名(a标签的文本)
book_name = item.find("a")["title"]
# 提取书籍链接(a标签的href属性)
book_link = item.find("a")["href"]
print(f"书名:{book_name},链接:{book_link}")
# 方法2:CSS选择器(类似前端)
# book_names = soup.select(".pl2 a[title]")
核心方法:
find():查找第一个匹配的标签;find_all():查找所有匹配的标签;select():CSS选择器语法(如.class、#id、a[href]);- 提取属性:
标签["属性名"],提取文本:标签.get_text()/标签.text。
3. 动态网页爬取(Selenium入门)
动态网页(如JS渲染的内容)无法通过Requests直接获取,Selenium可模拟浏览器操作(打开页面、滚动、点击),获取渲染后的完整数据。
代码示例:爬取JS渲染的页面
python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
import time
# 1. 配置Chrome浏览器(需下载ChromeDriver,或用自动配置)
# 方式1:自动匹配Chrome版本(需安装:pip install webdriver-manager)
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
# 2. 打开网页
driver.get("https://www.xxx.com/dynamic-page")
time.sleep(2) # 等待页面加载(关键)
# 3. 提取数据(以提取列表项为例)
items = driver.find_elements(By.CLASS_NAME, "item-class")
for item in items[:3]:
print(item.text)
# 4. 关闭浏览器
driver.quit()
关键要点:
-
等待机制:用
time.sleep()(简单)或WebDriverWait(智能等待,推荐); -
元素定位:
By.CLASS_NAME/By.ID/By.XPATH/By.CSS_SELECTOR; -
无头模式:无需打开浏览器窗口,适合服务器运行:
pythonoptions = webdriver.ChromeOptions() options.add_argument("--headless=new") # 无头模式 driver = webdriver.Chrome(options=options, service=Service(ChromeDriverManager().install()))
4. 数据存储(入门级)
爬取的数据需持久化存储,基础方案有3种:
(1)保存为文本文件(TXT)
python
data = ["书名1", "书名2", "书名3"]
# 写入TXT
with open("books.txt", "w", encoding="utf-8") as f:
for line in data:
f.write(line + "\n")
(2)保存为CSV文件(表格,适合结构化数据)
python
import csv
# 表头+数据
header = ["书名", "链接"]
data = [
["书名1", "https://xxx.com/1"],
["书名2", "https://xxx.com/2"]
]
# 写入CSV
with open("books.csv", "w", encoding="utf-8-sig", newline="") as f:
writer = csv.writer(f)
writer.writerow(header) # 写表头
writer.writerows(data) # 写数据
(3)保存到Excel(Pandas简化操作)
python
import pandas as pd
# 构建DataFrame
df = pd.DataFrame({
"书名": ["书名1", "书名2"],
"链接": ["https://xxx.com/1", "https://xxx.com/2"]
})
# 写入Excel
df.to_excel("books.xlsx", index=False) # index=False不保存行号
三、第二部分:基础实战案例
案例1:爬取豆瓣Top250书籍(静态网页)
python
import requests
from bs4 import BeautifulSoup
import csv
def crawl_douban_book():
# 1. 初始化变量
url = "https://book.douban.com/top250"
headers = {"User-Agent": "Chrome/120.0.0.0"}
all_data = []
header = ["排名", "书名", "评分", "链接"]
# 2. 发送请求+解析数据
response = requests.get(url, headers=headers)
response.encoding = "utf-8"
soup = BeautifulSoup(response.text, "lxml")
# 提取书籍列表
book_list = soup.find_all("tr", class_="item")
for idx, book in enumerate(book_list[:10]): # 取前10本
# 排名
rank = book.find("em").text
# 书名
name = book.find("div", class_="pl2").find("a")["title"]
# 评分
score = book.find("span", class_="rating_nums").text
# 链接
link = book.find("div", class_="pl2").find("a")["href"]
all_data.append([rank, name, score, link])
# 3. 保存数据到CSV
with open("douban_book_top250.csv", "w", encoding="utf-8-sig", newline="") as f:
writer = csv.writer(f)
writer.writerow(header)
writer.writerows(all_data)
print("爬取完成,数据已保存到douban_book_top250.csv")
if __name__ == "__main__":
crawl_douban_book()
案例2:爬取动态加载的商品列表(Selenium)
python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import pandas as pd
import time
def crawl_dynamic_goods():
# 1. 配置浏览器
options = webdriver.ChromeOptions()
options.add_argument("--headless=new") # 无头模式
driver = webdriver.Chrome(options=options, service=Service(ChromeDriverManager().install()))
# 2. 打开页面
driver.get("https://www.xxx.com/goods-list")
time.sleep(3) # 等待JS渲染
# 3. 提取数据
goods_data = []
goods_items = driver.find_elements(By.CLASS_NAME, "goods-item")
for item in goods_items[:5]:
# 商品名称
name = item.find_element(By.CLASS_NAME, "goods-name").text
# 商品价格
price = item.find_element(By.CLASS_NAME, "goods-price").text
goods_data.append({"商品名称": name, "价格": price})
# 4. 保存数据
df = pd.DataFrame(goods_data)
df.to_excel("dynamic_goods.xlsx", index=False)
# 5. 关闭浏览器
driver.quit()
print("爬取完成,数据已保存到dynamic_goods.xlsx")
if __name__ == "__main__":
crawl_dynamic_goods()
四、核心避坑清单
- ❌ 未设置User-Agent → ✅ 必须添加,否则易被网站拦截;
- ❌ 直接爬取动态网页 → ✅ 静态网页用Requests+BS4,动态网页用Selenium;
- ❌ 爬取时无延迟 → ✅ 加
time.sleep(1-2),避免请求过快被封IP; - ❌ 中文乱码 → ✅ 设置
response.encoding = "utf-8",保存文件用utf-8-sig; - ❌ 找不到标签 → ✅ 检查标签名/类名是否正确(可通过浏览器F12验证);
- ❌ 忽略异常 → ✅ 加try-except捕获请求失败、标签不存在等异常。
五、总结
- 核心流程:爬虫的核心是"发送请求→解析数据→存储数据",Requests+BeautifulSoup4是静态网页爬取的基础组合;
- 场景适配:静态网页用Requests,动态网页用Selenium,根据页面类型选择对应工具;
- 数据存储:入门级优先选择CSV/Excel,结构化数据用Pandas处理更高效;
- 合规与稳定:遵守网站规则,控制请求频率,添加异常处理保证程序稳定运行。