两年前用Python写的 B 站电影爬虫,重启回忆与新思考
本文最后更新于22 天前,其中的信息可能已经过时,如有错误请发送邮件到3496667827@qq.com
AI智能摘要
两年前,我使用Python编写了一个B站电影排行爬虫。现在重访旧代码,不仅唤起了回忆,还带来了新的思考。当时主要依靠正则表达式和简单的请求头来提取数据,但这种方法既低效又易出错。随着技术的发展,现在的反爬措施更加严格,需要处理Cookie、动态参数以及面对验证码和JS混淆。此外,当时的异常处理也非常简单,没有进行适当的防御措施。 为了优化和拓展这个爬虫项目,我对代码进行了重构,采用了更规范和健壮的编程风格。通过引入requests库,并定义一个独立的函数来处理网络请求,提高了代码的可读性和可维护性。同时,我也对异常处理进行了改进,加入了try-except结构,确保在遇到错误时能够优雅地处理。 这次“考古”不仅让我回顾了过去的编程经验,还为我提供了宝贵的教训和启示。在未来的项目中,我将更加注重代码质量、安全性和扩展性,以适应不断变化的技术环境。

翻到两年前写的 Python 爬虫代码,那会儿为了爬 B 站电影排行,折腾请求头、正则匹配,现在重新打开,连带着回忆和新感悟一起涌上来,记录下这段 “考古” 过程~

一、旧代码回顾:那时的思路与实现

import requests
import re

url = 'https://api.bilibili.com/pgc/season/rank/web/list?day=3&season_type=2'
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.0.0',
    'Referer': 'https://www.bilibili.com/popular/rank/movie/?from_spmid=666.7.heatlist.more'
}
res = requests.get(url, headers=headers)

# 用正则提取电影名和链接
电影名 = re.findall('"title":"(.*?)"', res.text)
电影链接 = re.findall('"url":"(.*?)"', res.text)

movie_dict = {}
for 电影名, 电影链接 in zip(电影名, 电影链接):
    movie_dict[电影名] = 电影链接

for 电影名, 电影链接 in movie_dict.items():
    print(f"{电影名}:{电影链接}")

当时的思路

  • 直接用 requests 硬刚接口,靠 User - Agent 和 Referer 伪装浏览器;
  • 正则表达式当 “万能提取器”,不管结构直接挖字符串;
  • 用 zip 简单配对数据,功能实现就满足,完全没考虑扩展性。

二、现在看旧代码:槽点与成长

(一)被时代淘汰的 “野路子”

1.正则硬刚 JSON

现在才懂,API 返回明明是 JSON 数据,却用正则暴力解析,既易错(结构变一点就失效)又低效。当时要是学 res.json() 直接解析字典,代码能简洁一半:

data = res.json()
电影名 = [item['title'] for item in data['result']]
电影链接 = [item['url'] for item in data['result']]

(不过也理解,当时刚接触爬虫,能提取到数据就很兴奋,顾不上优雅…)

2.反爬意识太 naive

两年前 B 站反爬没现在严格,靠简单请求头就能过。放到现在,这种写法大概率被拦截 —— 需要加 Cookie、处理动态参数,甚至面对验证码、JS 混淆。

3.异常处理等于零

代码里没写 try - except,网络波动、接口改结构直接报错崩溃。现在写代码,会习惯性加防御:

try:
    res = requests.get(url, headers=headers, timeout=10)
    res.raise_for_status()  # 非 200 状态直接抛异常
except requests.RequestException as e:
    print(f"请求失败:{e}")

三、重启项目:优化与拓展

(一)重构代码:更规范、更健壮

import requests

def get_bilibili_movies():
    url = 'https://api.bilibili.com/pgc/season/rank/web/list?day=3&season_type=2'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
        'Referer': 'https://www.bilibili.com/'
    }
    
    try:
        res = requests.get(url, headers=headers, timeout=15)
        res.raise_for_status()
        data = res.json()
        
        # 直接解析 JSON 数据
        movies = []
        for item in data.get('result', []):
            movies.append({
                'title': item.get('title', '无标题'),
                'url': item.get('url', '无链接'),
                'score': item.get('score', '无评分')  # 新增评分字段
            })
        return movies
    
    except requests.RequestException as e:
        print(f"获取数据失败:{e}")
        return []

if __name__ == '__main__':
    movies = get_bilibili_movies()
    for idx, movie in enumerate(movies, start=1):
        print(f"【{idx}】{movie['title']} - {movie['score']}\n链接:{movie['url']}\n")

优化点

  • 用 JSON 解析替代正则,更稳定、可读性高;
  • 增加异常处理,网络问题不崩溃;
  • 扩展数据(如评分),让信息更完整;

(二)功能拓展:从 “能跑” 到 “好用”

1.数据持久化:

以前直接打印,现在可以存成 CSV/Excel:

import csv
with open('b站电影排行.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.DictWriter(f, fieldnames=['title', 'url', 'score'])
    writer.writeheader()
    writer.writerows(movies)

2.可视化展示:

用 pandas 或 matplotlib 做简单分析,比如按评分排序、统计高分电影占比,让数据更直观。

3.定时更新 + 通知:

结合 schedule 库定时爬取,用邮件 / 微信推送新上榜电影,真正让代码 “有用” 起来。

四、回忆与成长:两年的意义

看着两年前的代码,想起当时为了调通正则熬夜,为成功爬取到 100 条数据欢呼。现在虽然觉得代码很 “稚嫩”,但正是这些 “野路子”,让我一步步摸到编程的门道。

对比现在,能明显感受到:

  • 从 “实现功能” 到 “考虑健壮性、可维护性”;
  • 从 “暴力破解” 到 “尊重接口规范、数据结构”;
  • 从 “写代码玩” 到 “思考实际价值”。

这两年,代码能力在变,对编程的理解也在变。旧代码像时光胶囊,提醒我:进步就是回头看时,能清晰发现 “以前好傻,但当时真的很勇敢”

如果你也翻到旧项目,不妨也重构试试,说不定能挖到比代码更珍贵的成长~

(注:爬虫需遵守网站 robots.txt 协议和相关法律法规,本项目仅用于学习交流,合理使用数据哦~)

觉得有帮助可以投喂下博主哦~感谢!
作者:Hueil
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 协议
转载请注明 文章地址 及 作者 哦~
暂无评论

发送评论 编辑评论


                
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇