最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python爬蟲抓取豆瓣TOP250數(shù)據(jù)從分析到實踐的全過程(詳細圖解)

 更新時間:2025年10月25日 08:56:31   作者:蔣星熠Jaxonic  
本文介紹了使用Python爬取豆瓣電影Top250數(shù)據(jù)的方法,首先驗證了目標數(shù)據(jù)在頁面源代碼中,然后通過requests模塊獲取頁面內(nèi)容,添加請求頭繞過反爬機制,接著使用re模塊編寫正則表達式,采用惰性匹配模式提取信息,通過循環(huán)實現(xiàn)翻頁爬取,將10頁共250條數(shù)據(jù)保存為CSV文件

一、開門見山,探究網(wǎng)頁結構

在爬取之前我們要確定需要的數(shù)據(jù)究竟是在頁面源代碼里,還是不在頁面源代碼里(是不是一次性全加載進來的),如果頁面源代碼里沒有想要的數(shù)據(jù),說明還有其它請求獲取的數(shù)據(jù)。

讓我們打開頁面:

右鍵查看頁面源代碼,Ctrl+/頁面搜索關鍵詞:肖申克

可以看到這時候我們需要的數(shù)據(jù)是都在頁面源代碼里的,驗證了我們的想法:該頁面數(shù)據(jù)是一次性全加載進來的,因此得到以下思路。

二、確定思路

1.拿到頁面源代碼/響應

2.編寫正則,提取頁面數(shù)據(jù)

3.保存數(shù)據(jù)

三、步驟詳解

1.初步爬取

1.1 確定請求方式

接下來按F12,進入開發(fā)者工具看看怎么個事兒,發(fā)現(xiàn)有個Top250(這個就是第一頁的頁面url鏈接,即響應就是頁面源代碼

1.2 引入request模塊

發(fā)現(xiàn)這里的請求是Get,因此引入request模塊,導入request.get(頁面鏈接)

?

import requests

url="https://movie.douban.com/top250"

resp=requests.get(url)  #獲取對應頁面url的請求響應

pageSource=resp.text   #把頁面源代碼輸出

print(pageSource)  #打印

這時候運行發(fā)現(xiàn)結果是空的:
?

2.繞過反爬

2.1 加入請求頭

說明缺少一個反爬的驗證,瀏覽器自動攔截了,這時候需要加一個請求頭

import requests

url="https://movie.douban.com/top250"

headers={

"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0"

}
resp=requests.get(url,headers=headers)

pageSource=resp.text

print(pageSource)

這樣就可以了:

?

3.編寫正則表達式與正則匹配

3.1 編寫正則表達式

接下來就需要進行數(shù)據(jù)分離:

引入re模塊,編寫正則表達式:

首先從標題開始提取,從<div class="item">為開頭,目標是第二個框里的文字內(nèi)容,這時候需要用到惰性匹配:.*?

?

3.2 對比表格

特性.* (貪婪).*? (非貪婪/懶惰)
核心原則匹配盡可能的字符匹配盡可能的字符
別名貪婪模式非貪婪模式、懶惰模式、最小匹配模式
回溯行為先吃到尾,再往回找吃一個看一次,滿足就停
示例文本Hello "World" and "Universe"Hello "World" and "Universe"
正則".*"".*?"
匹配結果一個結果:"World" and "Universe"兩個結果:"World" 和 "Universe"
適用場景匹配大塊的、從開始標志到結束標志之間的所有內(nèi)容匹配多個、成對標簽/引號之間的單個內(nèi)容
這里樣例的惰性匹配的結果是兩個結果的額原因是開啟了全局模式
 

沒有 g 標志:

  • 引擎在找到第一個匹配項后就停止。

有 g 標志:

  • 引擎在找到第一個匹配項后,會從上次匹配結束的位置開始,繼續(xù)尋找下一個匹配項。

但是這里還有一個坑,那就是.在匹配的時候是跳過所有非換行符的內(nèi)容

而re.S可以讓正則表達式中的.匹配換行符

#編寫正則表達式
re.compile(r'<div class="item">.*?<span class="title">(?P<name>.*?)</span>',re.S)

3.3 進行正則匹配

接下來進行正則匹配:

#進行正則匹配
result=obj.finditer(pageSource)
for item in result:
    print(item.group("name"))

?

然后根據(jù)上面的規(guī)則對源代碼進行匹配:

#編寫正則表達式
obj=re.compile(r'<div class="item">.*?<span class="title">(?P<name>.*?)</span>.*?<div class="bd">'
               r'.*?<p>.*?導演: (?P<dao>.*?)&nbsp;'
               r'.*?<br>(?P<year>.*?)&nbsp;.*?<span class="rating_num" property="v:average">(?P<score>.*?)</span>'
               r'.*?<span>(?P<num>.*?)人評價</span>',re.S)

#進行正則匹配
result=obj.finditer(pageSource)
for item in result:
    name=item.group("name")
    dao=item.group("dao")
    year = item.group("year").strip()   #去掉字符串兩側(cè)的空白
    score = item.group("score")
    num = item.group("num")
    print(name,dao,year,score,num)

得到了結果:

3.4 保存文件

接下來保存為文件:

f=open("top250.csv",mode="w",encoding='utf-8')

導出數(shù)據(jù):

f.write(f"{name}{dao}{year}{score}{num}\n")

爬取一頁的完整代碼:

# 思路:
#
# 1.拿到頁面源代碼
#
# 2.編寫正則,提取頁面數(shù)據(jù)
#
# 3.保存數(shù)據(jù)

import requests
import re

f=open("top250.csv",mode="w",encoding='utf-8')



url="https://movie.douban.com/top250"

headers={

"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0"

}
resp=requests.get(url,headers=headers)
resp.encoding="utf-8"  #解決亂碼問題
pageSource=resp.text

#編寫正則表達式
obj=re.compile(r'<div class="item">.*?<span class="title">(?P<name>.*?)</span>.*?<div class="bd">'
               r'.*?<p>.*?導演: (?P<dao>.*?)&nbsp;'
               r'.*?<br>(?P<year>.*?)&nbsp;.*?<span class="rating_num" property="v:average">(?P<score>.*?)</span>'
               r'.*?<span>(?P<num>.*?)人評價</span>',re.S)

#進行正則匹配
result=obj.finditer(pageSource)
for item in result:
    name=item.group("name")
    dao=item.group("dao")
    year = item.group("year").strip()   #去掉字符串兩側(cè)的空白
    score = item.group("score")
    num = item.group("num")
    f.write(f"{name}{dao}{year}{score}{num}\n")
    print(name,dao,year,score,num)


f.close()
resp.close()

print("豆瓣Top250提取完畢")

這時候思考,現(xiàn)在的代碼只能爬取一頁的25條信息,如何爬取全部250條?

4.翻頁爬取

由于發(fā)現(xiàn)每跳轉(zhuǎn)一頁頁面url的start都會增加25,因此得出可以用while循環(huán)來爬取全部數(shù)據(jù)

start=(頁數(shù)-1)*25

四、完整代碼與注意點

1.完整代碼

# 思路:
#
# 1.拿到頁面源代碼
#
# 2.編寫正則,提取頁面數(shù)據(jù)
#
# 3.保存數(shù)據(jù)

import requests
import re

f=open("top250.csv",mode="w",encoding='utf-8')
#start=(頁數(shù)-1)*25
page=1

while page<=10:
    url=f"https://movie.douban.com/top250?start={(page - 1) * 25}&filter="

    headers={

    "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0"

    }
    resp=requests.get(url,headers=headers)
    resp.encoding="utf-8"  #解決亂碼問題
    pageSource=resp.text

    #編寫正則表達式
    obj=re.compile(r'<div class="item">.*?<span class="title">(?P<name>.*?)</span>.*?<div class="bd">'
                   r'.*?<p>.*?導演: (?P<dao>.*?)&nbsp;'
                   r'.*?<br>(?P<year>.*?)&nbsp;.*?<span class="rating_num" property="v:average">(?P<score>.*?)</span>'
                   r'.*?<span>(?P<num>.*?)人評價</span>',re.S)

    #進行正則匹配
    result=obj.finditer(pageSource)
    for item in result:
        name=item.group("name")
        dao=item.group("dao")
        year = item.group("year").strip()   #去掉字符串兩側(cè)的空白
        score = item.group("score")
        num = item.group("num")
        f.write(f"{name}{dao}{year}{score}{num}\n")
        print(name,dao,year,score,num)
    print(f"第{page}頁爬取完成")

    page = page + 1



f.close()
resp.close()

print("豆瓣Top250提取完畢")

2.注意點

解釋一下

url=f"https://movie.douban.com/top250?start={(page - 1) * 25}&filter="

這里的f必須要加

不加 f 的情況:

url="https://movie.douban.com/top250?start={(page - 1) * 25}&filter="

實際URL變成了:

https://movie.douban.com/top250?start={(page - 1) * 25}&filter=

注意:{(page - 1) * 25} 被當作普通字符串,而不是要計算的表達式。無論 page 是多少,URL 始終是這個固定的字符串。

豆瓣服務器收到這個請求時,看到 start={(page - 1) * 25},它不知道這是什么,通常會將其視為 start=0 或者忽略這個參數(shù),所以每次都返回第一頁的數(shù)據(jù)。

五、結果展示

成功爬取250條數(shù)據(jù)~

到此這篇關于Python爬蟲抓取豆瓣TOP250數(shù)據(jù)從分析到實踐的全過程(詳細圖解)的文章就介紹到這了,更多相關Python爬取豆瓣TOP數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python 結巴分詞實現(xiàn)關鍵詞抽取分析

    Python 結巴分詞實現(xiàn)關鍵詞抽取分析

    這篇文章主要介紹了Python 結巴分詞實現(xiàn)關鍵詞抽取分析,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Python如何使用組合方式構建復雜正則

    Python如何使用組合方式構建復雜正則

    在Python中正則寫復雜了很麻煩,難寫難調(diào)試,其實只需要兩個函數(shù),就能用簡單正則組合構建復雜正則,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-12-12
  • Python語言實現(xiàn)獲取主機名根據(jù)端口殺死進程

    Python語言實現(xiàn)獲取主機名根據(jù)端口殺死進程

    這篇文章主要介紹了Python語言實現(xiàn)獲取主機名根據(jù)端口殺死進程的相關資料,需要的朋友可以參考下
    2016-03-03
  • 使用Python將dtso文件轉(zhuǎn)換成dtbo文件的方法

    使用Python將dtso文件轉(zhuǎn)換成dtbo文件的方法

    本文介紹了創(chuàng)建DTSO轉(zhuǎn)DTBO工具的步驟,包括安裝Python、使用Python編寫命令行和圖形界面應用、使用PyInstaller打包為可執(zhí)行文件,以及測試和分發(fā)注意事項,最后提到工具與Flutter無直接關聯(lián),后者是Google開發(fā)的UI工具包,需要的朋友可以參考下
    2026-05-05
  • Python進階之高級用法詳細總結

    Python進階之高級用法詳細總結

    今天帶各位小伙伴學習一下Python高級語法,主要有Lambda表達式,map函數(shù),filter函數(shù),reduce函數(shù),三大推導式等,文中有非常詳細的介紹,需要的朋友可以參考下
    2021-05-05
  • Numpy數(shù)組array和矩陣matrix轉(zhuǎn)換方法

    Numpy數(shù)組array和矩陣matrix轉(zhuǎn)換方法

    這篇文章主要介紹了Numpy數(shù)組array和矩陣matrix轉(zhuǎn)換方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • Python?Serial串口的簡單數(shù)據(jù)收發(fā)方式

    Python?Serial串口的簡單數(shù)據(jù)收發(fā)方式

    這篇文章主要介紹了Python?Serial串口的簡單數(shù)據(jù)收發(fā)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • python使用sklearn實現(xiàn)決策樹的方法示例

    python使用sklearn實現(xiàn)決策樹的方法示例

    這篇文章主要介紹了python使用sklearn實現(xiàn)決策樹的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • 如何在pycharm中安裝第三方包

    如何在pycharm中安裝第三方包

    這篇文章主要介紹了如何在pycharm中安裝第三方包,本文分步驟通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • Python使用numpy模塊創(chuàng)建數(shù)組操作示例

    Python使用numpy模塊創(chuàng)建數(shù)組操作示例

    這篇文章主要介紹了Python使用numpy模塊創(chuàng)建數(shù)組操作,結合實例形式分析了Python使用numpy模塊實現(xiàn)數(shù)組的創(chuàng)建、賦值、修改、打印等相關操作技巧與注意事項,需要的朋友可以參考下
    2018-06-06

最新評論

曲阜市| 金秀| 庆阳市| 万山特区| 邹平县| 遂川县| 班戈县| 五寨县| 湖南省| 宣汉县| 陆良县| 南康市| 北流市| 固始县| 荔波县| 南城县| 丰都县| 寿光市| 镇江市| 吴旗县| 西丰县| 固安县| 务川| 临邑县| 松桃| 易门县| 桃江县| 济宁市| 海淀区| 铜川市| 芦溪县| 城固县| 德化县| 疏附县| 增城市| 沈阳市| 永福县| 高要市| 天柱县| 西安市| 库车县|