爬虫网页

 人参与 | 时间:2026-10-17 07:27:01

写爬虫抓网页,爬虫网页十次里有八次栽在“看起来很简单”上。爬虫网页我上周想抓一个二手书网站的爬虫网页价格,页面用浏览器打开一切正常,爬虫网页右键查看源代码,爬虫网页书名、爬虫网页价格、爬虫网页库存全在。爬虫网页于是爬虫网页写了个 requests.get,拿到 HTML,爬虫网页正则一匹配——空的爬虫网页。翻来覆去查了两小时,爬虫网页最后发现那个网站用了 Vue,爬虫网页数据是爬虫网页页面加载后由 JavaScript 塞进 DOM 的。requests 拿到的爬虫网页只是骨架,肉还在后厨。

这是爬虫最经典的第一个坑:你看到的网页,和代码看到的网页,不是同一个东西。

浏览器干了太多事。它下载 HTML,解析 CSS,执行 JavaScript,渲染出你眼前花花绿绿的页面。而 requests 这类库只做第一步——把服务器返回的原始文本拿回来。如果内容是 JS 动态生成的,你手里就只有一张空壳。解决办法无非两条路:要么找到背后的 API 直接请求 JSON,要么上 Selenium、Playwright 这类工具,开一个真实浏览器去渲染。前者快,但得会看 Network 面板;后者重,但省心。我一般先翻 Network,找到接口就收工,找不到再掏浏览器。

过了这一关,第二个坑紧跟着来:反爬。

很多网站会检查请求头。你用 requests 默认的 User-Agent 是 python-requests/2.x,等于举着牌子喊“我是机器人”。改一下 UA 是最基本的礼貌。再进一步,有的站点看 Referer,看 Cookie,甚至看你请求的频率。我抓过一个小说站,单 IP 每分钟超过二十次就返回 403,封十分钟。后来加了 time.sleep(random.uniform(1, 3)),模拟人翻页的节奏,就再没被封过。随机延迟这件事,写起来就一行,但能省掉很多麻烦。

还有更隐蔽的——字体反爬和 CSS 偏移。

某点评网站把数字用自定义字体渲染,你抓到的“128”在源码里其实是乱码,只有配合字体文件才能还原。另一个招聘网站更绝,用 CSS 的 ::before 伪元素把关键信息藏在样式表里,DOM 里根本看不到。对付这些,要么解析字体文件做映射,要么用 OCR 截图识别。说实话,到了这一步,爬虫已经变成一场猫鼠游戏,拼的是耐心和逆向能力。

那有没有省事的办法?有。如果目标网站结构稳定、量不大,直接上无头浏览器。Playwright 现在是我的首选,装好之后 page.goto(),等 networkidle,再 page.content(),拿到的就是渲染完的完整 HTML。配合 page.wait_for_selector() 等元素出现,比手动分析接口稳得多。代价是慢,一个页面两三秒,但胜在通用。抓个几百页的静态内容,完全够用。

最后说一个容易被忽略的点:法律和 robots.txt。

robots.txt 不是法律,但它是网站明确表达的意愿。我一般会看一眼,如果 Disallow 了我要抓的路径,就换目标或者找官方 API。抓公开数据、控制频率、不碰个人隐私、不搞垮对方服务器,这是底线。见过有人写多线程爬虫把人家小站打挂的,那就不是技术问题,是缺德。

爬虫写多了会发现,核心不是代码多漂亮,而是对网页运行机制的理解。知道浏览器怎么工作,知道 HTTP 怎么交互,知道前端怎么渲染,剩下的就是查文档和试错。工具一直在变,从 urllib 到 requests 到 httpx 到 Playwright,但底层逻辑没变过。把逻辑搞清楚了,换什么库都只是语法问题。

顶: 23992踩: 8382