用python爬取豆瓣前一百電影
網(wǎng)站爬取的流程圖:
實(shí)現(xiàn)項(xiàng)目我們需要運(yùn)用以下幾個(gè)知識(shí)點(diǎn)
一、獲取網(wǎng)頁(yè)
1.找網(wǎng)頁(yè)規(guī)律;
2.使用 for 循環(huán)語(yǔ)句獲得網(wǎng)站前4頁(yè)的網(wǎng)頁(yè)鏈接;
3.使用 Network 選項(xiàng)卡查找Headers信息;
4.使用 requests.get() 函數(shù)帶著 Headers 請(qǐng)求網(wǎng)頁(yè)。
二、解析網(wǎng)頁(yè)
1.使用 BeautifulSoup 解析網(wǎng)頁(yè);
2.使用 BeautifulSoup 對(duì)象調(diào)用 find_all() 方法定位包含單部電影全部信息的標(biāo)簽;
3.使用 Tag.text 提取序號(hào)、電影名、評(píng)分、推薦語(yǔ);
4.使用 Tag['屬性名'] 提取電影詳情鏈接。
三、存儲(chǔ)數(shù)據(jù)
1.使用 with open() as … 創(chuàng)建要寫入內(nèi)容的 csv 文件;
2.使用 csv.DictWriter() 將文件對(duì)象轉(zhuǎn)換為 DictWriter 對(duì)象;
3.參數(shù) fieldnames 用來(lái)設(shè)置 csv 文件的表頭;
4.使用 writeheader() 寫入表頭;
5.使用 writerows() 將內(nèi)容寫入 csv 文件。
實(shí)現(xiàn)代碼:
import csvimport requestsfrom bs4 import BeautifulSoup# 設(shè)置列表,用以存儲(chǔ)每部電影的信息data_list = []# 設(shè)置請(qǐng)求頭headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36'}# 使用 for 循環(huán)遍歷取值范圍為 0~3 的數(shù)據(jù)for page_number in range(4): # 設(shè)置要請(qǐng)求的網(wǎng)頁(yè)鏈接 url = 'https://movie.douban.com/top250?start={}&filter='.format(page_number * 25) # 請(qǐng)求網(wǎng)頁(yè) movies_list_res = requests.get(url, headers=headers) # 解析請(qǐng)求到的網(wǎng)頁(yè)內(nèi)容 bs = BeautifulSoup(movies_list_res.text, 'html.parser') # 搜索網(wǎng)頁(yè)中所有包含單部電影全部信息的 Tag movies_list = bs.find_all('div', class_='item') # 使用 for 循環(huán)遍歷搜索結(jié)果 for movie in movies_list: # 提取電影的序號(hào) movie_num = movie.find('em').text # 提取電影名 movie_name = movie.find('span').text # 提取電影的評(píng)分 movie_score = movie.find("span",class_='rating_num').text # 提取電影的推薦語(yǔ) movie_instruction = movie.find("span",class_='inq').text # 提取電影的鏈接 movie_link = movie.find('a')['href'] # 將信息添加到字典中 movie_dict = { '序號(hào)': movie_num, '電影名': movie_name, '評(píng)分': movie_score, '推薦語(yǔ)': movie_instruction, '鏈接': movie_link } # 打印電影的信息 print(movie_dict) # 存儲(chǔ)每部電影的信息 data_list.append(movie_dict)# 新建 csv 文件,用以存儲(chǔ)電影信息with open('movies.csv', 'w', encoding='utf-8-sig') as f: # 將文件對(duì)象轉(zhuǎn)換成 DictWriter 對(duì)象 f_csv = csv.DictWriter(f, fieldnames=['序號(hào)', '電影名', '評(píng)分', '推薦語(yǔ)', '鏈接']) # 寫入表頭與數(shù)據(jù) f_csv.writeheader() f_csv.writerows(data_list)
代碼分析:
(1)通過(guò)觀察網(wǎng)站一頁(yè)的電影數(shù),可以發(fā)現(xiàn)一頁(yè)只有 25 部電影的信息。
也就是說(shuō)我們需要爬取網(wǎng)站前4頁(yè)(100 = 25*4)的電影信息。
這里我們使用了遍歷,爬取前四頁(yè)的數(shù)據(jù)。
(2)通過(guò)快捷鍵打開網(wǎng)頁(yè)的開發(fā)者工具(Windows 用戶可以在瀏覽器頁(yè)面下按 Ctrl + Shift + I
鍵或者直接F12喚出瀏覽器開發(fā)者工具,Mac 用戶的快捷鍵為 command + option + I
)。
接著使用開發(fā)者工具中的指針工具,大致查看一下前兩部電影中,需爬取的信息所在位置,觀察一下其中是否有什么規(guī)律。
可以發(fā)現(xiàn)第一部電影里序號(hào)、電影名、評(píng)分、推薦語(yǔ)以及詳情鏈接在class
屬性值為"item"的標(biāo)簽里。
(3)豆瓣電影 Top250 的 Robots 協(xié)議
并沒(méi)有看到Disallow: /Top250,這說(shuō)明可以對(duì)這個(gè)網(wǎng)頁(yè)進(jìn)行爬取。
(4)在互聯(lián)網(wǎng)世界中,網(wǎng)絡(luò)請(qǐng)求會(huì)將瀏覽器信息儲(chǔ)存在請(qǐng)求頭
(Request Header)當(dāng)中。
只要我們將瀏覽器信息復(fù)制下來(lái),在爬蟲程序只要在發(fā)起請(qǐng)求時(shí),設(shè)置好與請(qǐng)求頭
對(duì)應(yīng)的參數(shù),即可成功偽裝成瀏覽器。
(5)代碼思路
1)熟練地使用開發(fā)者工具的指針工具,可以很方便地幫助我們定位數(shù)據(jù)。
2)用指針工具定位到各個(gè)數(shù)據(jù)所在位置后,查看它們的規(guī)律。
3)想要提取的標(biāo)簽如果具有屬性,可以使用 Tag.find(HTML元素名, HTML屬性名='')來(lái)提取;沒(méi)有屬性的話,可以在這個(gè)標(biāo)簽附近找到一個(gè)有屬性的標(biāo)簽,然后再進(jìn)行 find() 提取。
通過(guò)上述步驟將信息爬取下來(lái)后,就走到我們爬蟲的最后一步——存儲(chǔ)數(shù)據(jù)。
(6)存儲(chǔ)數(shù)據(jù)
1)調(diào)用 csv 模塊中類 DictWriter 的語(yǔ)法為:csv.DictWriter(f, fieldnames)
。語(yǔ)法中的參數(shù) f 是 open() 函數(shù)打開的文件對(duì)象;參數(shù) fieldnames 用來(lái)設(shè)置文件的表頭;
2)執(zhí)行csv.DictWriter(f, fieldnames)
后會(huì)得到一個(gè) DictWriter 對(duì)象;
3)得到的 DictWriter 對(duì)象可以調(diào)用 writeheader()
方法,將 fieldnames 寫入 csv 的第一行;
4)最后,調(diào)用 writerows()
方法將多個(gè)字典寫進(jìn) csv 文件中。
運(yùn)行結(jié)果:
生成的CSV文件:
總結(jié)
到此這篇關(guān)于用python爬取豆瓣前一百電影的文章就介紹到這了,更多相關(guān)python爬取豆瓣電影內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于CUDA out of memory的解決方案
這篇文章主要介紹了關(guān)于CUDA out of memory的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02Python工程師面試必備25條知識(shí)點(diǎn)
這篇文章主要為大家詳細(xì)介紹了Python工程師面試必備25條知識(shí)點(diǎn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01numba提升python運(yùn)行速度的實(shí)例方法
在本篇文章里小編給大家整理的是一篇關(guān)于numba提升python運(yùn)行速度的實(shí)例方法,有興趣的朋友們可以參考下。2021-01-01詳解Django關(guān)于StreamingHttpResponse與FileResponse文件下載的最優(yōu)方法
這篇文章主要介紹了詳解Django關(guān)于StreamingHttpResponse與FileResponse文件下載的最優(yōu)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Python執(zhí)行遺傳編程gplearn庫(kù)使用實(shí)例探究
這篇文章主要為大家介紹了Python執(zhí)行遺傳編程gplearn庫(kù)使用實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01