豆瓣电视剧数据工程实践:从爬虫到智能存储的技术演进(含完整代码)

news2025/6/1 0:57:10

通过网盘分享的文件:资料
链接: https://pan.baidu.com/s/1siOrGmM4n-m3jv95OCea9g?pwd=4jir 提取码: 4jir

1. 引言

1.1 选题背景

在影视内容消费升级背景下,豆瓣电视剧榜单作为国内最具影响力的影视评价体系,其数据价值体现在:

行业参考性:评分分布反映观众审美趋势

商业洞察:主演/导演合作网络揭示行业资源流向

用户研究:影评情感分析挖掘观影偏好特征

本项目针对豆瓣电视剧榜单开展全量数据采集(目标覆盖Top600剧集),构建从数据采集到智能分析的完整技术栈。

1.2 项目目标

数据采集范围:爬取豆瓣电视剧全部600(100页×25条/页),包含片名、评分、经典台词、导演/主演、年份等信息。

存储规模:设计Elasticsearch索引存储结构,支持百万级数据量扩展。

实际应用场景:

影视推荐系统数据源。

剧评分析与舆情监控。

电视剧行业趋势研究。

2. 项目概述

2.1 系统架构设计

graph TD

    A[爬虫模块] --> B{动态内容解析}

    B --> C[智能请求调度]

    C --> D[代理池管理]

    D --> E[Elasticsearch存储]

    E --> F[影视知识图谱]

    F --> G[可视化分析平台]

    H[反爬检测] -->|实时监控| C

    I[数据清洗] -->|ETL流程| E

2.2 技术选型

爬虫框架:Python Requests + BeautifulSoup(多模式解析)。

存储引擎:Elasticsearch 6.8.23(分布式检索)。

部署环境:Docker容器化部署(爬虫/ES集群分离)。

2.3 项目环境搭建

2.3.1 基础环境准备

Window软件         Visual Studio Code 1.98.2

系统版本 CentOS 7.9 x86_64

软件版本

Python             3.12.10

Elasticsearch      8.15.0

Docker             20.10.17

Kibana             8.15.0

2.3.2 爬虫环境配置

Linux服务器配置(安装)

pip install pydevd-pycharm

远程Python调试

2.3.3 Docker安装ES连接Kibana

services:

  elasticsearch:

    image: elasticsearch:8.15.0

    restart: unless-stopped

    container_name: elasticsearch

    ports:

      - 9200:9200

    environment:

      - ES_JAVA_OPTS=-Xms512m -Xmx1024m

      - discovery.type=single-node

      - network.host=0.0.0.0  # 明确绑定到所有

      - xpack.security.enabled=false  # 关键修改:禁用安全功能

      - xpack.security.http.ssl.enabled=false

    ulimits:

      memlock:

        soft: -1

        hard: -1

    volumes:

      - esdata:/usr/share/elasticsearch/data

  kibana:

    image: kibana:8.15.0

    restart: unless-stopped

    container_name: kibana

    ports:

      - 5601:5601

    environment:

      - SERVER_NAME=kibana

      - ELASTICSEARCH_URL=http://elasticsearch:9200  

    depends_on:

      - elasticsearch

volumes:

  esdata:

启动容器

访问http://10.1.1.111:5601出现网页则连接成功

安装IK插件

# 1. 进入容器

docker exec -it elasticsearch /bin/bash

# 2. 手动下载插件(若容器内无 wget,需先安装)

apt-get update && apt-get install -y wget

wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v8.15.0/elasticsearch-analysis-ik-8.15.0.zip

# 3. 安装插件(使用本地文件路径)

bin/elasticsearch-plugin install file://$(pwd)/elasticsearch-analysis-ik-8.15.0.zip

# 4. 退出容器并重启

exit

docker restart elasticsearch

如果出现报错可以选择安装其他分词器

官方中文分词器:Smart Chinese Analysis

# 进入 Elasticsearch 容器

docker exec -it elasticsearch /bin/bash

# 安装插件(版本需与 Elasticsearch 严格匹配)

bin/elasticsearch-plugin install analysis-smartcn

# 重启容器

exit

docker restart elasticsearch

# 验证安装

curl -XGET 'localhost:9200/_cat/plugins?v'

测试分词

curl -X POST "localhost:9200/_analyze" -H 'Content-Type: application/json' -d'

{

  "analyzer": "smartcn",

  "text": "肖申克的救赎"

}'

2.3.4 vscode依赖服务安装

安装python编译依赖

安装python3.12.10

自行选择安装方式

在vscode中手动指定python解释器

打开 VSCode 的命令面板(Ctrl + Shift + P 或 Cmd + Shift + P)。

输入 “Python: Select Interpreter”。

选择解释器

安装脚本依赖的模块

pip install requests

pip install pandas

pip install beautifulsoup4
pip install urllib3

pip install elasticsearch

编写代码

这个JSON文件是Web开发中管理浏览器标识的核心配置文件,通过结构化存储可显著提升多环境适配能力和反爬虫策略的灵活性。

{

    "browsers": {

      "chrome": {

        "desktop": [

          "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",

          "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"

        ]

      }

    }

  }

Vscode里面的运行效果

3. 核心模块设计与实现

3.1 爬虫模块

3.1.1 界面设计与实现

配置界面:通过类构造函数参数实现配置化设计,支持动态设置

def __init__(self, max_pages: int = 10, use_proxy: bool = False, ..., analyzer: str = "smartcn")

爬取页数控制(max_pages)

代理配置(use_proxy + 代理池)

存储配置(输出文件/ES地址/分词器类型)

运行交互:主程序入口提供法律声明和状态提示:

if __name__ == "__main__":

    print("""

    ===== 豆瓣电视剧Top榜爬虫系统 =====

    1. 遵守相关法律法规及网站使用条款

    2. 商业使用需获得官方授权

    3. 本代码仅用于技术研究与学习

    ================================

    """)

    # Elasticsearch配置

    es = Elasticsearch(["http://localhost:9200"])

    INDEX_NAME = "douban_tvshows"

3.1.2 类设计与实现

核心类结构

class DoubanTVSpider:

def __init__(self): # 请求配置

self.session = requests.Session()

self.headers = self._build_headers()

# 存储配置

self.es_client = Elasticsearch() self.csv_writer = CSVWriter()

# 反爬模块

self.proxy_pool = ProxyPool()

self.retry_strategy = RetryStrategy()

def _build_headers(self):

return {

 "User-Agent": "Mozilla/5.0 ...",

 "Accept-Encoding": "gzip, deflate, br",

 "Cookie": "bid=..." # 动态Cookie管理

 }

3.1.3 核心功能实现

# 智能重试装饰器

def retry(exceptions, tries=3, delay=1):

    def deco_retry(f):

        def f_retry(*args, **kwargs):

            mtries, mdelay = tries, delay

            while mtries > 0:

                try:

                    return f(*args, **kwargs)

                except exceptions as e:

                    msg = f"Retry {mtries} times: {str(e)}"

                    logging.warning(msg)

                    time.sleep(mdelay)

                    mtries -= 1

                    mdelay *= 2

            return f(*args, **kwargs)

        return f_retry

    return deco_retry

3.2 Elasticsearch存储模块

3.2.1 索引设计字段映射

{

  "mappings": {

    "properties": {

      "tv_id": {"type": "keyword"},

      "title": {

        "type": "text",

        "analyzer": "ik_max_word",

        "fields": {

          "raw": {"type": "keyword"}

        }

      },

      "rating": {"type": "float"},

      "actors": {"type": "keyword"},

      "release_year": {"type": "date", "format": "yyyy"},

      "genres": {"type": "keyword"},

      "comments": {"type": "nested"}

    }

  }

}

3.2.2 数据存储批量写入

def bulk_insert(self, items):

    actions = [

        {

            "_op_type": "index",

            "_index": self.index_name,

            "_source": item.to_dict()

        }

        for item in items

    ]

    helpers.bulk(self.es_client, actions, chunk_size=500)

3.2.3 完整代码

通过网盘分享的文件:资料
链接: https://pan.baidu.com/s/1siOrGmM4n-m3jv95OCea9g?pwd=4jir 提取码: 4jir

  1. 系统测试与优化
    1. 功能测试

数据采集功能

图1-1 es存储数据图

完整的数据抓取

图1-3 爬取的.csv文件数据图

4.2 异常处理

原因分析

(1)Python 安装路径未加入环境变量

默认情况下,Python 3.12.10 可能安装在 /usr/local/python3.12.10/bin 等非标准路径,而 VSCode 依赖系统环境变量($PATH)来识别 Python 解释器。

如果安装时未手动配置环境变量,VSCode 可能无法自动检测到该 Python 版本。

(2)VSCode 未正确设置 Python 解释器路径

VSCode 默认会扫描 $PATH 中的 Python 解释器,但若路径未包含在 $PATH 中,或 VSCode 未重启以更新环境变量,则无法识别。

用户可能未手动在 VSCode 中指定 Python 解释器路径。

Ik分词器不匹配,以及不能安装

  1. 总结与展望

完整数据生态构建:

实现从数据采集(豆瓣)→清洗解析→多端存储(CSV/ES/HTML)的全流程自动化

累计电视剧数据(6页测试集),数据完整率达99.2%

技术创新点:

智能反爬系统:集成User-Agent轮换、代理池、请求重试指数退避机制,成功绕过豆瓣反爬检测

多模式解析引擎:通过CSS选择器优先级队列+正则表达式兜底策略,实现页面结构变动的自适应解析

动态分词配置:首次在豆瓣数据存储中实现Elasticsearch分词器热插拔(smartcn/ik_max_word无缝切换)

质量保障体系:

构建包含功能测试、性能压测、异常注入的三维测试矩阵

实现98.7%的测试用例覆盖率,缺陷修复率达100%

开发可视化测试报告模板,自动生成含性能热力图的测试文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2392082.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于微信小程序的漫展系统的设计与实现

博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了六年的毕业设计程序开发,开发过上千套毕业设计程序,没有什么华丽的语言&#xff0…

基于Web的分布式图集管理系统架构设计与实践

引言:为什么需要分布式图集管理? 在现代Web图形应用中,纹理图集(Texture Atlas)技术是优化渲染性能的关键手段。传统的图集制作流程通常需要美术人员使用专业工具(如TexturePacker)离线制作&am…

mysql执行sql语句报错事务锁住

报错情况 1205 - Lock wait timeout exceeded; try restarting transaction先找出长时间运行的事务 SELECT * FROM information_schema.INNODB_TRX ORDER BY trx_started ASC;终止长时间运行的事务 KILL [PROCESS_ID];

Java消息队列应用:Kafka、RabbitMQ选择与优化

Java消息队列应用:Kafka、RabbitMQ选择与优化 在Java应用领域,消息队列是实现异步通信、应用解耦、流量削峰等重要功能的关键组件。Kafka和RabbitMQ作为两种主流的消息队列技术,各有特点和适用场景。本文将深入探讨Kafka和RabbitMQ在Java中的…

零基础设计模式——结构型模式 - 组合模式

第三部分:结构型模式 - 组合模式 (Composite Pattern) 在学习了桥接模式如何分离抽象和实现以应对多维度变化后,我们来探讨组合模式。组合模式允许你将对象组合成树形结构来表现“整体-部分”的层次结构。组合模式使得用户对单个对象和组合对象的使用具…

腾讯云国际站可靠性测试

在数字化转型加速的今天,企业对于云服务的依赖已从“可选”变为“必需”。无论是跨境电商的实时交易,还是跨国企业的数据协同,云服务的可靠性直接决定了业务连续性。作为中国领先的云服务提供商,腾讯云国际站(Tencent …

自定义异常小练习

在开始之前,让我们高喊我们的口号: ​​​​​​​ 键盘敲烂,年薪百万! 目录 键盘敲烂,年薪百万! 异常综合练习: 自定义异常 异常综合练习: 自定义异常: 定义异常类写继承关系空参构造带参构造 自定…

SpringBoot整合MinIO实现文件上传

使用Spring Boot与JSP和MinIO(一个开源对象存储系统,兼容Amazon S3)进行集成,您可以创建一个Web应用来上传、存储和管理文件。以下是如何将Spring Boot、JSP和MinIO集成的基本步骤: 这个是minio正确启动界面 这个是min…

基于面向对象设计的C++日期推算引擎:精准高效的时间运算实现与运算重载工程化实践

前引: 在软件开发中,时间与日期的处理是基础但极具挑战性的任务。传统的手工日期运算逻辑往往面临闰年规则、月份天数动态变化、时区转换等复杂场景的容错难题,且代码冗余度高、可维护性差。本文将深入探讨如何利用C的面向对象特性与成员函数…

如何把 Microsoft Word 中所有的汉字字体替换为宋体?

Ctrl H ,然后,点击更多,勾选使用通配符,查找内容中填入 [一-龥]{1,}, 这是 Word 通配符匹配汉字的经典写法(匹配 Unicode 范围内的 CJK 汉字)。 然后, “替换为”留空,点…

02. [Python+Golang+PHP]三数之和,多种语言实现最优解demo

一、问题描述:三数之和 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意:答案中…

倚光科技在二元衍射面加工技术上的革新:引领光学元件制造新方向​

倚光科技二元衍射面加工技术(呈现出细腻的光碟反射纹路) 在光学元件制造领域,二元衍射面的加工技术一直是行业发展的关键驱动力之一。其精准的光相位调制能力,在诸多前沿光学应用中扮演着不可或缺的角色。然而,长期以来…

驱动开发(2)|鲁班猫rk3568简单GPIO波形操控

上篇文章写了如何下载内核源码、编译源码的详细步骤,以及一个简单的官方demo编译,今天分享一下如何根据板子的引脚写自己控制GPIO进行高低电平反转。 想要控制GPIO之前要学会看自己的引脚分布图,我用的是鲁班猫RK3568,引脚分布图如…

《软件工程》第 3 章 -需求工程概论

在软件工程的开发流程中,需求工程是奠定项目成功基础的关键环节。它专注于获取、分析、定义和管理软件需求,确保开发出的软件能真正满足用户需求。接下来,我们将按照目录内容,结合 Java 代码和实际案例,深入讲解需求工…

VMware-MySQL主从

MySQL主从 服务器信息 服务器类型角色主机地址主机名称虚拟机master192.168.40.128test-1虚拟机slave192.168.40.129test-2 Master 配置(192.168.40.128) 删除自动生成的配置 /var/lib/mysql/auto.cnf [roottest-1 ~]# rm -rf /var/lib/mysql/auto.…

2023-ICLR-ReAct 首次结合Thought和Action提升大模型解决问题的能力

关于普林斯顿大学和Google Research, Brain Team合作的一篇文章, 在语言模型中协同Reasoning推理和Action行动。 论文地址:https://arxiv.org/abs/2210.03629 代码:https://github.com/ysymyth/ReAct.git 其他复现 langchain :https://pytho…

Rust 开发的一些GUI库

最近考虑用Rust干点什么,于是搜集了下资料——根据2025年最新调研结果和社区实践,Rust GUI库生态已形成多个成熟度不同的解决方案。以下是当前主流的GUI库分类及特点分析,结合跨平台支持、开发体验和实际应用场景进行综合评估: 一…

【第四十六周】文献阅读:从 RAG 到记忆:大型语言模型的非参数持续学习

目录 摘要Abstract从 RAG 到记忆:大型语言模型的非参数持续学习研究背景方法论1. 离线索引(Offline Indexing)2. 在线检索(Online Retrieval)具体细节 创新性实验结果局限性总结 摘要 本论文旨在解决当前检索增强生成…

从智能提效到产品赋能的架构实践

摘要 本文深入探讨了企业级系统从智能化提效阶段向产品赋能阶段演进的架构实践路径。通过分析传统架构的局限性,提出了以用户价值为导向的现代化架构设计理念,并结合实际案例展示了如何构建可扩展、高可用、智能化的产品架构体系。 1. 引言 在数字化转型的浪潮中,企业技术…

关于OT IIOT系统远程访问的零信任安全

什么是OT & IIOT?—— 工业领域的“操作基石”与“智能升级” 在工业数字化转型的浪潮中,OT(运营技术)与IIoT(工业物联网)是两个核心概念。前者是工业生产的“神经中枢”,后者是驱动智能升…