爬蟲基礎入門之爬取豆瓣電影Top250-Re正則的使用

網址:豆瓣電影 Top 250

本案例所需要的模塊
requests (用于發送HTTP請求)re (用于字符串匹配和操作)

確定需要爬取的數據 :

  1. 電影的名稱
  2. 電影的年份
  3. 電影的評分
  4. 電影評論人數

一. 發送請求 模擬瀏覽器向服務器發送請求

準備工作 -分析頁面:
F12 or 右擊點擊檢查 查看頁面源代碼 目的是確定數據是否為靜態數據

Ctrl + F 快捷鍵打開搜索框 將我們所需要爬取的數據輸入
發現數據都在前端的頁面當中
即拿到頁面的源代碼 從中提取數據

接著復制瀏覽器的URL地址 在pycharm里面構建請求

# 導包
import requests
import reurl = 'https://movie.douban.com/top250'# 構建請求體
# user-agent 即UA 為瀏覽器的基本信息 爬蟲程序就是偽裝成瀏覽器從網頁拿數據
headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0',}resp = requests.get(url=url, headers=headers)print(resp.text.encode('gbk', 'ignore').decode('gbk'))

? 我這里會出現一個編碼的問題 查找資料之后 需要先用 GBK 編碼,加個 ignore 丟棄錯誤的字符,然后再解碼

之后在拿到的網頁源代碼中 老樣子Ctrl+F 檢查爬取的數據是否存在

二. 解析數據 提取數據

OK 接著我們需要從頁面源代碼中提取出我們想要的數據

分析頁面的結構

ex = re.compile(r'<div class="hd">.*?<span class="title">(?P<name>.*?)</span>',re.S)
# 不需要的內容通過.*?過掉 給需要取出的內容 取值為name 類似字典
result = ex.findall(text)# findall返回的是一個列表
# finditer 返回的是一個迭代器 后續需要通過for循環取出
# re.search() 返回的是match對象  需要.group拿數據 只能拿到匹配到的第一個數據
# re.match() 從頭開始匹配 類似^
# 預加載正則表達式  后續可重復使用該正則
# re.complie(r'正則')

繼續編寫正則 想象這是一篇文章 不需要的通過.*?過濾出去 用(.*?)保留下來
后續通過類似 鍵值對取值取出

我們通過迭代器的方式 提取

ex = re.compile(r'<div class="hd">.*?<span class="title">(?P<name>.*?)'r'</span>.*?<p class="">.*?<br>(?P<year>.*?)&nbsp.*?'r'<span class="rating_num" property="v:average">(?P<judge>.*?)</span>.*?'r'<span>(?P<num>.*?)人評價</span>.*?'r'<p class="quote"><span class="inq">(?P<intro>.*?)。</span></p>',re.S)
result = ex.finditer(text)
for i in result:# 通過.group取數據# 檢驗拿到的數據print(i.group('name'))#  去除前面的空格print(i.group('year').strip())print(i.group('judge'))print(i.group('num'))

三.保存數據 存儲為?csv excel 文件

接著我們保存爬取的數據? 需要用到csv模塊

# 導包
import csvf = open('movie.csv','w',encoding='utf-8',newline='')
# newline 解決空行的問題
csv_writer = csv.writer(f)
# 寫入表頭
csv_writer.writerow(['電影名','年份','評分','評價人數'])

for i in result:# 將數據存儲為字典格式dit = i.groupdict()# 處理年份前的空格dit['year'] = dit['year'].strip()#將值寫入csv文件csv_writer.writerow(dit.values())
# 與with open 不同的是 open需要手動關閉
f.close()

另外一種保存數據的方式 pandas 個人覺得pandas方便很多
以下是實現代碼

?

# 導包
import pandas as pd
# 定義一個空列表 后面將dit字典數據存儲進去
lis = []for i in result:dit = i.groupdict()# 處理年份前的空格dit['year'] = dit['year'].strip()# 只需要改這兩行代碼lis.append(dit)pd.DataFrame(lis).to_excel('movie1.xlsx',index=False)

運行結果如下 如果在excel 中打開此文件 會亂碼 需要將編碼格式寫為 utf-8-sig?

多頁采取的話 需要分析一下 請求的url地址 之后構建個for循環去遍歷

分析二三頁的地址 可得 start參數間隔25?

其實是為了學習正則而采用正則去提取數據 只有在特定的情況下才使用正則 一般使用其它的方法

以下是本次案例的所有代碼 供學習交流使用

import requests
import re
import csvf = open('movie.csv', 'w', encoding='utf-8-sig',newline='')
csv_writer = csv.writer(f)
csv_writer.writerow(['電影名', '年份', '評分', '評價人數'])
for page in range(0, 250, 25):url = f'https://movie.douban.com/top250?start={page}&filter='headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0',}resp = requests.get(url=url, headers=headers)text = resp.text.encode('gbk', 'ignore').decode('gbk')ex = re.compile(r'<div class="hd">.*?<span class="title">(?P<name>.*?)'r'</span>.*?<p class="">.*?<br>(?P<year>.*?)&nbsp.*?'r'<span class="rating_num" property="v:average">(?P<judge>.*?)</span>.*?'r'<span>(?P<num>.*?)人評價</span>.*?', re.S)result = ex.finditer(text)for i in result:dit = i.groupdict()# 處理年份前的空格dit['year'] = dit['year'].strip()csv_writer.writerow(dit.values())

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

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

相關文章

力扣hot100——島嶼數量 島嶼問題經典dfs總結

給你一個由 1&#xff08;陸地&#xff09;和 0&#xff08;水&#xff09;組成的的二維網格&#xff0c;請你計算網格中島嶼的數量。 島嶼總是被水包圍&#xff0c;并且每座島嶼只能由水平方向和/或豎直方向上相鄰的陸地連接形成。 此外&#xff0c;你可以假設該網格的四條邊…

FPGA DSP:Vivado 中帶有 DDS 的 FIR 濾波器

本文使用 DDS 生成三個信號&#xff0c;并在 Vivado 中實現低通濾波器。低通濾波器將濾除相關信號。 介紹 用DDS生成三個信號&#xff0c;并在Vivado中實現低通濾波器。低通濾波器將濾除較快的信號。 本文分為幾個主要部分&#xff1a; 信號生成&#xff1a;展示如何使用DDS&am…

MessageAuthenticator

MessageAuthenticator https://coova.github.io/JRadius/ https://coova.github.io/JRadius/ import org.tinyradius.packet.RadiusPacket; import org.tinyradius.util.RadiusUtil; import java.nio.charset.StandardCharsets;public class RadiusAuthUtils {/*** 生成 RADI…

Spring Boot嵌入式服務器深度解析:從配置到調優的全方位指南

文章目錄 引言一、嵌入式服務器核心原理1.1 架構設計特點1.2 主流服務器對比 二、嵌入式服務器配置實戰2.1 基礎配置模板2.2 HTTPS安全配置 三、高級調優策略3.1 線程池優化&#xff08;Tomcat示例&#xff09;3.2 響應壓縮配置3.3 訪問日志配置 四、服務器切換實戰4.1 切換至U…

基于CentOS7安裝kubesphere和Kubernetes并接入外部ES收集日志

一、修改所有節點主機名 主節點就修改成master hostnamectl set-hostname master 然后輸入bash刷新當前主機名 工作節點1就修改成node1 hostnamectl set-hostname node1 然后輸入bash刷新當前主機名 二、全部節點安裝依賴并同步時間 yum -y install socat conntrack ebta…

探索與Cursor協作創建一個完整的前后端分離的項目的最佳實踐

探索與Cursor協作創建一個完整的前后端分離的項目的最佳實踐 Cursor簡介 Cursor在目前代表了AI編程技術的頂峰。在一定程度上可以說是當今AI時代的最強生產力代表。為此,不惜重金開了年費會員來緊跟時代步伐。當然cline、roo code、trae等開源或者免費產品也在緊追不舍。 C…

支持向量機(SVM)在 NLP 中的使用場景

支持向量機(Support Vector Machine, SVM)是一種強大的監督學習算法,廣泛應用于分類任務中。由于其出色的分類性能和高效的計算特點,SVM 已經成為自然語言處理(NLP)領域中的一種經典模型。SVM 在 NLP 中的應用非常廣泛,尤其在文本分類任務中,表現出色。 本文將探討 SV…

nodejs:vue 3 + vite 作為前端,將 html 填入<iframe>,在線查詢英漢詞典

向 doubao.com/chat/ 提問&#xff1a; node.js js-mdict 作為后端&#xff0c;vue 3 vite 作為前端&#xff0c;編寫在線查詢英漢詞典 后端部分&#xff08;express js-mdict &#xff09; 詳見上一篇&#xff1a;nodejs&#xff1a;express js-mdict 作為后端&#xff…

Jenkins 部署在 Mac 并在局域網內通過 ip 訪問

Jenkins 部署在 Mac 并在局域網內通過 ip 訪問 一、修改配置文件 打開文件 ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist 打開文件 /usr/local/opt/jenkins/homebrew.mxcl.jenkins.plist 兩個文件目錄不同&#xff0c;內容一樣 <?xml version"1.0" e…

2通道12bit 10G USB高速示波器采集卡

概述 USB高速示波器采集卡 2通道&#xff0c;12位&#xff0c;10GSa/s 采樣率 DC~2.5GHz 帶寬 USB高速示波器采集卡是一款高速12bit多通道USB數字化儀它具有2通道10GSa/s采樣率&#xff0c;模擬前端帶寬從DC到2.5GHz&#xff0c;板載32GB DDR4存儲&#xff0c;使其能夠滿足長…

Python|OpenCV-實現人物眨眼檢測(21)

前言 本文是該專欄的第23篇,后面將持續分享OpenCV計算機視覺的干貨知識,記得關注。 通過OpenCV庫來實現人物的眨眼檢測,首先是需要了解眨眼檢測的基本原理。一般來說,是需要通過檢測眼睛的狀態,比如眼睛是否閉合來判斷是否眨眼。對此,如果基于OpenCV,通過Python如何去實…

Qt | Excel創建、打開、讀寫、另存和關閉

01 如何在Qt中使用QXlsx庫進行Excel文件的讀寫操作,包括創建新Excel、寫入數據、讀取數據以及文件保存和釋放資源。通過實例展示了如何加載庫、編寫.h和.cpp文件,并演示了使用單元格引用和行列號進行數據操作的方法。 QXlsx是一個可以讀寫Excel文件的庫。不依賴office以及…

AMBA-CHI協議詳解(十九)

文章目錄 4.6 Silent cache state transitions4.7 Cache state transitions at a Requester4.7.1 Read request transactions4.7.2 Dataless request transactions4.7.3 Write request transactions4.7.4 Atomic transactions4.7.5 Other request transactions4.6 Silent cache…

常見的“鎖”有哪些?

悲觀鎖 悲觀鎖認為在并發環境中&#xff0c;數據隨時可能被其他線程修改&#xff0c;因此在訪問數據之前會先加鎖&#xff0c;以防止其他線程對數據進行修改。常見的悲觀鎖實現有&#xff1a; 1.互斥鎖 原理&#xff1a;互斥鎖是一種最基本的鎖類型&#xff0c;同一時間只允…

深入理解 Python 作用域:從基礎到高級應用

在 Python 編程中&#xff0c;作用域是一個至關重要的概念&#xff0c;它決定了變量和函數的可見性與生命周期。正確理解和運用作用域規則&#xff0c;對于編寫結構清晰、易于維護的代碼起著關鍵作用。無論是簡單的腳本還是復雜的大型項目&#xff0c;作用域都貫穿其中&#xf…

ubuntu磁盤清理垃圾文件

大頭文件排查 #先查看是否是內存滿了&#xff0c;USER 很高即是滿了 du -f#抓大頭思想&#xff0c;優先刪除大文件#查看文件目錄 內存占用量并排序&#xff0c;不斷文件遞歸下去 du --max-depth1 -h /home/ -h | sort du --max-depth1 -h /home/big/ -h | sort 緩存文件清理…

ctf網絡安全題庫 ctf網絡安全大賽答案

此題解僅為部分題解&#xff0c;包括&#xff1a; 【RE】&#xff1a;①Reverse_Checkin ②SimplePE ③EzGame 【Web】①f12 ②ezrunner 【Crypto】①MD5 ②password ③看我回旋踢 ④摩絲 【Misc】①爆爆爆爆 ②凱撒大帝的三個秘密 ③你才是職業選手 一、 Re ① Reverse Chec…

VSCode集成deepseek使用介紹(Visual Studio Code)

VSCode集成deepseek使用介紹&#xff08;Visual Studio Code&#xff09; 1. 簡介 隨著AI輔助編程工具的快速發展&#xff0c;VSCode作為一款輕量級、高度可擴展的代碼編輯器&#xff0c;已成為開發者首選的工具之一。DeepSeek作為AI模型&#xff0c;結合Roo Code插件&#x…

git 常用功能

以下是 Git 的常用功能及其命令&#xff1a; 初始化倉庫 git init在當前目錄初始化一個新的 Git 倉庫。 克隆倉庫 git clone <倉庫地址>將遠程倉庫克隆到本地。 查看狀態 git status查看工作區和暫存區的狀態。 添加文件到暫存區 git add <文件名>將文件添…

Unity 腳本控制3D人物模型的BlendShape

有些3D角色模型帶有BlendShape面部控制, 在Unity中可以通過接口訪問并操作其參數可以表現不同的面部表情 在Unity中選中角色模型的指定部位,這個是由模型師定義的,不固定.但肯定是在面部建模上. 點選之后在檢查器可以看到對應的BlendShapes設定項出現在SkinedMeshRenderer組件…