爬虫入门:从零开始抓取数据
大家好!我是韧初!今天给大家介绍 爬虫,与诸君共勉!
一、什么是爬虫?
网络爬虫(Web Crawler),也叫网络蜘蛛(Spider),是一种自动获取网页内容的程序。简单来说,就是用代码模拟浏览器访问网站,把需要的数据(合法合规)“爬”下来。
举个例子:你想把某个新闻网站的所有标题保存下来,手动复制粘贴几百篇太慢,写个爬虫几分钟就能搞定。
二、入门需要哪些基础知识?
| 知识领域 | 最低要求 | 推荐学习资源 |
|---|---|---|
| Python 基础 | 变量、循环、函数、文件操作 | 廖雪峰 Python 教程 |
| HTTP 协议 | 了解 GET/POST,状态码 200/404/403 | MDN HTTP 文档 |
| HTML/CSS | 知道标签、id、class,能看懂 DOM 树 | W3School HTML 教程 |
| 正则表达式(可选) | 简单匹配文本 | 菜鸟教程正则表达式 |
如果你已经会用 Python 写 for 循环和函数,就可以开始写第一个爬虫了。
三、爬虫的基本原理
爬虫的工作流程可以用四步概括:
- 发送请求:向目标服务器发起 HTTP 请求(就像在浏览器里输入网址按回车)。
- 获取响应:服务器返回 HTML、JSON 或其它数据。
- 解析内容:从返回的数据中提取出你真正关心的信息(比如标题、链接、价格)。
- 存储数据:把提取到的内容保存到文件或数据库。
下面过程让你一目了然:
[启动] → [请求URL] → [接收响应] → [解析数据] → [存储] → [循环下一页?] → [结束]
即
爬虫任务的生命周期:
初始化 → 发起 HTTP 请求 → 获取响应内容 → 解析/提取数据 → 持久化存储 → 判断分页/翻页(循环) → 任务终止
四、环境准备
只需要安装 Python 和两个库:
pip install requests beautifulsoup4
requests:发送 HTTP 请求,最常用的库。beautifulsoup4:解析 HTML,帮你从网页中快速提取数据。
五、第一个爬虫:抓取 quotes.toscrape.com 的名言
这是一个专门用来练习爬虫的网站,没有反爬机制,非常适合入门。
目标
抓取首页上所有名言的文字和作者,并保存为 JSON 文件。
代码实现
import requests
from bs4 import BeautifulSoup
import json
# 1. 发送请求
url = "http://quotes.toscrape.com/"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
response = requests.get(url, headers=headers)
# 检查请求是否成功
if response.status_code != 200:
print(f"请求失败,状态码:{response.status_code}")
exit()
# 2. 解析 HTML
soup = BeautifulSoup(response.text, "html.parser")
# 3. 提取数据
quotes_data = []
quote_divs = soup.find_all("div", class_="quote")
for div in quote_divs:
text = div.find("span", class_="text").get_text()
author = div.find("small", class_="author").get_text()
quotes_data.append({
"text": text,
"author": author
})
# 4. 存储为 JSON
with open("quotes.json", "w", encoding="utf-8") as f:
json.dump(quotes_data, f, indent=2, ensure_ascii=False)
print(f"抓取完成,共 {len(quotes_data)} 条名言,已保存到 quotes.json")
运行结果
运行后当前目录会生成 quotes.json,内容类似:
[
{
"text": "“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”",
"author": "Albert Einstein"
},
{
"text": "“It is our choices, Harry, that show what we truly are, far more than our abilities.”",
"author": "J.K. Rowling"
}
]
六、常见问题与解决
1. 请求被拒绝(状态码 403)
原因:服务器检测到你是爬虫(没有 User-Agent 或请求太快)。
解决:加上 headers 伪装浏览器,并且 time.sleep(1) 放慢速度。
请求最好间隔 1 秒,虽然一般网站允许爬取,但仍建议礼貌爬取,避免造成服务器请求过快的压力。
2. 拿到的 HTML 里没有我想要的数据
(1)原因:现代网页为了提高用户体验或减轻服务器压力,经常采用前后端分离或异步加载的模式:
-
首次返回的 HTML 只是一个“骨架”——包含结构、样式和空的容器(如
<div id="app"></div>)。 -
真实数据 是在页面加载完成后,由页面中运行的 JavaScript 向后台的 Ajax / Fetch 接口请求,拿到数据后再通过 DOM 操作动态插入到页面上。
所以,你用
requests、curl或任何只获取静态 HTML 的工具,只能拿到那个“骨架”,当然找不到你想要的数据。
(2)如何确认是动态加载?
用浏览器开发者工具验证(以 Chrome 为例):
- 打开目标网页,右键 → 检查(或按
F12)。 - 切换到 Network(网络) 标签页。
- 刷新页面(
F5或Ctrl+R)。 - 在 Network 面板中过滤 Fetch/XHR(或查看
All)。 - 寻找返回数据格式为 JSON、XML 或包含关键字段的请求。
典型特征:
- 请求 URL 里常有
api、data、list、get等字样。 - 响应预览中可以看到类似
{ "code": 200, "data": [...] }的结构。
示例:抓取一个股票行情页面,你会发现 HTML 源码里没有价格,但 Network 里有一个 getStockPrice?code=000001 的请求,返回纯 JSO
(3) 解决:用浏览器开发者工具的 Network 标签寻找真实的 Ajax 接口。 找到真实的数据接口后,直接向该接口发送请求,就能拿到结构化数据(通常是 JSON)。
步骤:
- 在 Network 中找到那个接口请求。
- 右键 → Copy → Copy as cURL(或复制请求 URL)。
- 分析请求方式(GET / POST)、请求头(Headers)、参数(Query String 或 Form Data)。
- 用代码模拟这个请求。
示例(Python + requests) :
python
import requests
url = "https://api.example.com/getData"
headers = {
"User-Agent": "Mozilla/5.0 ...",
"Referer": "https://example.com/",
"X-Requested-With": "XMLHttpRequest", # 常见标识
}
params = {
"page": 1,
"size": 20
}
resp = requests.get(url, headers=headers, params=params)
data = resp.json() # 直接解析 JSON
print(data)
优点:速度快、资源消耗低、直接获得结构化数据。
缺点:接口可能有反爬(如 token、签名、加密参数),需要逆向分析 JS 逻辑。
3. 中文乱码
通常为编码类型出现问题。
解决:在 requests.get() 后查看 response.encoding,通常设为 utf-8 即可。或者在 open 文件时指定 encoding="utf-8"。
七、如何避免违法与封 IP?
- 遵守 robots.txt:在网站根目录加上
/robots.txt查看哪些路径允许爬取。 - 控制频率:加上
time.sleep(1),不要一秒内请求几十次。 - 不要爬取个人隐私数据(手机号、身份证、地址)。
- 用于学习研究,不要用爬取的数据直接商用(尤其是竞争对手的数据)。
八、要想进阶,下一步该学什么?
你已经学会了静态网页爬虫。进阶路线:
- 动态网页:学习 Selenium 或 Playwright,抓取 JavaScript 渲染的页面。
- 反爬对抗:代理 IP、请求头随机化、验证码识别。
- 大规模爬取:Scrapy 框架、分布式爬虫、Redis 队列。
- 数据清洗:Pandas 处理缺失值、重复数据。
九、推荐学习资源
| 类型 | 名称 |
|---|---|
| 书籍 | 《Python 网络爬虫从入门到实践》 |
| 书籍 | 《Web Scraping with Python》(Ryan Mitchell) |
| 在线 | B站搜索“爬虫入门 2025” |
| 练习网站 | quotes.toscrape.com/ , books.toscrape.com/ |
写在最后
爬虫是一个“以巧破千斤”的技能,能让你快速获取互联网上的公开数据。本文从一个最简单的例子出发,希望你动手试一试。遇到问题不要怕,多用 print() 调试,多查官方文档。祝你爬得开心,学得扎实!
学海无涯,难免疏漏,还望方家指正。共勉。