python 爬取豆瓣電影評論,並進行詞雲展示及出現的問題解決辦法
本文旨在提供爬取豆瓣電影《我不是藥神》評論和詞雲展示的程式碼樣例
1、分析URL
2、爬取前10頁評論
3、進行詞雲展示
1、分析URL
我不是藥神 短評
第一頁url
https://movie.douban.com/subject/26752088/comments?start=0&limit=20&sort=new_score&status=P
第二頁url
https://movie.douban.com/subject/26752088/comments?start=20&limit=20&sort=new_score&status=P
…
…
…
第十頁url
https://movie.douban.com/subject/26752088/comments?start=180&limit=20&sort=new_score&status=P
分析發現每次變化的只是…strat=後面的數字,其他內容不變,可以以此遍歷每一頁的評論。
2、爬取前10頁評論
程式碼:
import urllib.request
from bs4 import BeautifulSoup
def getHtml(url):
"""獲取url頁面"""
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'}
req = urllib.request.Request(url,headers=headers)
req = urllib.request.urlopen(req)
content = req.read().decode('utf-8')
return content
def getComment(url):
"""解析HTML頁面"""
#html = getHtml(url)
response = urllib.request.urlopen(url)
html = response.read()
html = html.decode('utf-8','ignore')
soupComment = BeautifulSoup(html, 'html.parser')
comments = soupComment.findAll('span', 'short') onePageComments = [] for comment in comments: # print(comment.getText()+'\n') onePageComments.append(comment.getText()+'\n') return onePageComments
if name == 'main':
f = open('我不是藥神page10.txt', 'w', encoding='utf-8')
for page in range(10): #爬取10頁的評論
url = 'https://movie.douban.com/subject/26752088/comments?start=' + str(20*page) + '&limit=20&sort=new_score&status=P'
print('第%s頁的評論:' % (page+1))
print(url + '\n')
for i in getComment(url):
f.write(i)
print(i)
print('\n')
★★問題出現:
(1)當IDLE Python3.5執行時出現下面問題:
執行結果的檔案“我不是藥神page10.txt”是空白的
(2)在cmd下執行出現:
執行結果的檔案“我不是藥神page10.txt”是隻有一小部分
★★★★完美解決辦法:
修改控制檯編碼:
命令列輸入 chcp
輸出顯示:活動內碼表: 936
表示當前的編碼是預設的gbk
修改編碼:
命令列輸入 chcp 65001
表示轉換成utf8
字型選擇Lucida Console
然後可以成功print爬取的中文文章
★★★★★★★★常見編碼:
utf8 所有語言
gbk 簡體中文
gb2312 簡體中文
gb18030 簡體中文
big5 繁體中文
big5hkscs 繁體中文
3、進行詞雲展示
程式碼:
import matplotlib.pyplot as plt
from wordcloud import WordCloud
from scipy.misc import imread
import jieba
text = open("我不是藥神page20.txt","rb").read()
結巴分詞
wordlist = jieba.cut(text,cut_all=True)
wl = " ".join(wordlist)
print(wl)#輸出分詞之後的txt
把分詞後的txt寫入文字檔案
fenciTxt = open("fenciHou.txt","w+")
fenciTxt.writelines(wl)
fenciTxt.close()
設定詞雲
wc = WordCloud(background_color = "white", #設定背景顏色
mask = imread('hai.jpg'), #找張圖片設定背景圖片
max_words = 2000, #設定最大顯示的字數
stopwords = ["的", "這種", "這樣", "還是", "就是", "這個"], #設定停用詞
font_path = "C:\Windows\Fonts\simkai.ttf", # 設定為楷體 常規
#設定中文字型,使得詞雲可以顯示(詞雲預設字型是“DroidSansMono.ttf字型庫”,不支援中文)
max_font_size = 60, #設定字型最大值
random_state = 30, #設定有多少種隨機生成狀態,即有多少種配色方案
)
myword = wc.generate(wl)#生成詞雲
wc.to_file('result.jpg')
展示詞雲圖
plt.imshow(myword)
plt.axis("off")
plt.show()
結果: