【Python爬蟲實戰篇】--爬取豆瓣電影信息(靜態網頁)

網站,:豆瓣電影 Top 250

爬取豆瓣前250電影的信息,?

F12打開網頁控制臺,查看網頁元素,

?發現網頁數據直接可以查看到,為靜態網頁數據,較為簡單

目錄

1.第一步使用urllib庫獲取網頁

2.第二步使用BeautifulSoup和re庫解析數據

2.1.定位數據塊

?2.2.正則化匹配

3.第三步數據導出excel

完整代碼:


1.第一步使用urllib庫獲取網頁

觀察網頁url結構:

?首先,我們分析一下這個網頁的結構,是一個還算比較規則的網頁,每頁25條,一共10頁。

? ? 我們點擊第一頁:url = https://movie.douban.com/top250?start=0&filter=

? ? 我們點擊第二頁:url = 豆瓣電影 Top 250

? ? 我們點擊第三頁:url = 豆瓣電影 Top 250

import urllib.request, urllib.error# 定義基礎url,發現規律,每頁最后變動的是start=后面的數字
baseurl = "https://movie.douban.com/top250?start="# 定義一個函數getHtmlByURL,得到指定url網頁的內容
def geturl(url):# 自定義headers(偽裝,告訴豆瓣服務器,我們是什么類型的機器,以免被反爬蟲)headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36'}# 利用Request類來構造自定義頭的請求req = urllib.request.Request(url, headers=headers)# 定義一個接收變量,用于接收html = ""try:# urlopen()方法的參數,發送給服務器并接收響應resp = urllib.request.urlopen(req)# urlopen()獲取頁面內容,返回的數據格式為bytes類型,需要decode()解碼,轉換成str類型html = resp.read().decode("utf-8")except urllib.error.URLError as e:if hasattr(e, "code"):print(e.code)if hasattr(e, "reason"):print(e.reason)return htmlprint(geturl(baseurl + "0"))

2.第二步使用BeautifulSoup和re庫解析數據

2.1.定位數據塊

?需要找到我們需要的信息在對應數據中的那個位置里面,可以在控制臺定位,

我們需要獲取的數據標簽是 ‘div’,類名是‘item’,

from bs4 import BeautifulSoup# 定義一個函數,并解析這個網頁
def analysisData(url):# 獲取指定網頁html = geturl(url)# 指定解析器解析html,得到BeautifulSoup對象soup = BeautifulSoup(html, "html5lib")# 定位我們的數據塊在哪for item in soup.find_all('div', class_="item"):print(item)return ""analysisData(baseurl)

2.2.正則化匹配

現在獲取到的塊還是原始的css代碼,創建正則化匹配篩選出我們需要的數據,

  • 提取詳細鏈接:

?findLink = re.compile(r'<a href="(.*?)">')

  • ?圖片

?findImgSrc = re.compile(r'<img.*src="(.*?)"', re.S)

  • ?片名

findTitle = re.compile(r'<span class="title">(.*)</span>')

import re# 定義正則對象獲取指定的內容
# 提取鏈接(鏈接的格式都是<a href="開頭的)
findLink = re.compile(r'<a href="(.*?)">')
# 提取圖片
findImgSrc = re.compile(r'<img.*src="(.*?)"', re.S)  # re.S讓 '.' 特殊字符匹配任何字符,包括換行符;
# 提取影片名稱
findTitle = re.compile(r'<span class="title">(.*)</span>')
# 提取影片評分
findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
# 提取評價人數
findJudge = re.compile(r'<span>(\d*)人評價</span>')
# 提取簡介
inq= re.compile(r'<p\s+class="quote">.*?<span>(.*?)</span>.*?</p>', re.S)
# 提取相關內容
findBd = re.compile(r'<div class="bd">\s*<p>\s*'r'導演: (.*?)\s*主演: (.*?)<br/>\s*'r'(\d{4}).*?/\s*(.*?)\s*/\s*(.*?)\s*</p>',re.S
)# 定義一個函數,并解析這個網頁
def analysisData(baseurl):# 獲取指定網頁html = geturl(baseurl)# 指定解析器解析html,得到BeautifulSoup對象soup = BeautifulSoup(html, "html5lib")dataList = []# 定位我們的數據塊在哪for item in soup.find_all('div', class_="item"):# item 是 bs4.element.Tag 對象,這里將其轉換成字符串來處理item = str(item)# 定義一個列表 來存儲每一個電影解析的內容data = []# findall返回的是一個列表,這里提取鏈接link = re.findall(findLink, item)[0]data.append(link)  # 添加鏈接img = re.findall(findImgSrc, item)[0]data.append(img)  # 添加圖片鏈接title = re.findall(findTitle, item)# 一般都有一個中文名 一個外文名if len(title) == 2:# ['肖申克的救贖', '\xa0/\xa0The Shawshank Redemption']titlename = title[0] + title[1].replace(u'\xa0', '')else:titlename = title[0] + ""data.append(titlename)  # 添加標題pf = re.findall(findRating, item)[0]data.append(pf)pjrs = re.findall(findJudge, item)[0]data.append(pjrs)# 有的可能沒有inqInfo = re.findall(inq, item)if len(inqInfo) == 0:data.append(" ")else:data.append(inqInfo[0])matches = re.findall(findBd,  item)if matches:  # 確保列表非空bd = matches[0]else:bd = None  # 或設定默認值/拋出異常# [('\n                            導演: 弗蘭克·德拉邦特 Frank Darabont\xa0\xa0\xa0主演: 蒂姆·羅賓斯 Tim Robbins /...<br/>\n                            1994\xa0/\xa0美國\xa0/\xa0犯罪 劇情\n                        ', '\n\n                        \n                        ')]# bd[0].replace(u'\xa0', '').replace('<br/>', '')# bd = re.sub('<\\s*b\\s*r\\s*/\\s*>', "", bd[0])# bd = re.sub('(\\s+)?', '', bd)data.append(bd)dataList.append(data)return dataListprint(analysisData(baseurl))

3.第三步數據導出excel

因為處理的是一個頁面的,所以需要寫一個循環,


import xlwtdef main():allData = []for i in range(0, 250, 25):url = baseurl + str(i)dataList = analysisData(url)allData.extend(dataList)savepath = "C:\pythonProject\python爬蟲\爬取豆瓣電影\豆瓣250.xls"book = xlwt.Workbook(encoding="utf-8", style_compression=0)  # 創建Workbook對象sheet = book.add_sheet("豆瓣電影Top250", cell_overwrite_ok=True)  # 創建工作表col = ("電影詳情鏈接", "圖片鏈接", "電影中/外文名", "評分", "評論人數", "概況", "相關信息")print(len(allData))for i in range(0, 7):sheet.write(0, i, col[i])for i in range(0, 250):print('正在保存第'+str((i+1))+'條')data = allData[i]for j in range(len(data)):sheet.write(i + 1, j, data[j])book.save(savepath)if __name__ == '__main__':main()

完整代碼:

import urllib.request, urllib.error# 定義基礎url,發現規律,每頁最后變動的是start=后面的數字
baseurl = "https://movie.douban.com/top250?start="# 定義一個函數getHtmlByURL,得到指定url網頁的內容
def geturl(url):# 自定義headers(偽裝,告訴豆瓣服務器,我們是什么類型的機器,以免被反爬蟲)headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36'}# 利用Request類來構造自定義頭的請求req = urllib.request.Request(url, headers=headers)# 定義一個接收變量,用于接收html = ""try:# urlopen()方法的參數,發送給服務器并接收響應resp = urllib.request.urlopen(req)# urlopen()獲取頁面內容,返回的數據格式為bytes類型,需要decode()解碼,轉換成str類型html = resp.read().decode("utf-8")except urllib.error.URLError as e:if hasattr(e, "code"):print(e.code)if hasattr(e, "reason"):print(e.reason)return htmlfrom bs4 import BeautifulSoup# 定義一個函數,并解析這個網頁
def analysisData(url):# 獲取指定網頁html = geturl(url)# 指定解析器解析html,得到BeautifulSoup對象soup = BeautifulSoup(html, "html5lib")# 定位我們的數據塊在哪for item in soup.find_all('div', class_="item"):print(item)return ""analysisData(baseurl)
import re# 定義正則對象獲取指定的內容
# 提取鏈接(鏈接的格式都是<a href="開頭的)
findLink = re.compile(r'<a href="(.*?)">')
# 提取圖片
findImgSrc = re.compile(r'<img.*src="(.*?)"', re.S)  # re.S讓 '.' 特殊字符匹配任何字符,包括換行符;
# 提取影片名稱
findTitle = re.compile(r'<span class="title">(.*)</span>')
# 提取影片評分
findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
# 提取評價人數
findJudge = re.compile(r'<span>(\d*)人評價</span>')
# 提取簡介
inq= re.compile(r'<p\s+class="quote">.*?<span>(.*?)</span>.*?</p>', re.S)
# 提取相關內容
findBd = re.compile(r'<div class="bd">\s*<p>\s*'r'導演: (.*?)\s*主演: (.*?)<br/>\s*'r'(\d{4}).*?/\s*(.*?)\s*/\s*(.*?)\s*</p>',re.S
)# 定義一個函數,并解析這個網頁
def analysisData(baseurl):# 獲取指定網頁html = geturl(baseurl)# 指定解析器解析html,得到BeautifulSoup對象soup = BeautifulSoup(html, "html5lib")dataList = []# 定位我們的數據塊在哪for item in soup.find_all('div', class_="item"):# item 是 bs4.element.Tag 對象,這里將其轉換成字符串來處理item = str(item)# 定義一個列表 來存儲每一個電影解析的內容data = []# findall返回的是一個列表,這里提取鏈接link = re.findall(findLink, item)[0]data.append(link)  # 添加鏈接img = re.findall(findImgSrc, item)[0]data.append(img)  # 添加圖片鏈接title = re.findall(findTitle, item)# 一般都有一個中文名 一個外文名if len(title) == 2:# ['肖申克的救贖', '\xa0/\xa0The Shawshank Redemption']titlename = title[0] + title[1].replace(u'\xa0', '')else:titlename = title[0] + ""data.append(titlename)  # 添加標題pf = re.findall(findRating, item)[0]data.append(pf)pjrs = re.findall(findJudge, item)[0]data.append(pjrs)# 有的可能沒有inqInfo = re.findall(inq, item)if len(inqInfo) == 0:data.append(" ")else:data.append(inqInfo[0])matches = re.findall(findBd,  item)if matches:  # 確保列表非空bd = matches[0]else:bd = None  # 或設定默認值/拋出異常# [('\n                            導演: 弗蘭克·德拉邦特 Frank Darabont\xa0\xa0\xa0主演: 蒂姆·羅賓斯 Tim Robbins /...<br/>\n                            1994\xa0/\xa0美國\xa0/\xa0犯罪 劇情\n                        ', '\n\n                        \n                        ')]# bd[0].replace(u'\xa0', '').replace('<br/>', '')# bd = re.sub('<\\s*b\\s*r\\s*/\\s*>', "", bd[0])# bd = re.sub('(\\s+)?', '', bd)data.append(bd)dataList.append(data)return dataListimport xlwtdef main():allData = []for i in range(0, 250, 25):url = baseurl + str(i)dataList = analysisData(url)allData.extend(dataList)savepath = "C:\pythonProject\python爬蟲\爬取豆瓣電影\豆瓣250.xls"book = xlwt.Workbook(encoding="utf-8", style_compression=0)  # 創建Workbook對象sheet = book.add_sheet("豆瓣電影Top250", cell_overwrite_ok=True)  # 創建工作表col = ("電影詳情鏈接", "圖片鏈接", "電影中/外文名", "評分", "評論人數", "概況", "相關信息")print(len(allData))for i in range(0, 7):sheet.write(0, i, col[i])for i in range(0, 250):print('正在保存第'+str((i+1))+'條')data = allData[i]for j in range(len(data)):sheet.write(i + 1, j, data[j])book.save(savepath)if __name__ == '__main__':main()

?

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

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

相關文章

【Unity知識點詳解】Unity中泛型單例的使用,兼容WebGL

今天來講下Unity中泛型單例的使用&#xff0c;包含普通單例和繼承MonoBehaviour的單例。重點是需要兩種泛型單例兼容WebGL平臺&#xff0c;話不多說直接開始。 泛型單例的設計目標 作為泛型單例&#xff0c;需要實現以下幾個目標&#xff1a; 全局唯一&#xff0c;在程序的整個…

Python進程與線程的深度對比

一、核心概念對比 1. 進程&#xff08;Process&#xff09; 操作系統級獨立單元&#xff1a;每個進程擁有獨立的內存空間&#xff08;堆、棧、代碼段&#xff09; 資源隔離性&#xff1a;崩潰不影響其他進程 多核并行&#xff1a;可充分利用多核CPU資源 2. 線程&#xff0…

Django 入門指南:構建強大的 Web 應用程序

什么是 Django&#xff1f; Django 是一個開源的高層次 Python Web 框架&#xff0c;旨在快速開發安全且可維護的網站。它通過簡化常見的 Web 開發任務&#xff0c;幫助開發者專注于開發應用的核心功能。Django 實現了“快速開發”和“盡量少的重復”的理念&#xff0c;提供了…

ESP-ADF外設子系統深度解析:esp_peripherals組件架構與核心設計(顯示輸出類外設之IS31FL3216)

目錄 ESP-ADF外設子系統深度解析&#xff1a;esp_peripherals組件架構與核心設計&#xff08;顯示輸出類外設之IS31FL3216&#xff09;簡介模塊概述功能定義架構位置核心特性 IS31FL3216外設分析IS31FL3216外設概述IS31FL3216外設層次架構圖 IS31FL3216外設API和數據結構外設層…

【計算機網絡 | 第三篇】常見的網絡協議(二)

沒有看過我寫的關于網絡協議的第一篇博客可以看【計算機網絡 | 第二篇】常見的通信協議&#xff08;一&#xff09;-CSDN博客 TCP的三次握手和四次揮手 TCP三次握手 三次握手是TCP協議建立可靠連接的過程&#xff0c;目的是確保客戶端和服務端雙方的雙向通信能力正常&#x…

HAL庫(STM32CubeMX)——高級ADC學習、HRTIM(STM32G474RBT6)

系列文章目錄 文章目錄 系列文章目錄前言存在的問題HRTIMcubemx配置前言 對cubemx的ADC的設置進行補充 ADCs_Common_Settings Mode:ADC 模式 Independent mod 獨立 ADC 模式,當使用一個 ADC 時是獨立模式,使用兩個 ADC 時是雙模式,在雙模式下還有很多細分模式可選 ADC_Se…

Unity接入安卓SDK(3)厘清Gradle的版本

接入過程中&#xff0c;很多人遇到gradle的各種錯誤&#xff0c;由于對各種gradle版本的概念不甚了了&#xff0c;模模糊糊一頓操作猛如虎&#xff0c;糊弄的能編譯通過就萬事大吉&#xff0c;下次再遇到又是一臉懵逼。所以我們還是一起先厘清gradle的版本概念。 1 明晰概念 …

python-67-基于plotly的繪圖可視化和智能推薦圖表

文章目錄 1 各種圖表的適用場景1.1 面積圖1.2 餅圖1.3 散點圖1.3.1 散點1.3.2 散點加線1.4 折線圖1.5 箱線圖1.5.1 不同類別的箱線圖1.5.2 一個變量的箱線圖1.5.3 多個變量的箱線圖1.6 小提琴圖1.6.1 不同類別的小提琴圖1.6.2 一個變量的小提琴圖1.7 直方圖1.7.1 直方圖1.7.2 分…

Spring AI MCP

MCP是什么 MCP是模型上下文協議&#xff08;Model Context Protocol&#xff09;的簡稱&#xff0c;是一個開源協議&#xff0c;由Anthropic&#xff08;Claude開發公司&#xff09;開發&#xff0c;旨在讓大型語言模型&#xff08;LLM&#xff09;能夠以標準化的方式連接到外…

c++_csp-j算法 (3)

弗洛伊德算法&#xff08;Floyd&#xff09; Floyd算法又稱為插點法&#xff0c;是一種利用動態規劃的思想尋找給定的加權圖中多源點之間最短路徑的算法&#xff0c;與Dijkstra算法類似。該算法名稱以創始人之一、1978年圖靈獎獲得者、斯坦福大學計算機科學系教授羅伯特弗洛伊…

QT常見輸入類控件及其屬性

Line Edit QLineEdit用來表示單行輸入框&#xff0c;可以輸入一段文本&#xff0c;但是不能換行 核心屬性&#xff1a; 核心信號 信號 說明 void cursorPositionChanged(int old,int new) 當鼠標移動時發出此型號&#xff0c;old為先前位置&#xff0c;new為新位置 void …

【k8s系列1】一主兩從結構的環境準備

環境準備 虛擬機軟件準備及安裝&#xff0c;這里就不詳細展開了&#xff0c;可以看文章:【一、虛擬機vmware安裝】 linux環境準備及下載&#xff0c;下載鏡像centOS7.9&#xff0c;以前也有寫過這個步驟的文章&#xff0c;可以看&#xff1a;【二、安裝centOS】 開始進入正題…

【C++類和數據抽象】類的作用域

目錄 一、類的作用域基本概念 1.1 什么是類的作用域 1.2 作用域層次體系 1.3 類作用域的特點 1.4 基本訪問規則 二、訪問控制三劍客 2.1 public&#xff1a;開放接口 2.2 private&#xff1a;數據封裝 2.3 protected&#xff1a;繼承通道 2.4 跨作用域訪問示例 三…

opencv圖片顏色識別,顏色的替換

圖片顏色識別 1. RGB顏色空間2. 顏色加法2.1使用numpy對圖像進行加法2.2使用opencv加法&#xff08;cv2.add&#xff09; 3 顏色加權加法&#xff08;cv2.addWeighted()&#xff09;4. HSV顏色空間5. 制作掩膜4. 與運算&#xff08;cv2.bitwise_and&#xff09;5.顏色的替換7 R…

ADC數據不穩定的解決方案

問題如圖&#xff1a; 解決方案&#xff1a;上圖第一個通道后來接入GND&#xff0c;就穩定了 上圖第一個通道后來接入VCC&#xff0c;就穩定了

Spark(18)Yarn-概述

Hadoop三大核心組件&#xff1a;HDFS、MapReduce和YARN 一&#xff09;Yarn的概念 YARN(Yet Another Resource Negotiator,另一種資源協調者)是一個通用資源管理系統和調度平臺&#xff0c;可為上層應用提供統一的資源管理和調度。它的引入為集群在利用率&#xff0c;資源統一管…

Flowith AI,解鎖下一代「知識交易市場」

前言 最近幾周自媒體號都在瘋狂推Manus&#xff0c;看了幾篇測評后&#xff0c;突然在某個時間節點&#xff0c;在特工的文章下&#xff0c;發現了很小眾的Flowith。 被這段評論給心動到&#xff0c;于是先去注冊了下賬號。一翻探索過后&#xff0c;發現比我想象中要有趣的多&…

Maxscript調用Newtonsoft.Json解析Json

Maxscript調用Newtonsoft.Json解析Json_newtonsoft.json maxscript-CSDN博客

搭建用友U9Cloud ERP及UAP IDE環境

應用環境 Microsoft Windows 10.0.19045.5487 x64 專業工作站版 22H2Internet Information Services - 10.0.19041.4522Microsoft SQL Server 2019 - 15.0.2130.3 (X64)Microsoft SQL Server Reporing Services 2019 - 15.0.9218.715SQL Server Management Studio -18.6 laster…

github新建一個遠程倉庫并添加了README.md,本地git倉庫無法push

1.本地git倉庫與遠程倉庫綁定 2.push時報錯&#xff0c;本地的 main 分支落后于遠程倉庫的 main 分支&#xff08;即遠程有更新&#xff0c;但你本地沒有&#xff09;&#xff0c;需要拉取遠程的倉庫--->在merge合并&#xff08;解決沖突&#xff09;--->push 3.但是git …