目录
- 网络数据采集核心概念
- Python 爬虫核心工具箱
- 实战案例:从简单到复杂
- 处理动态网页 (JavaScript 渲染)
- 爬虫进阶技巧
- 爬虫的“军规”:道德与法律
- 总结与学习路径
网络数据采集核心概念
在开始写代码前,理解基本原理至关重要。

- 客户端 vs. 服务器: 你的 Python 程序是“客户端”,向目标网站(服务器)发起请求。
- HTTP/HTTPS 协议: 客户端和服务器之间沟通的语言,HTTP 是超文本传输协议,HTTPS 是其安全版本。
- 请求-响应模型:
- 请求: 客户端向服务器索要数据,一个请求包含:
- 方法: 最常见的是
GET(获取数据)和POST(提交数据,如登录)。 - URL: 请求资源的地址。
- Headers: 请求头,可以包含
User-Agent(浏览器身份)、Cookie(登录状态)等信息。
- 方法: 最常见的是
- 响应: 服务器返回客户端请求的数据,一个响应包含:
- 状态码: 如
200(成功),404(未找到),301(重定向),403(禁止访问)。 - Headers: 响应头,包含
Content-Type(数据类型, 如text/html)、Set-Cookie(服务器设置的 Cookie) 等。 - Body: 响应体,即真正的数据内容,通常是 HTML、JSON 或图片等。
- 状态码: 如
- 请求: 客户端向服务器索要数据,一个请求包含:
- HTML 结构: 网页的骨架,你需要了解 HTML 标签(如
<div>,<span>,<a>,<p>)和属性(如class,id,href),以便从 HTML 中提取所需信息。
Python 爬虫核心工具箱
Python 生态系统为爬虫提供了极其强大的库。
基础库
-
requests: 发送 HTTP 请求的“瑞士军刀”。- 功能: 发送
GET/POST请求、处理响应、添加请求头、处理 Cookie 等。 - 优点: 简单易用,API 直观,是所有爬虫的起点。
- 功能: 发送
-
Beautiful Soup: 解析 HTML/XML 的“神器”。- 功能: 将复杂的 HTML 文档转换成一个复杂的树形结构,让你方便地查找、遍历、修改这个树。
- 优点: 容错性强,即使 HTML 格式不完美也能很好地工作,支持多种解析器(如
html.parser,lxml)。
-
re(正则表达式): 字符串匹配的“利器”。
(图片来源网络,侵删)- 功能: 用于在文本中查找符合特定模式的字符串。
- 用途: 当
Beautiful Soup无法满足复杂的提取需求时,正则表达式可以帮你直接从文本中“抠”出数据,提取手机号、邮箱、特定格式的日期等。
高级库
-
Scrapy: 爬虫框架。- 功能: 一个完整的、可扩展的爬虫框架,它帮你处理了请求调度、下载、解析、数据存储等所有底层逻辑。
- 优点: 高效、异步、可扩展,适合构建大型、复杂的爬虫项目,学习曲线比
requests+Beautiful Soup更陡峭。
-
Selenium/Playwright: 浏览器自动化工具。- 功能: 模拟真实用户在浏览器中的操作(点击、输入、滚动等)。
- 用途: 主要用于抓取由 JavaScript 动态渲染的网页(即“动态网页”),它们会启动一个真实的浏览器(如 Chrome 或 Firefox),执行你的脚本,然后将最终渲染好的页面源码交给你。
实战案例:从简单到复杂
静态网页数据采集 (豆瓣电影 Top 250)
目标: 豆瓣电影 Top 250 页面的电影名称、评分和一句话评价。
分析: 这是一个典型的静态网页,数据直接写在 HTML 中,非常适合用 requests + Beautiful Soup。

步骤:
-
安装库:
pip install requests beautifulsoup4 lxml
-
编写代码:
import requests from bs4 import BeautifulSoup import time # 1. 发送请求,获取网页内容 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } url = 'https://movie.douban.com/top250' try: response = requests.get(url, headers=headers) # 确保请求成功 response.raise_for_status() # 设置正确的编码方式 response.encoding = response.apparent_encoding except requests.RequestException as e: print(f"请求失败: {e}") exit() # 2. 使用Beautiful Soup解析HTML soup = BeautifulSoup(response.text, 'lxml') # 3. 定位数据并提取 # 所有电影信息都在一个 <ol class="grid_view"> 下的 <li> 标签里 movie_list = soup.find_all('li', class_='item') for movie in movie_list: # 电影名称 title = movie.find('span', class_='title').text # 评分 rating_num = movie.find('span', class_='rating_num').text # 一句话评价 quote = movie.find('span', class_='inq') quote_text = quote.text if quote else "无" print(f"电影: {title}, 评分: {rating_num}, 评价: {quote_text}") # 4. 遵守爬虫礼仪,增加延时 time.sleep(1)
处理翻页和 POST 请求 (模拟登录)
目标: 爬取需要登录才能访问的页面,或者通过翻页获取多页数据。
分析:
- 登录: 通常通过
POST请求将用户名和密码发送到服务器的登录接口。 - 翻页: 观察 URL 的变化规律,
?start=0,?start=25,?start=50。
代码思路 (以翻页为例):
# 基于案例一,我们修改 URL 来获取下一页
base_url = 'https://movie.douban.com/top250'
start_num = 0
for i in range(10): # 爬取前10页
full_url = f"{base_url}?start={start_num}"
print(f"正在爬取第 {i+1} 页: {full_url}")
# 发送请求和解析代码与案例一相同...
# (将案例一的代码块放在这里)
start_num += 25
time.sleep(2) # 翻页间隔要长一些
处理动态网页 (JavaScript 渲染)
很多现代网站(如淘宝、微博、知乎)的内容是通过 JavaScript 动态加载的。requests 只能获取到初始的、不含动态内容的 HTML,这时就需要 Selenium 或 Playwright。
使用 Selenium 爬取动态网页示例:
-
安装库和驱动:
pip install selenium # 需要下载对应浏览器的 WebDriver (如 chromedriver) 并配置到环境变量
-
编写代码:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options from bs4 import BeautifulSoup import time # 配置 Chrome 浏览器选项 chrome_options = Options() # 无头模式,不显示浏览器窗口 # chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-gpu') chrome_options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36') # 指定 chromedriver 的路径 (如果已配置到环境变量,可以省略) # s =
