八月份我写过一篇《AI + 爬虫》,聊的是概念——AI 会怎么改变这门手艺。
这次来点能动手的:从零写你的第一个爬虫。
但开始之前,必须先说一件比写代码更重要的事。
一、第一个爬虫,千万别拿真实网站练手
大多数人学爬虫是这样开局的:找了个大网站,写代码一跑——要么报错,要么啥也抓不到。
然后就开始怀疑自己不适合编程。
问题不在你,在目标选错了。原因有两个:
第一,技术上你学不到东西。
真实网站几乎都有反爬:请求头校验、频率限制、动态加载、验证码。新手一上来就撞这些,等于还没学会走路就去跑障碍赛。你花三天搞清楚的东西,可能和"爬虫"本身一点关系都没有。
第二,合规上有风险。
不是所有网站都欢迎你抓。robots.txt 写了不许抓的地方,就别抓;网站服务条款明确禁止的,也别碰。新手最容易忽略这一点,而这恰恰是最要紧的。
好消息是:有一批网站,是专门建出来给你练手的。
二、认识一下我们的练习场
推荐一个:books.toscrape.com
它是一个专门为学爬虫的人做的练习站——一个假书店,1000 本书、分成 50 页。
它的存在目的就是让人练爬取,所以你抓它,不算给别人添麻烦,也完全不涉及合规问题。
学爬虫的第一课,就该在这种地方上。
三、第一步:把网页"拿"下来
爬虫的本质就两步:把网页拿下来 → 把想要的数据挑出来。
先做第一步。装好 Python 后,在命令行执行:
pip install requests beautifulsoup4 lxml
然后写下第一段代码:
```python
import requests
url = "http://books.toscrape.com/"
resp = requests.get(url, timeout=15)
print(resp.status_code) # 200 表示成功
print(len(resp.text)) # 网页内容的字符数
跑一下,你会看到 `200` 和一串数字。
这意味着你已经拿到整个网页的 HTML 了——爬虫最基础的一步,就这么简单。
> 小提示:加 `timeout` 是好习惯,避免网络卡住时程序一直死等。
四、第二步:把数据挑出来
现在的难题是:HTML 是一大坨标签,怎么找到"书名"和"价格"?
先别写代码,先找规律。
在浏览器里打开这个网站,把鼠标悬停在任意一本书上 → 右键 →检查(Inspect)。你会看到每一本书都包在一个标签里,长这样:
A Light in the Attic
£51.77
In stock
规律一下就出来了:每本书都是一个 `article`,书名在它里面的 `h3`,价格在 `price_color` 里,评分藏在 `star-rating` 的 class 名里,库存看 `instock`。
这一步才是爬虫真正的核心能力——不是写代码,是"看懂网页结构,找到重复规律"。
规律找到了,代码就是翻译:
```python
from bs4 import BeautifulSoup
soup = BeautifulSoup(resp.text, "lxml")
for item in soup.select("article.product_pod"):
title = item.h3.a["title"] # 书名
price = item.select_one("p.price_color").text # 价格
stock = item.select_one("p.instock").text.strip() # 库存
print(title, price, stock)
跑一下,20 本书的信息就列出来了。
五、第三步:翻页 + 存成表格
上面的代码只抓了第一页。想抓更多,就得翻页。
翻页的规律也一样——点一下"下一页",看地址栏怎么变的。你会发现它变成了 `page-2.html`、`page-3.html`。
那循环一下就行:
```python
import time
from bs4 import BeautifulSoup
import requests
print("开始抓取…")
for page in range(1, 4): # 先抓 3 页试试
url = f"http://books.toscrape.com/catalogue/page-{page}.html"
resp = requests.get(url, timeout=15)
soup = BeautifulSoup(resp.text, "lxml")
for item in soup.select("article.product_pod"):
title = item.h3.a["title"]
price = item.select_one("p.price_color").text
print(title, price)
time.sleep(1) # 礼貌间隔:每次请求之间停一下
注意最后那行 `time.sleep(1)`。
这不是可有可无的——它是爬虫的基本礼貌,也是保护你自己的手段。请求太快,服务器压力大,你也容易被封。哪怕对方是练习站,这个习惯也要从一开始就养成。
最后一步,把数据存下来:
```python
import csv
with open("books.csv", "w", newline="", encoding="utf-8-sig") as f:
writer = csv.writer(f)
writer.writerow(["书名", "价格"])
writer.writerow([title, price])
`encoding="utf-8-sig"` 这个细节别省——不加的话,中文用 Excel 打开会是乱码。
六、这就是你的第一个爬虫
把上面的东西合起来,不到 30 行,你就完成了一件完整的事:
访问网页 → 解析结构 → 循环翻页 → 存成文件。
我在自己的电脑上实测跑了一遍,3 页抓了 60 本书,CSV 正常生成,前几本长这样:
A Light in the Attic £51.77
Tipping the Velvet £53.74
Soumission £50.10
Sharp Objects £47.82
七、新手最容易踩的五个坑
一,拿真实大站练手。前面说过了,这是最常见的死法。
二,不看 robots.txt。网站根目录下的 `robots.txt` 文件,写明了哪些能抓、哪些不能。动手前先看一眼,这是行规。
三,不留间隔猛发请求。一秒几十次,等于在对方面前刷存在感。轻则被封,重则被认定为攻击。
四,用正则硬解 HTML。新手常想用字符串替换去抠数据,页面稍一变就全废。用解析库,别硬来。
五,抓了就不管。数据存下来不检查,结果里面一堆空值、重复、错位——抓取只占三分之一,检查数据才是剩下的三分之二。
写在最后:关于"能爬"和"该爬"
技术本身没有对错,但用技术是有边界的。三条底线,值得记住:
第一,看规矩。robots.txt 不让抓的,别抓;网站明确禁止的,别碰。
第二,看数据。别碰个人隐私信息——这不是技术问题,是法律问题。
第三,看用途。抓下来的公开数据拿来做分析、做研究,是一回事;拿去商用、转载、转卖,是另一回事。
能把数据抓下来,不代表你就该抓。这个判断,比会写代码重要得多。
最后说句实在话:爬虫入门真的不难,难的是每次都记着上面那三条。
本文代码均为本人在练习站点上的实测示例,仅供学习交流,请遵守目标网站的 robots.txt 与服务条款。
评论区聊聊:你的第一个爬虫,是拿哪个网站练的手?
热门跟贴