Python爬蟲實戰:爬取豆瓣電影

目錄

引言

1. 爬蟲基礎

1.1 什么是爬蟲?

1.2 Python爬蟲常用庫

2. 實戰:抓取豆瓣電影Top250

2.1 安裝依賴庫

2.2 發送HTTP請求

?編輯

2.3 解析HTML

?編輯

2.4 存儲數據

2.5 完整代碼

3. 進階:處理分頁和動態內容

3.1 抓取多頁數據

3.2 處理動態內容

4. 反爬蟲策略與應對

4.1 常見的反爬蟲策略

4.2 應對策略

5. 總結


引言

在當今大數據時代,網絡爬蟲(Web Crawler)成為了獲取互聯網數據的重要工具。無論是數據分析、機器學習還是市場調研,爬蟲技術都能幫助我們快速獲取所需的數據。本文將帶你從零開始,使用Python編寫一個簡單的網絡爬蟲,并逐步擴展到更復雜的應用場景。

1. 爬蟲基礎

1.1 什么是爬蟲?

網絡爬蟲是一種自動化程序,能夠從互聯網上抓取數據。它通過模擬瀏覽器請求,訪問網頁并提取所需的信息。爬蟲的核心任務包括:

  • 發送HTTP請求:向目標網站發送請求,獲取網頁內容。

  • 解析HTML:從網頁中提取有用的數據。

  • 存儲數據:將提取的數據保存到本地或數據庫中。

1.2 Python爬蟲常用庫

Python擁有豐富的庫來支持爬蟲開發,以下是常用的幾個庫:

  • Requests:用于發送HTTP請求,獲取網頁內容。

  • BeautifulSoup:用于解析HTML,提取數據。

  • Scrapy:一個強大的爬蟲框架,適合大規模數據抓取。

  • Selenium:用于處理動態網頁,模擬瀏覽器操作。

2. 實戰:抓取豆瓣電影Top250

將以抓取豆瓣電影Top250為例,演示如何使用Python編寫一個簡單的爬蟲。

2.1 安裝依賴庫

首先,確保你已經安裝了requestsBeautifulSoup庫。如果沒有安裝,可以使用以下命令進行安裝:

pip install requests beautifulsoup4

2.2 發送HTTP請求

我們使用requests庫向豆瓣電影Top250頁面發送請求,獲取網頁內容。

import requestsurl = "https://movie.douban.com/top250"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}response = requests.get(url, headers=headers)
if response.status_code == 200:print("請求成功!")html_content = response.text
else:print("請求失敗,狀態碼:", response.status_code)

2.3 解析HTML

使用BeautifulSoup解析HTML,提取電影名稱、評分等信息。

from bs4 import BeautifulSoupsoup = BeautifulSoup(html_content, "html.parser")movies = soup.find_all("div", class_="info")for movie in movies:title = movie.find("span", class_="title").textrating = movie.find("span", class_="rating_num").textprint(f"電影名稱:{title},評分:{rating}")

2.4 存儲數據

將提取的數據保存到CSV文件中。

import csvwith open("douban_top250.csv", mode="w", newline="", encoding="utf-8") as file:writer = csv.writer(file)writer.writerow(["電影名稱", "評分"])for movie in movies:title = movie.find("span", class_="title").textrating = movie.find("span", class_="rating_num").textwriter.writerow([title, rating])

2.5 完整代碼

import requests
from bs4 import BeautifulSoup
import csvurl = "https://movie.douban.com/top250"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}response = requests.get(url, headers=headers)
if response.status_code == 200:html_content = response.text
else:print("請求失敗,狀態碼:", response.status_code)exit()soup = BeautifulSoup(html_content, "html.parser")
movies = soup.find_all("div", class_="info")with open("douban_top250.csv", mode="w", newline="", encoding="utf-8") as file:writer = csv.writer(file)writer.writerow(["電影名稱", "評分"])for movie in movies:title = movie.find("span", class_="title").textrating = movie.find("span", class_="rating_num").textwriter.writerow([title, rating])print("數據已保存到douban_top250.csv")

3. 進階:處理分頁和動態內容

3.1 抓取多頁數據

豆瓣電影Top250有10頁數據,我們需要遍歷所有頁面進行抓取。

base_url = "https://movie.douban.com/top250"
all_movies = []for page in range(0, 250, 25):url = f"{base_url}?start={page}"response = requests.get(url, headers=headers)if response.status_code == 200:soup = BeautifulSoup(response.text, "html.parser")movies = soup.find_all("div", class_="info")for movie in movies:title = movie.find("span", class_="title").textrating = movie.find("span", class_="rating_num").textall_movies.append([title, rating])else:print(f"第{page//25 + 1}頁請求失敗,狀態碼:", response.status_code)with open("douban_top250_all.csv", mode="w", newline="", encoding="utf-8") as file:writer = csv.writer(file)writer.writerow(["電影名稱", "評分"])writer.writerows(all_movies)print("所有數據已保存到douban_top250_all.csv")

3.2 處理動態內容

如果網頁內容是通過JavaScript動態加載的,可以使用Selenium模擬瀏覽器操作。

from selenium import webdriver
from selenium.webdriver.common.by import By
import timedriver = webdriver.Chrome()
driver.get("https://movie.douban.com/top250")movies = driver.find_elements(By.CLASS_NAME, "info")
for movie in movies:title = movie.find_element(By.CLASS_NAME, "title").textrating = movie.find_element(By.CLASS_NAME, "rating_num").textprint(f"電影名稱:{title},評分:{rating}")driver.quit()

4. 反爬蟲策略與應對

4.1 常見的反爬蟲策略

  • User-Agent檢測:服務器通過檢查請求頭中的User-Agent來判斷是否為爬蟲。

  • IP封禁:頻繁請求可能導致IP被封禁。

  • 驗證碼:某些網站會要求輸入驗證碼。

4.2 應對策略

  • 設置合理的請求頭:模擬瀏覽器請求,設置User-Agent

  • 使用代理IP:通過代理IP池避免IP被封禁。

  • 降低請求頻率:使用time.sleep()控制請求間隔。

5. 總結

本文通過一個簡單的豆瓣電影Top250爬蟲實例,介紹了Python爬蟲的基本流程。我們從發送HTTP請求、解析HTML到存儲數據,逐步實現了一個完整的爬蟲程序。此外,我們還探討了如何處理分頁和動態內容,以及應對常見的反爬蟲策略。

爬蟲技術雖然強大,但在使用時務必遵守相關法律法規和網站的使用條款,避免對目標網站造成不必要的負擔。


參考資料

  • Requests官方文檔

  • BeautifulSoup官方文檔

  • Selenium官方文檔

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70286.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70286.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70286.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

請談談 Vue 中的響應式原理,如何實現?

一、Vue2響應式原理:Object.defineProperty的利與弊 實現原理: // 數據劫持核心實現 function defineReactive(obj, key, val) {const dep new Dep(); // 依賴收集容器Object.defineProperty(obj, key, {get() {if (Dep.target) { // 當前Watcher實例…

第6章:基于LangChain如何開發Agents,附帶客戶支持智能體示例

本文主要介紹了 LangChain4j 中的 Agent(代理) 概念,以及如何使用 LangChain4j 構建代理系統,重點提供了一個客戶支持系統的智能體樣例 代理(Agents)| LangChain4j 注意: 請注意,“A…

Android 中使用 FFmpeg 進行音視頻處理

1. FFmpeg 基礎知識 1.1 什么是 FFmpeg? FFmpeg 是一個開源的多媒體處理工具,支持音視頻的編碼、解碼、轉碼、裁剪、合并、濾鏡、流媒體等功能。它是一個命令行工具,支持多種音視頻格式和編解碼器。1.2 為什么在 Android 中使用 FFmpeg? Android 自帶的多媒體 API(如 Med…

Matplotlib 高級圖表繪制與交互式可視化(ipywidgets)

目錄: ipywidgets 介紹 1. 什么是 ipywidgets 直接開始: 動態調整正弦波頻率 隨機散點圖 啟用交互式模式 使用滑塊和下拉菜單調整圖表樣式 使用布局管理器創建復雜界面 使用動畫創建動態圖表 最后: 綜合示例:動態儀表盤 ipywidgets 介紹 1. 什么是 ipywidgets i…

【FAQ】HarmonyOS SDK 閉源開放能力 —Live View Kit (1)

1.問題描述: 客戶端創建實況窗后,通過Push kit更新實況窗內容,這個過程是自動更新的還是客戶端解析push消息數據后填充數據更新?客戶端除了接入Push kit和創建實況窗還需要做什么工作? 解決方案: 通過Pu…

uvm中的激勵是如何發送出去的

在UVM中,Sequence生成的激勵(Transaction)通過以下協作流程發送到Driver并最終驅動到DUT,其核心機制如下: --------------- --------------- ------------ ----- | Sequence | → | Seque…

SpringAI系列 - ToolCalling篇(二) - 如何設置應用側工具參數ToolContext(有坑)

目錄 一、引言二、集成ToolContext示例步驟1: 在`@Tool`標注的工具方法中集成`ToolConext`參數步驟2:`ChatClient`運行時動態設置`ToolContext`參數三、填坑一、引言 在使用AI大模型的工具調用機制時,工具參數都是由大模型解析用戶輸入上下文獲取的,由大模型提供參數給本地…

【RabbitMQ業務冪等設計】RabbitMQ消息是冪等的嗎?

在分布式系統中,RabbitMQ 自身不直接提供消息冪等性保障機制,但可通過業務邏輯設計和技術組合實現消息處理的冪等性。以下是 8 種核心實現方案及最佳實踐: 一、消息唯一標識符 (Message Deduplication) 原理 每條消息攜帶全局唯一ID&#xff…

網絡可靠性要求

目錄 一、背景介紹 二、環路引發的危害 1、廣播風暴 2、MAC 地址表震蕩 三、STP生成樹 1、STP的作用 2、STP工作過程 3、根橋選舉 4、根端口選舉 5、指定端口選舉 6、BPDU報文分析 7、計時器 8、端口狀態轉化 總結 一、背景介紹 為了提高網絡可靠性,交換網絡…

《STL 六大組件之容器探秘:深入剖析 string》

目錄 一、string 類簡介二、string 類的常用接口1. 構造函數(constructor function)2. 與容量相關的接口(capacity)3. 與迭代器有關的接口(iterator)4. 與元素訪問有關的接口(element access&am…

Unreal5從入門到精通之在編輯器中更新 UserWidgets

前言 在虛幻中創建越來越復雜和靈活的 UserWidget 藍圖時,一個問題是它們在編輯器中的外觀與它們在游戲中的最終外觀可能有很大不同。 庫存面板示例 假設你想創建一個通用的庫存顯示小部件。我們可以在整個 UI 中使用它,無論我們需要在哪里顯示某些內容。 標題,描述所顯示…

計算機網絡-OSI七層參考模型與數據封裝,網絡安全零基礎入門到精通實戰教程!

目錄 一、網絡 1、網絡的定義 2、網絡的分類 3、網絡的作用 4、網絡的數據傳輸方式 5、網絡的數據通訊方式 二、OSI七層參考模型 1、網絡參考模型定義 2、分層的意義 3、分層與功能 4、TCP\IP五層模型 三、參考模型的協議 1、物理層 2、數據鏈路層 3、網絡層 4…

Python正則替換終極指南:用re.sub玩轉字符串魔法

Python正則替換終極指南:用re.sub玩轉字符串魔法 一、為什么re.sub是文本處理的瑞士軍刀? 在Python的re模塊中,re.sub()的周下載量突破5800萬次(2025年PyPI數據),它實現了: 📍 模…

gen_gauss_filter用于檢測帶方向的線條

目錄 一、核心參數分析 1.1 方向覆蓋范圍 1.2 濾波器方向帶寬 二、角度配置建議 三、參數選擇依據 四、實施建議 五、模擬圖測試(項目圖檔不好直接分享) 5.1 模擬圖制作 5.2 檢測偽代碼 在Halcon中使用高斯濾波器檢測多方向線條時,角度參數的選取需要綜合考慮濾波…

C++17 中的 std::to_chars 和 std::from_chars:高效且安全的字符串轉換工具

文章目錄 1. 傳統轉換方法的局限性2. std::to_chars:數值到字符串的高效轉換函數原型:返回值:示例代碼:輸出: 3. std::from_chars:字符串到數值的高效解析函數原型:返回值:示例代碼&…

深入學習解析:183頁可編輯PPT華為市場營銷MPR+LTC流程規劃方案

華為終端正面臨銷售模式轉型的關鍵時刻,旨在通過構建MPRLTC項目,以規避對運營商定制的過度依賴,并探索新的增長路徑。項目核心在于建設一套全新的銷售流程與IT系統,支撐雙品牌及自有品牌的戰略發展。 項目總體方案聚焦于四大關鍵議…

Python正則表達式處理中日韓字符過濾全解析

Python正則表達式處理中日韓字符過濾全解析 一、核心原理:Unicode字符范圍定位 中日韓字符在Unicode中的分布: 中文:\u4e00-\u9fff(基本區) \u3400-\u4dbf(擴展A區) \U00020000-\U0002a6df…

基于WOA鯨魚優化的WSN網絡最優節點部署算法matlab仿真

目錄 1.程序功能描述 2.測試軟件版本以及運行結果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 鯨魚優化算法(WOA)是一種模擬座頭鯨捕食行為的元啟發式優化算法。其主要原理基于座頭鯨獨特的 “氣泡網” 捕食策略,通過數學模…

【數據分析】3 數據分析成長之路

職業發展路徑: 向上發展(技術方向):可以詳細說明成為數據科學家或專家所需的具體技能和步驟,包括學習的算法、工具等。向下發展(業務方向):可以探討結合業務知識的具體領域&#xff…

excel導入Mysql中時間格式異常

問題描述: 當使用xls/xlsx/csv導入mysql中,如果列是時間類型比如excel表中顯示2024/02/20 09:18:00,導入后時間可能就會變成1900-01-01 09:18:00這樣。 問題原因: 這是由于excel表中和數據庫中的時間類型不匹配導致。 問題解決…