终端刚打印出的那两行字,证明你已经把一次完整的数据采集跑通了。尽管屏幕上只显示了两个词,但整个流程从发起请求到拿到内容再到在本地看到结果,已经走完了。

回退一步看刚才的操作:在 VS Code 的终端里敲了运行命令,文件名是 spider.py。运行后,控制台打印了那两行,说明代码成功访问了目标站点并提取到了页面里的某个文本节点。那一刻就能确认基本逻辑没问题——请求到位,解析没崩,输出也正常。说白了,就是一次端到端的小跑通,流程跟你要爬一百万条数据本质上一样,只是规模小而已。
再往前一步,spider.py 里写的内容很简单,正好五行代码(包括 import)。大意是:用 requests 发起 GET 请求,把返回的 HTML 丢给解析器,最后打印出需要的文本。示例代码可以写成这样(每行都是一条独立语句):

import requests
from bs4 import BeautifulSoup

resp = requests.get('http://books.toscrape.com/')
doc = BeautifulSoup(resp.text, 'html.parser')
print(doc.title.string.strip())
你把这五行保存为 spider.py,然后在终端里执行 python spider.py,就会看到那两行输出。简单的脚本能印证流程正确,这也是学习爬虫时常用的入门练习。
选这个目标网站不是随机选的。这是一个专门给爬虫练手的模拟书店,地址是
http://books.toscrape.com/。站点本身允许抓取,页面结构规整,适合验证请求和解析的基本功。在动手之前,知道这个背景很重大:不是所有网站都能随意抓,练习站点就是为这种教学场景准备的。
回溯到最初的环境准备:打开 VS Code,切到 Terminal,进入项目目录,新建一个 spider.py 文件,把上面那几行代码粘进去。执行时有时候会看到直接成功,有时候会碰到服务器拒绝的情况——常见的是 403 Forbidden。遇到这种就是服务器发现请求不像是真实浏览器发来的,就把访问挡掉了。
面对这种门禁,普遍的解决办法是加一个伪装头,也就是用户代理(User-Agent)。本质上是让请求看起来像是来自常用浏览器。实现很简单,在请求里带上 headers。例如在原来代码的基础上加一行 headers,再把它传给 requests.get:
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/115.0'}
resp = requests.get('http://books.toscrape.com/', headers=headers)
把伪装头加上后,同样的脚本一般就能顺利拿到页面。测试结果会在终端显示,和之前那两行输出看起来没两样。实际是,许多简单的博客或新闻站都可以用这个升级版直接爬取,前提是对方没有更复杂的反爬策略。
许多人能把代码跑起来,但不清楚背后的三步逻辑。把它拆成最粗糙的三件事就行:先发请求拿到原始 HTML;再把 HTML 解析成结构化数据;最后保存或打印出你需要的字段。把这三步弄清楚,就能把简单脚本扩展成更复杂的抓取器。
这里说几条需要注意的底线和做法。技术本身没有善恶,但使用技术的人有边界。爬虫圈里有句调侃的话:爬虫写得好,牢饭吃得饱。别把这句话当成炫耀,反而当成警示。实操中提议遵守这些原则:查看并遵守目标站点的 robots.txt;控制请求频率,避免对方服务器压力激增;不要尝试绕过付费墙或认证机制;遇到需要登录或涉及个人隐私的数据,直接停手并寻求合法渠道;如果可能,给对方留联系方式或做合理的身份说明。
另外,许多细节会影响实际效果。网络波动会导致请求失败;网页里用 JavaScript 动态渲染时,单纯请求 HTML 可能拿不到想要的内容;还有 Cookies、重定向、代理和并发这些环节,都可能在你把入门脚本放大时出现问题。这些都不是一步到位的内容,需要逐步学习和调试。别着急,一步一步来。
当你把五行代码跑通后来,可以做几件小事来练手:改成抓取多个页面的标题,或者把抓到的标题写进一个 CSV 文件;把请求延迟设置成随机的几百毫秒,观察对方服务器的响应;再试着解析出每本书的价格和评分。每多做一项,你对请求、解析、保存这三环节的理解就更厚实一点。
我说的这些都是实践路径。先从这 5 行代码开始,慢慢加上伪装头、错误处理、频率控制,再去面对更复杂的网页。学会判断什么时候该停手,这点比写更复杂的爬虫重大。
点赞、关注不迷路。



