from urllib importrequest
from bs4 import
beautifulsoup as bs
import
reimport
codecs
import jieba #
分詞包import numpy #
numpy計算包
import pandas as pd #
分詞用到
import matplotlib.pyplot as plt #
繪圖包import
matplotlib
matplotlib.rcparams[
'figure.figsize
'] = (10.0,5.0)
from wordcloud import wordcloud #
詞云包#
爬取豆瓣最受關注圖書榜
defgettopchartbook_list():
resp = request.urlopen('
')html_data = resp.read().decode('
utf-8')
#轉化為beautifulsoup物件
soup = bs(html_data,'
html.parser')
#搜尋最受關注的圖書列表
topchart_book =soup.find_all('
ul',class_='
chart-dashed-list')
#搜尋列表中所有圖書
topchart_book_list = topchart_book[0].find_all('
li',class_='
media clearfix')
#新建陣列用於存放後續的資料
topchart_list =
#遍歷圖書館列表,從中過濾出我們所需的資訊
for item in
topchart_book_list:
#新建字典用於存放我們的圖書資訊,之後可用class來儲存
topchart_dict ={}
#搜尋到具體資訊的位置
book_item = item.find('
a',class_='
fleft')
#得到圖書id
topchart_dict['
id'] = book_item['
href
'].split('
/')[4]
#得到圖書名稱
topchart_dict['
name
'] = book_item.gettext().replace('
\t','').replace('
\n','').replace('
','') #
圖書名字
#將圖書資訊加入到陣列中
return
topchart_list
#def
getcommentbyid(bookid,pagenum):
# eachcommentlist =
if pagenum<0:
return
false
requrl = '
'+ bookid +'
/comments/hot
'+'?
'+'p=
'+str(pagenum)
(requrl)
# resp =request.urlopen(requrl)
html_data = resp.read().decode('
utf-8')
soup = bs(html_data,'
html.parser')
# comment_div_lits = soup.find_all('
div',class_='
comment')
for item in
comment_div_lits:
if item.find_all('
p')[0].string is
notnone:'p
')[0].string)
return
eachcommentlist
defmain():
# commentlist =
topchartbook_list =gettopchartbook_list()
for i in range(10):
num = i + 1commentlist_temp = getcommentbyid(topchartbook_list[0]['id'
],num)
#為了方便進行資料進行清洗,我們將列表中的資料放在乙個字串陣列中
commits = ''
for k in
range(len(commentlist)):
commits = commits +(str(commentlist[k])).strip()
#print(commits)
#exit()##
這些符號對我們進行詞頻統計根本就沒有用,因此將他們清除,所用的方法是正規表示式
pattern = re.compile(r'
[\u4e00-\u9fa5]+')
filterdata =re.findall(pattern,commits)
cleaned_comments = ''
.join(filterdata)
##print(eachcommentlist)##
print(commits)##
print(cleaned_comments)
#exit()
#在這裡使用的是結巴分詞,如果沒有安裝結巴分詞,可以在控制台用 pip install jieba安裝
segment =jieba.lcut(cleaned_comments)
#print(segment)
#exit()
#可以使用pandas庫將分詞轉化成dataframe格式,head()方法只檢視前五項內容
words_df = pd.dataframe()
#print(words_df)
#print(words_df.head())
#exit()
#可以看到我們的資料中有「我」、「很」等虛詞(停用詞)
#而這些詞在任何場景中都是高頻時,並且沒有實際含義,所以我們要對他們進行清除
#把停用詞放在乙個stopwords.txt檔案中,將我們的資料與停用詞進行對比即可
stopwords=pd.read_csv("
stopwords.txt
",index_col=false,quoting=3,sep="
\t",names=['
stopword
'],encoding='
gbk'
)
#print(stopwords)
#exit()
words_df=words_df[~words_df.word.isin(stopwords.stopword)]
#print(words_df.head())
#exit()
#接下來進行詞頻統計
words_stat=words_df.groupby(by=['
word
'])['
word
'].agg(['
count'])
#print(words_stat.head())
#對統計結果進行排序
words_stat=words_stat.reset_index().sort_values(by=["
count
"],ascending=false)
#print(words_stat.head())
#詞云展示
wordcloud = wordcloud(font_path="
simhei.ttf
",background_color="
white
",max_font_size=80) #
指定字型型別、字型大小、背景顏色
word_frequence =
#print(word_frequence)
wordcloud =wordcloud.fit_words(word_frequence)
#print(wordcloud)
#exit()
#matplotlib包對進行繪製,繪製成功後,返回乙個axesimage物件,要在視窗上顯示這個物件,我們可以用show()函式進行
#在某些練習環境下可以省略show()函式,也能自動顯示出來
plt.imshow(wordcloud)
plt.axis(
"off")
plt.show()
wordcloud.to_file(
'tutorial/python/images/books/
'+str(topchartbook_list[0]['
id'])+'
.png')
#主函式
main()
爬蟲 and 詞云 結合例子
import jieba.analyse from wordcloud import wordcloud,imagecolorgenerator,stopwords from imageio import imread import matplotlib.pyplot as plt from url...
網路爬蟲之豆瓣電影
python作為最易上手的程式語言之一,在很多領域的應用已經相對成熟,尤其是一些工具應用類的場景,比如本文要介紹的網路爬蟲。網路爬蟲目前比較成熟的方法有三種,在python中都有現有打包好的包 庫,直接呼叫,非常方便。本篇部落格只關注網路爬蟲的應用層面,重點放在如何解決實際問題,所以對三種方法的理論...
python爬蟲 豆瓣
在爬蟲時候,通過requests.get 得到不正確的狀態碼 4 表示出錯 異常狀態碼檢視 fr aladdin 4 19 用requests庫的get 函式抓取乙個你平時經常使用的 主頁,並檢視該 的爬蟲協議 如果有的話 預設答案是正確,你成功了嗎?fp.write r.content b.有些 ...