亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

一、開門見山,探究網(wǎng)頁(yè)結(jié)構(gòu)

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

讓我們打開頁(yè)面:

右鍵查看頁(yè)面源代碼,Ctrl+/頁(yè)面搜索關(guān)鍵詞:肖申克

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

二、確定思路

1.拿到頁(yè)面源代碼/響應(yīng)

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

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

三、步驟詳解

1.初步爬取

1.1 確定請(qǐng)求方式

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

1.2 引入request模塊

發(fā)現(xiàn)這里的請(qǐng)求是Get,因此引入request模塊,導(dǎo)入request.get(頁(yè)面鏈接)

?

import requests

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

resp=requests.get(url)  #獲取對(duì)應(yīng)頁(yè)面url的請(qǐng)求響應(yīng)

pageSource=resp.text   #把頁(yè)面源代碼輸出

print(pageSource)  #打印

這時(shí)候運(yùn)行發(fā)現(xiàn)結(jié)果是空的:
?

2.繞過反爬

2.1 加入請(qǐng)求頭

說明缺少一個(gè)反爬的驗(yàn)證,瀏覽器自動(dòng)攔截了,這時(shí)候需要加一個(gè)請(qǐng)求頭

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.編寫正則表達(dá)式與正則匹配

3.1 編寫正則表達(dá)式

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

引入re模塊,編寫正則表達(dá)式:

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

?

3.2 對(duì)比表格

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

沒有 g 標(biāo)志:

  • 引擎在找到第一個(gè)匹配項(xiàng)后就停止。

有 g 標(biāo)志:

  • 引擎在找到第一個(gè)匹配項(xiàng)后,會(huì)從上次匹配結(jié)束的位置開始,繼續(xù)尋找下一個(gè)匹配項(xiàng)。

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

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

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

3.3 進(jìn)行正則匹配

接下來進(jìn)行正則匹配:

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

?

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

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

#進(jìn)行正則匹配
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)

得到了結(jié)果:

3.4 保存文件

接下來保存為文件:

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

導(dǎo)出數(shù)據(jù):

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

爬取一頁(yè)的完整代碼:

# 思路:
#
# 1.拿到頁(yè)面源代碼
#
# 2.編寫正則,提取頁(yè)面數(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

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

#進(jìn)行正則匹配
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提取完畢")

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

4.翻頁(yè)爬取

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

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

四、完整代碼與注意點(diǎn)

1.完整代碼

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

import requests
import re

f=open("top250.csv",mode="w",encoding='utf-8')
#start=(頁(yè)數(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

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

    #進(jìn)行正則匹配
    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}頁(yè)爬取完成")

    page = page + 1



f.close()
resp.close()

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

2.注意點(diǎn)

解釋一下

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="

實(shí)際URL變成了:

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

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

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

五、結(jié)果展示

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

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

相關(guān)文章

  • 基于Python+Flask設(shè)計(jì)實(shí)現(xiàn)AI智能天氣助手系統(tǒng)

    基于Python+Flask設(shè)計(jì)實(shí)現(xiàn)AI智能天氣助手系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了如何基于Python和Flask設(shè)計(jì)實(shí)現(xiàn)一個(gè)AI智能天氣助手系統(tǒng),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下
    2025-03-03
  • Python使用xlrd模塊實(shí)現(xiàn)操作Excel讀寫的方法匯總

    Python使用xlrd模塊實(shí)現(xiàn)操作Excel讀寫的方法匯總

    本文介紹Python中使用xlrd、xlwt、xlutils模塊操作Excel文件的方法,xlrd用于讀取Excel文件,但2.0.0版本后不支持.xlsx格式,xlwt用于創(chuàng)建和寫入Excel文件,而xlutils主要用于復(fù)制和處理Excel文件,詳細(xì)介紹了如何打開文件、獲取工作表信息、操作行列數(shù)據(jù)和處理日期格式數(shù)據(jù)
    2024-10-10
  • 手動(dòng)安裝python3.6的操作過程詳解

    手動(dòng)安裝python3.6的操作過程詳解

    這篇文章主要介紹了如何手動(dòng)安裝python3.6,本文給大家?guī)砹税惭b步驟,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Python中decorator使用實(shí)例

    Python中decorator使用實(shí)例

    這篇文章主要介紹了Python中decorator使用實(shí)例,本文講解了如何調(diào)用decorator、decorator函數(shù)的定義、decorator的應(yīng)用場(chǎng)景等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • Python使用xlrd輕松讀取Excel文件的示例代碼

    Python使用xlrd輕松讀取Excel文件的示例代碼

    本文主要介紹了使用 Python 的 xlrd 庫(kù)讀取 Excel 文件的方法,包括安裝、各種操作如工作表操作、單元格操作、行與列操作、處理不同數(shù)據(jù)類型、性能優(yōu)化、結(jié)合其他庫(kù)、自定義處理等,還提到了一些特殊情況的處理及自定義類封裝讀取邏輯,需要的朋友可以參考下
    2024-11-11
  • 安裝好Pycharm后如何配置Python解釋器簡(jiǎn)易教程

    安裝好Pycharm后如何配置Python解釋器簡(jiǎn)易教程

    這篇文章主要介紹了安裝好Pycharm后如何配置Python解釋器簡(jiǎn)易教程,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-06-06
  • python 5個(gè)頂級(jí)異步框架推薦

    python 5個(gè)頂級(jí)異步框架推薦

    這篇文章主要介紹了python5個(gè)頂級(jí)的異步框架,幫助大家更好的利用python進(jìn)行web開發(fā),感興趣的朋友可以了解下
    2020-09-09
  • Pandas數(shù)據(jù)清洗與過濾空值技巧

    Pandas數(shù)據(jù)清洗與過濾空值技巧

    在數(shù)據(jù)分析過程中,使用pandas庫(kù)進(jìn)行數(shù)據(jù)清洗和過濾空值是基本而重要的步驟,首先,導(dǎo)入pandas庫(kù)并加載數(shù)據(jù),其次,利用isnull()或isna()方法檢查數(shù)據(jù)中的空值,接著,可以使用dropna()方法過濾掉含有空值的行,或針對(duì)特定列過濾空值
    2024-09-09
  • Python 裝飾器原理、定義與用法詳解

    Python 裝飾器原理、定義與用法詳解

    這篇文章主要介紹了Python 裝飾器原理、定義與用法,結(jié)合實(shí)例形式分析了Python裝飾器的概念、定義、實(shí)現(xiàn)方法、應(yīng)用場(chǎng)景及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-12-12
  • Python中使用partial改變方法默認(rèn)參數(shù)實(shí)例

    Python中使用partial改變方法默認(rèn)參數(shù)實(shí)例

    這篇文章主要介紹了Python中使用partial改變方法默認(rèn)參數(shù)實(shí)例,本文直接給出使用實(shí)例,代碼中包含詳細(xì)注釋,需要的朋友可以參考下
    2015-04-04

最新評(píng)論