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