爬取《哪吒》豆瓣短評,我獲得了什麼?
本文原創釋出在公眾號:「GitPython 」
關注公眾號「GitPython」,後臺回覆「
哪吒短評
」,獲取完整原始碼。
爬取《哪吒》豆瓣短評,我獲得了什麼?
這段時間,《哪吒》爆火。
於是,就想看看,關於《哪吒》的評價。
為什麼選擇豆瓣?
質量和口碑還不錯吧。
可是,折騰一波之後,發現了這個。
豆瓣從2017。10月開始全面禁止爬取資料,僅僅開放500條資料,白天1分鐘最多可以爬取40次,晚上一分鐘可爬取60次數,超過此次數則會封禁IP地址。
豆瓣網站
登入狀態下,按網頁按鈕點選“後頁”,引數“start”最多為480,也就是20*25=500條;非登入狀態下,最多為200條。
行吧,500條就500條吧,Let‘s go。
整個過程分為
獲取豆瓣短評資料
詞雲視覺化
1 獲取短評資料
1)爬蟲原理簡單分析
爬蟲原理簡單分析
2)需求分析
好了,爬蟲的基本思路我們已經瞭解了。
現在,開始幹活了。
首先,我們開啟短評的url地址:
https://
movie。douban。com/subjec
t/26794435/comments?status=P
我們想要獲取以下內容:
-使用者名稱稱
-評分
-短評內容
獲取的內容
3)URL解析
要想獲取資料,我們先來分析一下URL。
URL解析
4)傳送請求,獲取響應
根據url,我們可以傳送請求了,
注意攜帶cookie
。
cookie
先來爬一頁,看看結果。
import
requests
headers
=
{
’User-Agent‘
:
’Mozilla/5。0 (Windows NT 10。0; Win64; x64) AppleWebKit/537。36 (KHTML, like Gecko) Chrome/76。0“。3809。100 Safari/537。36‘
,
’Cookie‘
:
’你的cookie‘
}
for
i
in
range
(
0
,
1
):
url
=
’https://movie。douban。com/subject/26794435/comments?start={}&limit=20&sort=new_s‘
\
’core&status=P‘
。
format
(
i
*
10
)
reponse
=
requests
。
get
(
url
,
headers
=
headers
)
(
reponse
。
content
。
decode
())
5)定位資訊
從圖中,我們可以看到對應的標籤和屬性。
利用
xpath
,我們可以很輕鬆地定位到我們想要的資訊。
推薦《6節課學會python爬蟲》,裡邊講解得很好。
先定位到,每一頁的“20個短評”對應的xml位置。
定位大塊
再遍歷,每一個短評內容。
遍歷每一個內容
結合程式碼來看一下。
item_list
=
[]
html
=
etree
。
HTML
(
reponse
。
content
。
decode
())
div_list
=
html
。
xpath
(
’//*[@id=”comments“]//div[@class=”comment“]‘
)
# 定位大塊
for
div
in
div_list
:
# 遍歷每一條資訊
item
=
{}
# 。/ 注意從當前節點,向下獲取
# 使用者姓名/使用者主頁的url/短評內容/評分
item
[
’user_name‘
]
=
div
。
xpath
(
’。//span[@class=”comment-info“]/a/text()‘
)[
0
]
item
[
’user_url‘
]
=
div
。
xpath
(
’。//span[@class=”comment-info“]/a/@href‘
)[
0
]
item
[
’content‘
]
=
div
。
xpath
(
’。//span[@class=”short“]/text()‘
)[
0
]
。
replace
(
’
\n
‘
,
’‘
)
item
[
’score‘
]
=
div
。
xpath
(
’。//span[@class=”comment-info“]/span/@title‘
)[
0
]
item_list
。
append
(
item
)
(
item
)
5)儲存結果
上邊,已經把每一條資料,整理成一個字典。然後,把字典放在一個大的列表裡。
結果展示
這樣,我們可以很輕鬆的把資料匯出為csv檔案。
csv檔案
2 詞雲視覺化
1)jieba分詞
參考部落格:
https://
blog。csdn。net/dnxbjyj/a
rticle/details/72854460
結巴分詞 是針對字串進行處理的,分詞後 會返回一個列表或者迭代器,你需要用 字串的join方法,把詞語列表 重新拼接成一個字串,然後把內容給到 wordcloud 生成詞雲。
import
pandas
as
pd
import
jieba
# 讀取資料
df
=
pd
。
read_csv
(
’哪吒短評資料。csv‘
,
encoding
=
’utf-8-sig‘
)
text
=
’‘
# 獲得wordcloud 需要的 文字格式
for
line
in
df
[
’content‘
]:
text
+=
’ ‘
。
join
(
jieba
。
cut
(
str
(
line
),
cut_all
=
False
))
# 結巴分詞
2)詞雲展示
建立一個詞雲物件,新增一些基本設定。比如,中文字型,背景圖片,停用詞等等。然後,根據上文中的 text,生成詞雲。
我們可以看一下,文字中最高頻的50個詞。並把詞雲儲存為本地圖片。
from
wordcloud
import
WordCloud
import
matplotlib。pyplot
as
plt
# 停用詞
words
=
pd
。
read_csv
(
’stopwords_zh。txt‘
,
error_bad_lines
=
False
,
encoding
=
’gbk‘
,
engine
=
’python‘
,
names
=
[
’stopword‘
])
stopwords
=
set
(
’‘
)
stopwords
。
update
(
words
[
’stopword‘
])
backgroud_Image
=
plt
。
imread
(
’豆瓣。jpg‘
)
# 背景圖
# 詞雲的一些引數設定
wc
=
WordCloud
(
background_color
=
’white‘
,
mask
=
backgroud_Image
,
font_path
=
’SourceHanSerifCN-Medium。otf‘
,
max_words
=
200
,
max_font_size
=
200
,
min_font_size
=
8
,
random_state
=
50
,
stopwords
=
stopwords
)
# print(text)
# 生成詞雲
word_cloud
=
wc
。
generate_from_text
(
text
)
# 看看詞頻高的有哪些
process_word
=
WordCloud
。
process_text
(
wc
,
text
)
sort
=
sorted
(
process_word
。
items
(),
key
=
lambda
e
:
e
[
1
],
reverse
=
True
)
(
sort
[:
50
])
plt
。
imshow
(
word_cloud
)
plt
。
axis
(
’off‘
)
wc
。
to_file
(
’結果。jpg‘
)
(
’生成詞雲成功!‘
)
詞雲
你看懂了嗎?
覺得文章還不錯的話,分享給更多人吧!