1. 程式人生 > >Python爬取豆瓣電影Top250資料

Python爬取豆瓣電影Top250資料

初學pyhton,自己找個練手任務。爬取豆瓣電影top250,儲存為一個DataFrame資料格式,留待分析.(程式碼粗糙,留存)

from bs4 import BeautifulSoup
from urllib.request import urlopen
import pandas as pd
import numpy as np
from pandas import DataFrame,Series
import re
def split(str,regular):  #正則表示式過濾字串
    return re.split(regular,str)

def trans_list
(main_list,sub_list):
index=main_list.index(sub_list) sub_list.reverse() #反轉list的排列 for ele in sub_list: main_list.insert(index,ele) #後一以元素插入在前一元素之前 main_list.pop(main_list.index(sub_list)) return main_list def extract_info(li_tag): #使用.stripped_strings更方便 info=[] for
string in li_tag.stripped_strings: info.append(string) #info=['1', '肖申克的救贖', '/\xa0The Shawshank Redemption', '/\xa0月黑高飛(港) / 刺激1995(臺)', #'[可播放]', '導演: 弗蘭克·德拉邦特 Frank Darabont\xa0\xa0\xa0主演: 蒂姆·羅賓斯 Tim Robbins /...', #'1994\xa0/\xa0美國\xa0/\xa0犯罪 劇情', '9.6', '693081人評價', '希望讓人自由。'] if '[可播放]'
in info: index=info.index('[可播放]') info.pop(index) #delete unused info,the index-1 class_hd=li_tag.find('div',{'class':'hd'}) if len(class_hd.a.find_all('span'))==2: if ' / ' in info[2]: info.insert(2,np.NaN) #缺失則插入NaN,注意index info[3]=info[3][2:] else: info[2]=info[2][2:] info.insert(3,np.NaN) else: info[2]=info[2][2:] #MovieName,\xa0表示16進位制下A0的一個數,為一個字元 info[3]=info[3][2:] #EnglishName Dir_and_Act=split(info[4],r':|\xa0\xa0\xa0') #正則表示式分割字串 if len(Dir_and_Act)<4: Dir_and_Act.append('NaN') Yea_Cou_Gen=split(info[5],r'\xa0/\xa0') info[4]=Dir_and_Act info[5]=Yea_Cou_Gen info=trans_list(info,Dir_and_Act) info=trans_list(info,Yea_Cou_Gen) info.pop(4) #去除‘導演’ info.pop(5) #起初’演員‘ return info #返回一行movie的資料,list的形式 def collecting_data(url,database): soup=BeautifulSoup(urlopen(url),'lxml') movie_grid=soup.find_all('ol',{'class':'grid_view'}) #找到電影表單 movie=movie_grid[0].find_all('li') for li in movie: database.append(extract_info(li)) #data為list前提下,DataFrame([data])為行排列,DataFrame(data)為列排列 return database #database=[[],[],[],....] def collect_all(url): database=[] collecting_data(url,database) data=pd.DataFrame(database) return data #返回一行daframe格式 #mian #url=r'https://movie.douban.com/top250?start=0&filter='#豆瓣電影top250地址 page=[] for sequence in list(range(0,250,25)): url=r'https://movie.douban.com/top250?start=%d&filter=' %sequence #所有top250的網頁地址 page.append(collect_all(url)) #新增資料 GeneralData=pd.DataFrame() for i in range(len(page)): GeneralData=pd.concat([GeneralData,page[i]],ignore_index=True) #pd.concat:[]內要為DataFrame形式, #儲存資料,待整理分析 GeneralData=GeneralData.drop(0,axis=1) #去除編號的一列 column=['MovieName','EnglishName','OtherName','Director',\ 'Actors','Year','Country','Grenre','Rating10','RatingNum',\ 'Description'] GeneralData.columns=column GeneralData.to_csv('MovieTop250.csv',encoding='utf-8') #此函式預設解碼方式為utf-8,但是在儲存時不加encoding的話,讀取會產生錯誤 GeneralData.to_csv('Movie.csv')

資料結果如下圖:
結果