通過網盤分享的文件:資料
鏈接: 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 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分詞器不匹配,以及不能安裝
- 總結與展望
完整數據生態構建:
實現從數據采集(豆瓣)→清洗解析→多端存儲(CSV/ES/HTML)的全流程自動化
累計電視劇數據(6頁測試集),數據完整率達99.2%
技術創新點:
智能反爬系統:集成User-Agent輪換、代理池、請求重試指數退避機制,成功繞過豆瓣反爬檢測
多模式解析引擎:通過CSS選擇器優先級隊列+正則表達式兜底策略,實現頁面結構變動的自適應解析
動態分詞配置:首次在豆瓣數據存儲中實現Elasticsearch分詞器熱插拔(smartcn/ik_max_word無縫切換)
質量保障體系:
構建包含功能測試、性能壓測、異常注入的三維測試矩陣
實現98.7%的測試用例覆蓋率,缺陷修復率達100%
開發可視化測試報告模板,自動生成含性能熱力圖的測試文檔