Python3 爬虫实战教程:静态网站全站爬取
1. 前言
不想啃复杂的解析库 / 框架?原生 Python 也能搞定全站爬取!
如果你刚接触爬虫,看到 BeautifulSoup、Scrapy 一长串配置就头疼——别慌,今天我们用 requests + 内置正则 re 就能完成一个完整的公开练手电影站项目。从列表页抓链接、详情页提取字段,到 JSON 存储,最后再加个多进程提速。目标站反爬很宽松,非常适合上手练习。
通过这个案例你会掌握:
- 轻量级 HTTP 请求的封装
- 静态 HTML 的快速正则解析
- 「列表页 → 详情页」的分层跳转逻辑
- 多进程并行爬取,效率翻倍
- 入门级爬虫常见的 “坑” 与修复方法
2. 技术准备
先搭个极简环境,几乎不用额外装东西:
- 确保本地有 Python 3.6+(兼容 f-string 和多进程
Pool的常规写法) - 安装核心依赖:
💡 用到的库都是轻量级 / 原生自带的:
- requests:比 urllib 写起来爽 10 倍的 HTTP 库
- re:Python 内置正则,解析简单静态 HTML 足够
- logging:记录爬取状态,调试必备
- json / os:数据存储和文件管理
- multiprocessing:多进程提速(练手站单进程也行,但学了总有用)
3. 目标网站分析
练手站地址:https://ssr1.scrape.center/
打开一看,结构非常清晰,简直是给爬虫练习准备的模板。
3.1 页面结构
- 列表页:URL 规则固定为
/page/{页码},从 1 到 10(对应后面代码中的TOTAL_PAGE),每页 10 部电影 - 详情页:每个电影卡片的电影名是一个带
class="name"的<a>标签,href是相对路径,需要拼接根域名BASE_URL
3.2 要抓的字段
详情页里包含这些公开信息:
- 封面图片 URL
- 电影名称
- 电影类别(标签数组)
- 上映时间
- 评分
- 剧情简介
4. 带坑修复的完整代码
下面直接给出最终可用的完整版,里面修复了几个新手容易遇到的坑(转义警告、死等、文件名非法字符等),逻辑也更规范。你可以直接复制运行,边看注释边理解。
5. 核心流程拆解
为了让你更容易上手,我们把上面的代码拆成 3 层来看,每一层都只做一件事,职责清晰。
5.1 请求统一入口
不管是列表页还是详情页,都调用同一个 scrape_page() 函数。这样做的好处是:
- 避免重复写
try...except和状态码判断 - 统一管理超时、异常日志,后期要加请求头或代理也只需改一处
5.2 分层解析
-
列表页解析(
parse_index)
用正则匹配所有class="name"的<a>标签,提取href,再用urljoin()拼接出完整的详情页 URL。返回 生成器 而不是列表,可以边爬边解析,省内存。 -
详情页解析(
parse_detail)
针对每一个想要抓取的字段写好对应的正则,加上re.S模式防止换行干扰匹配。如果某个字段没找到,用默认值替代,保证程序不会因为某个页面缺失数据而整段崩溃。
5.3 数据存储 + 多进程
- 存储:以电影名作文件名,提前用正则把冒号、斜杠等非法字符替换成下划线。JSON 文件统一放在
results/文件夹下,方便后续检查。 - 多进程:使用
multiprocessing.Pool()把 10 个页面的任务分发给多个进程同时执行,比单进程串行访问快得多。⚠️ 注意:
pool.map()会阻塞主进程,直到所有子任务结束;最后记得调用pool.close()和pool.join()。
6. 进阶优化建议
目前这个版本已经可以拿来直接用,但如果将来你想爬更复杂的网站,可以考虑以下小优化:
-
加上合理的请求头
大部分网站会检查User-Agent,可以这样加上: -
随机延迟
在每次请求之间time.sleep(1~3)随机秒数,降低请求频率,避免触发反爬。 -
代理支持
如果 IP 被封,可以引入代理池,在requests.get()里加上proxies参数。 -
断点续爬
用一个简单的数据库或 JSON 文件记录已经成功爬取过的 URL 或电影名,程序中断后重启时可以跳过已抓取的部分。 -
替换解析库
当页面结构变复杂、正则难以维护时,可以考虑换用BeautifulSoup4或lxml,让代码可读性更高。
7. 总结
今天的案例覆盖了 静态爬虫的核心流程:统一请求 → 分层解析 → 结构化存储,再配合多进程提速和 5 个实战中容易踩的坑的修复方案。整个项目只用到 Python 内置库加一个 requests,非常适合入门练手。
你可以试试把代码里的字段替换成自己感兴趣的内容,或者换个结构类似的公开练手站(比如一些书籍目录站、新闻列表站)跑跑看,把学到的思路真正用起来。
最后,再提醒一句:爬虫虽好,请勿爬取未经授权的数据,也不要对目标站造成过大的服务器压力哦~

