爬虫入门——从零开始抓取数据

1 阅读6分钟

爬虫入门:从零开始抓取数据

大家好!我是韧初!今天给大家介绍 爬虫,与诸君共勉!

一、什么是爬虫?

网络爬虫(Web Crawler),也叫网络蜘蛛(Spider),是一种自动获取网页内容的程序。简单来说,就是用代码模拟浏览器访问网站,把需要的数据(合法合规)“爬”下来

举个例子:你想把某个新闻网站的所有标题保存下来,手动复制粘贴几百篇太慢,写个爬虫几分钟就能搞定。

图片.png


二、入门需要哪些基础知识?

知识领域最低要求推荐学习资源
Python 基础变量、循环、函数、文件操作廖雪峰 Python 教程
HTTP 协议了解 GET/POST,状态码 200/404/403MDN HTTP 文档
HTML/CSS知道标签、id、class,能看懂 DOM 树W3School HTML 教程
正则表达式(可选)简单匹配文本菜鸟教程正则表达式

如果你已经会用 Python 写 for 循环和函数,就可以开始写第一个爬虫了。


三、爬虫的基本原理

爬虫的工作流程可以用四步概括:

  1. 发送请求:向目标服务器发起 HTTP 请求(就像在浏览器里输入网址按回车)。
  2. 获取响应:服务器返回 HTML、JSON 或其它数据。
  3. 解析内容:从返回的数据中提取出你真正关心的信息(比如标题、链接、价格)。
  4. 存储数据:把提取到的内容保存到文件或数据库。

下面过程让你一目了然:

[启动] → [请求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 操作动态插入到页面上。

    所以,你用 requestscurl 或任何只获取静态 HTML 的工具,只能拿到那个“骨架”,当然找不到你想要的数据。

(2)如何确认是动态加载?

用浏览器开发者工具验证(以 Chrome 为例):

  1. 打开目标网页,右键 → 检查(或按 F12)。
  2. 切换到 Network(网络) 标签页。
  3. 刷新页面(F5Ctrl+R)。
  4. 在 Network 面板中过滤 Fetch/XHR(或查看 All)。
  5. 寻找返回数据格式为 JSON、XML 或包含关键字段的请求。

典型特征:

  • 请求 URL 里常有 apidatalistget 等字样。
  • 响应预览中可以看到类似 { "code": 200, "data": [...] } 的结构。

示例:抓取一个股票行情页面,你会发现 HTML 源码里没有价格,但 Network 里有一个 getStockPrice?code=000001 的请求,返回纯 JSO

(3) 解决:用浏览器开发者工具的 Network 标签寻找真实的 Ajax 接口。 找到真实的数据接口后,直接向该接口发送请求,就能拿到结构化数据(通常是 JSON)。

步骤

  1. 在 Network 中找到那个接口请求。
  2. 右键 → CopyCopy as cURL(或复制请求 URL)。
  3. 分析请求方式(GET / POST)、请求头(Headers)、参数(Query String 或 Form Data)。
  4. 用代码模拟这个请求。

示例(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),不要一秒内请求几十次。
  • 不要爬取个人隐私数据(手机号、身份证、地址)。
  • 用于学习研究,不要用爬取的数据直接商用(尤其是竞争对手的数据)。

八、要想进阶,下一步该学什么?

你已经学会了静态网页爬虫。进阶路线:

  1. 动态网页:学习 Selenium 或 Playwright,抓取 JavaScript 渲染的页面。
  2. 反爬对抗:代理 IP、请求头随机化、验证码识别。
  3. 大规模爬取:Scrapy 框架、分布式爬虫、Redis 队列。
  4. 数据清洗:Pandas 处理缺失值、重复数据。

九、推荐学习资源

类型名称
书籍《Python 网络爬虫从入门到实践》
书籍《Web Scraping with Python》(Ryan Mitchell)
在线B站搜索“爬虫入门 2025”
练习网站quotes.toscrape.com/ , books.toscrape.com/

写在最后

爬虫是一个“以巧破千斤”的技能,能让你快速获取互联网上的公开数据。本文从一个最简单的例子出发,希望你动手试一试。遇到问题不要怕,多用 print() 调试,多查官方文档。祝你爬得开心,学得扎实!

学海无涯,难免疏漏,还望方家指正。共勉。