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

通过网盘分享的文件:资料
链接: 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.pswp.cn/news/907402.shtml

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

相关文章

集成均衡功能电池保护芯片在大功率移动电源的应用,创芯微CM1341-DAT、杰华特JW3312、赛微微电CW1244、中颖SH366006

一文了解集成均衡功能电池保护IC在大功率移动电源的应用 创芯微CM1341-DAT 创芯微CM1341-DAT是一款专用于4串锂离子/磷酸铁锂电池的保护芯片,内置有高精度电压检测电路和电流检测电路。通过检测各节电池的电压、充放电电流及温度等信息,实现电池过充电…

PHP生成pdf方法

1:第一种方法: 主要使用PHP的扩展 【 “spatie/browsershot”: “3.57”】 使用这个扩展生成PDF需要环境安装以下依赖 1.1:NPM【版本:9.2.0】 1.2:NODE【版本:v18.19.1】 1.3:puppeteer【npm in…

联通专线加持!亿林网络 24 核 32G 裸金属服务器,千兆共享带宽适配中小型企业 IT 架构

在当今数字化时代,企业的业务运营越来越依赖高效、稳定的 IT 架构。对于中小型企业而言,如何在有限的预算内构建强大且可靠的 IT 基础设施,是一项关键挑战。亿林网络推出的 24 核 32G 裸金属服务器,搭配联通专线和千兆共享带宽&am…

SQL计算列

SqlServer: ALTER TABLE KC_BILLHEAD ADD bill_no AS coalesce(billno , ) PERSISTED; 这是一个SQL语句,用于向表KC_BILLHEAD添加一个计算列bill_no。让我解释一下这个语句的各个部分: ALTER TABLE KC_BILLHEAD - 修改表KC_BILLHEAD的结构 ADD bill_n…

利用海外代理IP,做Twitter2026年全球趋势数据分析

近年来,社交媒体趋势分析逐渐成为品牌监控、市场洞察和消费者研究的必备工具。而当谈到全球趋势数据分析,很多人都会立即想到 Twitter趋势(逼近连美丽国的总统都喜欢在上面发表自己的看法- -!!!)。Twitter趋势,即Twitt…

【Vue3】Vue3 + TypeScript 中如何区分开发和生产环境的 API 地址(支持 axios 请求

Vue3 TypeScript 中如何区分开发和生产环境的 API 地址(支持 axios 请求) 在实际项目开发中,我们通常会遇到以下需求: 本地开发时访问的是本地 API(如 http://localhost:3000);上线打包后访问…

【数据结构】线性表之“双链表(带头循环双向链表)”

- 第 99 篇 - Date: 2025 - 05 - 25 Author: 郑龙浩/仟墨 【数据结构】 续上一篇: 线性表之“单链表” 文章目录 “双链表(带头双向循环链表)” 的实现:分步解释所有函数:test.cDListNode.hDListNode.c “双链表(带头双向循环链表…

【学习笔记】Transformer

学习的博客(在此致谢): 初识CV - Transformer模型详解(图解最完整版) 1 整体结构 Transformer由Encoder和Decoder组成,分别包含6个block。 Transformer的工作流程大体如下: 获取每个单词的em…

[MMU]IOMMU的主要职能及详细的验证方案

IOMMU的主要职能及详细的验证方案 摘要:IOMMU(Input/Output Memory Management Unit)是一种硬件组件,负责管理I/O设备对内存的直接访问(DMA,Direct Memory Access),其主要作用是提供…

动物类 如何使用Yolov11训练使用牛羊数据集 实现对牛羊进行检测数据集

牛羊检测数据集 3700张 平视视角牛羊检测 带标注 voc yolo 牛羊检测数据集 3700张 牛羊检测平视 带标注 voc yolo 分类名: (图片张数,标注个数) cattle: (1395,4309) sheep: (2393,1 1205) 总数: (3791, 15514) 总类(nc): 2类 以…

搭建frp内网穿透

前言 内网穿透的原理我就不多说了哈,既然会看到我这篇文章,想必都知道内网穿透是做什么的吧 frp分为服务端和客户端,服务端一般是搭在公网服务器中,客户端一般搭在本地或者局域网,需要提前在服务端搭好ftp server&am…

Tailwind CSS 实战,基于 Kooboo 构建 AI 对话框页面(四):语音识别输入功能

基于前三章的内容,开发AI 对话框语音识别输入功能: Tailwind css实战,基于Kooboo构建AI对话框页面(一)-CSDN博客 Tailwind css实战,基于Kooboo构建AI对话框页面(二):实…

ollama list模型列表获取 接口代码

ollama list模型列表获取 接口代码 curl http://localhost:11434/v1/modelscoding package hcx.ollama;/*** ClassName DockerOllamaList* Description TODO* Author dell* Date 2025/5/26 11:31* Version 1.0**/import java.io.BufferedReader; import java.io.InputStreamR…

ISOLAR软件生成报错处理(五)

错误1 An error has occurred. See error log for more details. java.lang.NullPointerException 这东西不用管&#xff0c;不影响生成 错误2 Description Resource Path Location Type Target ARObject: <xxxx> CompuMethod used for floating-point data conversi…

前端开发定时,ES学习,java集合

1.前端vue3加入定时任务&#xff1a; import { onMounted, ref,onUnmounted } from vue;//初始化&#xff0c;结束调用部分引用let timer: any;//定时器onMounted(async () > {timer setInterval(() > {open()//需要定时的任务}, 60000)//一分钟调用一次}); onUnmounte…

Photoshop2025(PS2025)软件及安装教程

在数字图像编辑领域&#xff0c;Adobe Photoshop 一直是无可争议的王者。如今&#xff0c;Photoshop 2025 重磅登场&#xff0c;再次为我们带来了惊喜与变革&#xff0c;进一步巩固了它在行业中的领先地位。 Photoshop 2025 在人工智能方面的升级令人瞩目。其全新的 “Magic Se…

【SQL Server Management Studio 连接时遇到的一个错误】

第一次用SQL Server Management Studio启动之后第一步就是要建立连接 但是不知道Server Name要填什么&#xff0c;看了网上的教程说是要找到下面这个注册表中对应的实例名称填上去&#xff0c;或者前面加localhost 但是好像都没有用&#xff0c;一直遇到报错如下&#xff1a;…

高等数学基础(向量矩阵及其创建和特殊的矩阵)

向量 向量是机器学习最底层的组成部分, 也是基础数据的表示形式, 线性代数通过将研究对象拓展到向量, 对多维数据进行统一研究, 而进化出的方法方便我们可以研究和解决真实世界中的问题 标量 标量也称为"无向量", 使用一个单独的数表示数值大小, 可以有正负之分, …

IBM DB2数据库管理工具IBM Data Studio

一、介绍 IBM Data Studio 是 IBM 提供的一个集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于支持数据管理、开发、优化和管理数据库应用程序&#xff0c;特别是在 IBM Db2 和其他数据库平台上。它提供了许多功能&#xff0c;以帮助开发人员和数据库管理员提高生产力…

Java异常处理的全面指南

Java异常处理的全面指南 一、Java异常的基础概念1.1 什么是异常1.2 异常类的层次结构 二、Java异常的处理方式2.1 try-catch块2.2 throws关键字2.3 throw关键字 三、自定义异常3.1 自定义受检异常3.2 自定义非受检异常 四、Java异常处理的最佳实践4.1 捕获合适粒度的异常4.2 避…