爬取豆瓣電影Top250和資料分析

專注的阿熊發表於2022-06-20

import requests

from bs4 import BeautifulSoup

from pandas import DataFrame

'''

     最後成功提取了

     ' 電影排名 ',' 電影名 ',' 上映時間 ',' 導演 ',' 主演 ',' 電影型別 ',' 電影評分 ',' 評價人數 ',' 電影連結 '

     最後將結果輸出到了 豆瓣電影 Top250.xlsx

     但是還存在問題:就是提取語言和製片國家 / 地區時,出現沒有 selector 的情況。

     要解決該問題可能需要 xpath

'''

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.55'}

start_num = [i for i in range(0,226,25)]

list_url_mv = []        # 所有電影的 URL

for start in start_num:

     url = '{}&filter='.format(start)

     print(' 正在處理 url ',url)

     response = requests.get(url=url, headers=headers)

     soup = BeautifulSoup(response.text, 'html.parser')

     url_mv_list = soup.select('#content > div > div.article > ol > li > div > div.info > div.hd > a')

     # print(url_mv_list)

     for index_url in range(len(url_mv_list)):

         url_mv = url_mv_list[index_url]['href']

         list_url_mv.append(url_mv)

         # print(url_mv)

# 對每部電影進行處理

def loading_mv(url,number):

     list_mv = []

     print('----- 正在處理第 {} 部電影 -----'.format(number+1))

     list_mv.append(number+1)        # 排名

     # 解析網頁

     response_mv = requests.get(url=url,headers=headers)

     soup_mv =外匯跟單gendan5.com BeautifulSoup(response_mv.text,'html.parser')

     # 爬取電影名

     mv_name = soup_mv.find_all('span',attrs={'property':'v:itemreviewed'})      # 電影名

     mv_name = mv_name[0].get_text()

     list_mv.append(mv_name)

     # print(mv_name)

     # 爬取電影的上映時間

     mv_year = soup_mv.select('span.year')       # 電影上映時間

     mv_year = mv_year[0].get_text()[1:5]

     list_mv.append(mv_year)

     # print(mv_year)

     # 爬取導演資訊

     list_mv_director = []       # 導演

     mv_director = soup_mv.find_all('a',attrs={'rel':"v:directedBy"})

     for director in mv_director:

         list_mv_director.append(director.get_text())

     string_director = '/'.join(list_mv_director)        # 重新定義格式

     list_mv.append(string_director)

     # print(list_mv_director)

     # 爬取主演資訊

     list_mv_star = []           # 主演

     mv_star = soup_mv.find_all('span',attrs={'class':'actor'})

     if mv_star == []:           # 在第 210 部時沒有主演

         list_mv.append(None)

     else :

         mv_star = mv_star[0].get_text().strip().split('/')

         mv_first_star = mv_star[0].split(':')

         list_mv_star.append(mv_first_star[-1].strip())

         del mv_star[0]           # 去除 ' 主演 ' 欄位

         for star in  mv_star:

             list_mv_star.append(star.strip())

         string = '/'.join(list_mv_star)          # 重新定義格式

         list_mv.append(string)

     # 爬取電影型別

     list_mv_type = []       # 電影型別

     mv_type = soup_mv.find_all('span',attrs={'property':'v:genre'})

     for type in mv_type:

         list_mv_type.append(type.get_text())

     string_type = '/'.join(list_mv_type)

     list_mv.append(string_type)

     # print(list_mv_type)

     # 爬取電影評分

     mv_score = soup_mv.select('strong.ll.rating_num')       # 評分

     mv_score = mv_score[0].get_text()

     list_mv.append(mv_score)

     # 爬取評價人數

     mv_evaluation_num = soup_mv.select('a.rating_people')       # 評價人數

     mv_evaluation_num = mv_evaluation_num[0].get_text().strip()

     list_mv.append(mv_evaluation_num)

     # 爬取劇情簡介

     mv_plot = soup_mv.find_all('span',attrs={"class":"all hidden"})     # 劇情簡介

     if mv_plot == []:

          list_mv.append(None)

     else:

         string_plot = mv_plot[0].get_text().strip().split()

         new_string_plot = ' '.join(string_plot)

         list_mv.append(new_string_plot)

     # 加入電影網址

     list_mv.append(url)

     return list_mv

# url1 = '

# url2 = '      # 210

# a = loading_mv(url1,1)

# # b = loading_mv(url2,210)

# # list_all_mv.append(a)

# # list_all_mv.append(b)

list_all_mv = []

dict_mv_info = {}

for number in range(len(list_url_mv)):

     mv_info = loading_mv(list_url_mv[number],number)

     list_all_mv.append(mv_info)

print('----- 執行結束 -----')

pd = DataFrame(list_all_mv,columns=[' 電影排名 ',' 電影名 ',' 上映時間 ',' 導演 ',' 主演 ',' 電影型別 ',' 電影評分 ',' 評價人數 ',' 電影簡介 ',' 電影連結 '])

# print(pd)

pd.to_excel(r'C:\Users\86178\Desktop\ 豆瓣電影 Top250.xlsx')


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2901599/,如需轉載,請註明出處,否則將追究法律責任。

相關文章