一、數據采集
1、代碼展示
import requests
import re
from bs4 import BeautifulSoup
import pandas as pd
import time
paiming=[]
juming=[]
shijian=[]
daoyan=[]
pingfen=[]
pingren=[]
jianjie=[]
urllist=[]
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
for i in range(0,10):
a=i*25
url='https://movie.douban.com/top250?start={}&filter='.format(a)
try:
r=requests.get(url,timeout=30,headers=headers)
r.encoding=r.apparent_encoding
uu=re.compile(r'href="https://movie.douban.com/subject/(.*?)/"')
uus=uu.findall(r.text)
uus=set(uus)
uus=list(uus)
for i in uus:
rr='https://movie.douban.com/subject/'+i+'/'
urllist.append(rr)
except:
print('url獲取失敗')
for i in urllist:
url=i
print(i)
try:
r=requests.get(url,timeout=30,headers=headers)
r.encoding='utf-8'
soup = BeautifulSoup(r.text, "html.parser")
pm = soup.select('span["class=top250-no"]')[0] #匹配排名
p = str(pm.get_text())
m = re.compile(r'[0-9]+')
mm = m.findall(p)[0]
paiming.append(eval(mm)) #將排名轉換為數字類型
a=soup.select('#content')
bt=a[0].h1.span
juming.append(str(bt.string)) #匹配電影名字
sj=a[0].h1.select("span[class=year]")
t = re.compile(r'\((.*?)\)')
tt = t.findall(sj[0].string)[0]
shijian.append(eval(tt)) #匹配電影時間並且轉換為數字類型
dy=a[0].select("span[class=attrs]")
daoyan.append(str(dy[0].get_text())) #匹配導演
pf=a[0].select('#interest_sectl')[0].select('strong[class="ll rating_num"]')[0]
pingfen.append(eval(str(pf.string))) #匹配評分
pj=a[0].select('#interest_sectl')[0].select('.rating_people')[0].span
pingren.append(eval(str(pj.string))) #匹配評價人數
jj=soup.select('#link-report')[0]
ww=str(jj.span.get_text())
out = "".join(ww.split())
jianjie.append(out) #匹配簡介
time.sleep(2)
except:
print('爬取失敗')
m = {"劇名": juming,"時間": shijian,"排名":paiming,"導演":daoyan,"評分":pingfen,"評價人數":pingren,"簡介":jianjie}
file=pd.DataFrame(m)
df=file.sort_values(by='排名',ascending=True)
df.to_csv("./豆瓣.csv", encoding="utf-8",index=False)
2、網頁結構分析
在分析網頁結構的同時考慮到后期的數據分析及展示,所以直接將拿到的數據進行清理整合
(1)、 電影排名都在class="top250-no"的span標簽里,這里用select方法拿到電影排名,拿到排名后將排名轉換為整數型
(2)、然后開始獲取接下來的內容電影名字、上映時間、導演名字、評分、評論人數,發現這些內容的ID屬性都一樣都是id="content",然后就可以分步獲取
(3)、電影名字都在h1標簽下的span標簽
(4)、匹配導演名字
(5)、匹配評價人數
(6)、匹配電影簡介
到此為止單個的網頁解析已經完畢,下面要拿到所有電影的URL
3、拿到所有的電影的url

每一頁25個電影的URL,用正則匹配出來
一共十頁,觀察每頁URL的規律
二、分析
1、詞雲圖
(1)代碼
import re # 正則表達式庫
import collections # 詞頻統計庫
import pandas as pd
import jieba # 結巴分詞
import wordcloud # 詞雲展示庫
import matplotlib.pyplot as plt
num=eval(input('請輸入電影排名:'))
datapath = './豆瓣.csv'
df = pd.read_csv(datapath,encoding='utf-8')
a=list(df['簡介'])
string_data=a[num-1] #
pattern = re.compile(u'\t|\n|\.|-|:|;|\)|\(|\?|"')
string_data = re.sub(pattern, '', string_data)
seg_list_exact = jieba.cut(string_data, cut_all = False)
object_list = []
path = 'stoplist.txt'
file_in = open(path, 'r', encoding='utf-8')
content = file_in.read()
remove_words = list(content)
for word in seg_list_exact:
if word not in remove_words:
object_list.append(word)
word_counts = collections.Counter(object_list)
word_counts_top10 = word_counts.most_common(10)
wc = wordcloud.WordCloud(
font_path='C:/Windows/Fonts/simhei.ttf',
max_words=50,
max_font_size=100,
scale=5
)
wc.generate_from_frequencies(word_counts)
# image_colors = wordcloud.ImageColorGenerator(mask)
# wc.recolor(color_func=image_colors)
plt.imshow(wc)
plt.axis('off')
plt.show()
(2)效果
排名第二的“霸王別姬”’詞雲效果圖
2、評論人數圖
(1)代碼
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
datapath = './豆瓣.csv'
df = pd.read_csv(datapath,encoding='utf-8')
a=list(df['排名'])[0:30]
b=list(df['評價人數'])[0:30]
plt.figure(figsize=(8, 6), dpi=300)
plt.title('豆瓣電影TOP250評論人數')
plt.xlabel('電影排名')
plt.ylabel('評論人數')
values = b
width = 0.35
p2 = plt.bar(a, values, width,label='人數', color="green")
plt.xticks(tuple(a))
plt.legend()
plt.show()
3、效果
3、電影評分布圖
(1)代碼
import pandas as pd
import matplotlib.pyplot as plt
import collections # 詞頻統計庫
datapath = './豆瓣.csv'
df = pd.read_csv(datapath,encoding='utf-8')
aa=list(df['評分'])
word_counts = collections.Counter(aa)
word_counts_top10 = word_counts.most_common(10)
print(word_counts_top10)
bb=dict(word_counts)
mm=list(bb.keys())
nn=list(bb.values())
plt.rcParams['font.sans-serif']=['SimHei']
label = mm
fractions = nn
plt.pie(fractions,labels=label,autopct='%1.2f%%')
plt.title("豆瓣電影評分分布")
plt.show()
(2)效果
四、結論:
1、通過主題數據的分析與可視化可以讓數據更加清楚直觀。
2、經過這次的課程設計,將之前學的內容進行了一個整合,復習,應用到了課程設計中,但是還有很多地方不夠熟練,需要多加練習。