当前位置:首页 > 探索

可以爬取的网站

```html 可以爬取的可爬网站

可以爬取的网站

2025年4月 · 技术笔记

昨天帮朋友抓一个公开的天气历史数据,写了个小脚本,网站十分钟搞定。可爬他有点惊讶:“现在爬虫不是网站很容易被封吗?”我回了一句:封的是行为,不是可爬网站本身。绝大多数网站并没有你想的网站那么“反爬”,只是可爬你没找对路子。

先说一个我常用的网站例子:books.toscrape.com。这个网站是可爬专门给人练手用的,页面结构几十年不变,网站没有任何反爬机制,可爬连robots.txt都写着“随便爬”。网站它的可爬存在本身就说明一件事——有些网站就是让你爬的。比如公开的网站政府数据门户、大学实验室的可爬开放数据集、维基百科的静态镜像站。这些地方的数据本来就是公开资源,你写个脚本批量拿下来,没人会找你麻烦。

但现实里更常见的情况是:网站没明说禁止,但也没说欢迎。这时候就得看robots.txt了。我习惯先敲一行命令:curl https://目标网站/robots.txt。如果看到Disallow: /,那基本可以放弃,除非你打算跟对方玩猫鼠游戏。如果只禁了后台路径(/admin/、/search/),那说明前台内容大概率是开放的。比如豆瓣的robots.txt就只禁了部分动态接口,静态页面随便看。不过豆瓣后来加了频率限制,你爬太快照样封IP——这就是另一回事了。

“能爬”不等于“该爬”。我见过有人写脚本把某政府公开数据站整站拖下来,结果对方服务器扛不住,直接挂了。后来那个站加了验证码,所有人都得手动查。一个人图方便,把所有人的路堵死了。

技术层面,判断一个网站能不能爬,我一般看三点。第一,数据是不是服务端渲染的。打开开发者工具,刷新页面,如果Network里能看到完整的HTML返回,那基本没问题。如果是React或Vue那种前端渲染,数据藏在XHR请求里,那就得分析接口。第二,有没有登录墙。需要登录才能看的内容,爬虫得带cookie,这就涉及账号安全,不建议碰。第三,请求频率。再开放的网站,你一秒发一百个请求,对方也会把你当DDoS打。

我自己的习惯是:先用requests裸奔试一次,不加任何header。如果返回403,再加User-Agent。如果还不行,就上selenium或者playwright模拟浏览器。但说真的,大部分公开数据站,连User-Agent都不查。比如quotes.toscrape.com,你用curl都能直接拿到内容。另一个我常爬的是news.ycombinator.com,它的页面结构极其简单,robots.txt只禁了/vote和/reply,首页和评论页随便抓。我写过一个脚本每天抓前100条帖子存到本地数据库,跑了两年多,从来没被封过。

# 一个极简的检查脚本,判断网站是否对爬虫友好
import requests
url = "https://example.com/robots.txt"
resp = requests.get(url, timeout=5)
if resp.status_code == 200:
    print(resp.text[:500])
else:
    print("没有robots.txt,谨慎行事")

最后说个反直觉的:有些网站看起来反爬很凶,其实只是纸老虎。比如某电商平台的商品列表页,你直接请求会返回验证码,但如果你把Accept-Language改成en-US,再随便填个Referer,它就不拦了。为什么?因为它的风控规则是给普通用户设计的,不是给爬虫设计的。你稍微伪装一下,它就当你是正常访客。当然,这种技巧我不建议用在商业网站上,毕竟人家写了Terms of Service。但如果是学术研究、个人兴趣,抓个几百条数据,问题不大。

说到底,可以爬取的网站分两类:一类是明确允许的,比如开放数据集、练手靶场;另一类是默认不禁止的,比如大部分新闻站、论坛、博客。前者你随便爬,后者你控制频率、遵守robots.txt、别给人家服务器添堵。至于那些需要登录、有严格反爬、明确写在用户协议里禁止爬取的——绕过去的方法当然有,但没必要。数据那么多,换个地方抓就是了。

```

分享到: