type
Post
status
Published
date
Jan 22, 2025
slug
爬虫技术入门
summary
我从大学开始写爬虫,工具从 requests 换到 Scrapy 再换到 Playwright。这篇串起来讲讲我用过的几样东西适合什么场景,以及那些踩坑了才记住的经验。
tags
工具
category
技术分享
icon
password
synced
paired_with
3551d487-a2a1-8142-beef-e8f5086de1f0
source_hash
5d0e12b7b17a1653031bac1fd358b3216dead84cfc40e0f0c3d13c9e6e9009e4
translation_locked
translation_locked
我从大学时代开始写爬虫,从最早抓贴吧帖子,到后来抓股价、抓豆瓣、抓 GitHub trending,工具也从 requests 一路换到 Scrapy 再到 Playwright。这篇不是想写成"全网爬虫指南",而是把我自己一路用过的几样东西串起来讲讲,它们各自适合什么场景,以及那些一开始不知道、后来踩坑了才记住的事。
先说合规
写爬虫之前,先看 robots.txt。这是网站告诉爬虫"哪些目录欢迎你、哪些请绕开"的协议,用 Python 检查一下两行就够。
robots.txt 不是法律,不遵守它不会被起诉。但它是网站愿不愿意配合你的信号,你不尊重它,对方就会出手段。那些手段比 robots.txt 烦得多,IP 封禁、加验证码、加 JS 加密、加风控规则,每一项都够你折腾几天。
还有一条,爬来的数据怎么用。爬公开页面拿来分析自己看一般没事,转手卖、用来训练模型、绕开付费墙这些行为可能踩法律红线,自己掂量。
我现在的工具盘
不同场景我会用不同的工具,简单分三档。
第一档,小活快办。requests + BeautifulSoup。一段代码就能拉网页解析出来。
第二档,要并发。aiohttp + asyncio。同时拉几百个 URL 不阻塞。
第三档,要工程化。Scrapy。带调度器、去重、管道、中间件。一个抓取任务能跑几天,断点恢复、限速、写入数据库这些都内置好了。
如果页面是 SPA、内容靠 JS 渲染才出现,这三个都不行,得上无头浏览器。我现在偏 Playwright 多一些,比 Selenium 快,API 也更现代。
反爬这件事
被网站发现你是爬虫之后,一般会按这个顺序拦你。
- 看 UA。默认 requests 的 UA 就长得像爬虫,第一时间换成浏览器的 UA 字符串
- 看 IP 频率。同一个 IP 短时间内打太多次,封。解法是放慢速度(最简单)或者上代理池(贵但管用)
- 看 Cookie / Session。要登录的页面,开个
requests.Session()把登录态保住
- 上验证码。这一步基本就是网站在告诉你"别玩了"。强行硬刚成本极高,OCR 加打码平台一套下来不如直接放弃
代理池写起来不难,难的是养出可用的代理。免费代理基本都死的,付费代理几十块一天起步,看你抓的东西值不值这个钱。
解析的几种姿势
抓回来的 HTML 怎么提数据,主要这几种。
- BeautifulSoup。最容易上手,写起来像 jQuery
- lxml + XPath。语法陡一点,但快、稳,结构复杂的页面用它
- PyQuery。直接 jQuery 语法的 Python 实现,写过前端的会一秒上手
- 正则。能不用就不用。HTML 是树形结构不是字符串流,强行用正则解析迟早翻车
我一般首选 lxml + XPath,配 Scrapy 用顺手。简单的活直接 BeautifulSoup。
一些经验之谈
写爬虫这么多年,留下来印象最深的不是技术,是这几条。
- 慢一点。每个请求之间加 sleep 1 到 3 秒,对方根本不会注意到你。比并发轰炸然后被封,长远收益高很多
- 存好原始 HTML。先把完整的 HTML 落到本地,解析过程在本地跑。这样改解析逻辑不用重抓,调试爽十倍
- 写好失败重试。网络抖动是常态,每个请求外面套一个最多三次的重试,配指数退避
- 别相信 selector。今天
.title明天可能改成.article-title。爬虫的脆弱性主要来自页面结构变化,写监控、写报警,比写代码更重要
📎 参考文章
- 作者:LeoQin
- 链接:https://leoqin.com/article/%E7%88%AC%E8%99%AB%E6%8A%80%E6%9C%AF%E5%85%A5%E9%97%A8
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
