當今社會,速度已經深入人心了,“快”成了大家預設的辦事境界,看機器上一件件飛一般傳遞著的產品,聽辦公室一族打電話時那種無人能及的語速......休閒的概念已日漸模糊,大家似乎都變成了在“快咒”控制下的小人兒,似乎連騰出點時間來鬆口氣的時間都沒有了,看得見的、看不見的規則約束著我們;有形的、無形的的鞭子驅趕著我們,我們馬不停蹄追求事業、愛情、地位、財富,似乎自己慢一拍,就會被這個世界拋棄
工作僅僅是生活的一部分,千萬不要忽略了其他樂趣,人生本是一幅美麗的風景畫,不必對所有的事情都抱有強烈的目的性,人的一生總有做不完的事情,只要我們有一個平和之心,就不會錯過沿途風景。
一個陽光明媚的早晨,手拿一杯咖啡,翻開一本喜歡的書,也不失為一種人生樂趣,作為IT一族,我們不能只是侷限於IT類的資料,要廣大自己的視野,提升自己的內在,今天這篇文章我們會給你推薦幾本不錯的文學書籍,大家一起來看下。
作為一名程式猿,我們不用為該讀什麼書發愁,因為我們有python,一個號稱除了生孩子,什麼都可以做的語言。下面進入正題。
本文大概涉及兩個方法:
1.書籍資訊爬取
1.1 requests 抓取網頁
1.2 BeautifulSoup ,re正則分析網頁結構
2.資訊分析
2.1 pandas 處理檔案
2.2 pyecharts 視覺化分析
1.網頁抓取
目標URL : book.douban.com/tag/文學?star… 注意start=0,網頁的offset是20,後面程式碼裡有體現
我們還是用requests 庫來抓取網頁資訊,下面說下requests 庫大致用法
1.常用方法
requests.get()
requests.post()
requests.put()
requests.delete()
2.引數
method 提交方式(一般就是get ,post)
url 提交地址
params GET請求中在URL中傳遞的引數,如http://xxxx?parameter=xxx 這種方式
data: 在請求體裡傳遞的資料
json 在請求體裡傳遞的資料
headers 請求頭(一般可以放入Cookie,Referer,User-Agent)
cookies Cookies
files 上傳檔案
auth headers中加入加密的使用者名稱和密碼,是另一種身份驗證方法,賬號密碼在請求時候傳過去直接驗證, 這種方式用的比較少
timeout 請求和響應的超時時間
allow_redirects 是否允許重定向
proxies 代理
verify 是否忽略證照
cert 證照檔案
stream 一部分一部分的獲取資料,不用一次性獲取資料,放入記憶體
session: 用於儲存客戶端歷史訪問資訊
複製程式碼
下面正式開始抓取網頁資訊
#偽裝瀏覽器請求,User-Agent和Cookie 可以用你自己的,怎麼取看下面的圖
headers = {
'User-Agent': '*******',
'Cookie': '*******'
}
res = requests.get(url,headers=headers,timeout =20) # 獲取網頁資訊,timeout要設定,不然可能因為超時導致抓取資訊失敗
# print(res.status_code,res.apparent_encoding,res.content,res.encoding) #response響應的一些資訊
res.encoding = res.apparent_encoding #設定請求頭的編碼
response = res.text #獲取網頁的內容
複製程式碼
右擊網頁----->檢查------->network------->按F5重新整理網頁 就會出現下面的介面(我用的Chrome瀏覽器)
經過上面的幾行程式碼,我能就可以抓取頁面的內容了
2.分析網頁,抓取資料
這次我們要抓取的資訊包括:
書名,連結,作者,出版社,出版日期,價格,評分,評論數,評論內容
複製程式碼
我們下面看看怎麼獲取資訊
我們可以選擇我們想要抓取的資訊,下面顯示在 div class='article' 這個標籤下,到這裡先別急寫程式碼,我們可以繼續往下看幾層,是不是可以搜小我們選擇的範圍
我們向下看了幾層,發現其實我們想要的資料都在 li class = "subject-item" 這樣的標籤下,下面我們就可以用BeautifulSoup來分析了
#用lxml方法來解析網頁,預設是html.parse
soup = BeautifulSoup(response,'lxml')
#找到所有<li class = "subject-item">這樣的標籤,注意find_all方法返回的是list型別,下面使用的時候要用for迴圈,find是隻找到第一個符合條件的標籤,返回的是bs4.element型別,可以直接呼叫方法
artiche = soup.find_all('li','subject-item')
複製程式碼
下面分別看下我們想要的資料的具體位置,選擇第一個 li class = "subject-item" 標籤
下面所有要的資訊,以及標籤我在圖上做了標識
下面看程式碼
#artiche是列表型別,迴圈操作每個元素
for item in artiche:
for i in item.find_all('div','info'): #書名和連結資訊
try:
if i.find('a').string: #防止存在沒有書名的情況,string是獲取a標籤的內容
book_name = i.find('a').string.strip() 找到第一個a標籤
else:
book_name='NULL'
if i.find('a').attrs: #獲取a標籤的的屬性
book_url = i.find('a').attrs.get('href').strip() #屬性時字典方式,用get取資料
else:
book_url =url
pub_info = i.find('div','pub').string.strip() #出版社資訊
book_info_list = pub_info.split('/')
#下面都是根據實際情況判斷寫的內容
if len(book_info_list)==5:
book_auth = book_info_list[0]+','+book_info_list[1]
book_publish = book_info_list[2]
book_pub_date = book_info_list[3]
book_price = re.findall('\d+',book_info_list[4])[0]
elif len(book_info_list)==4:
book_auth = book_info_list[0]
book_publish = book_info_list[1]
book_pub_date = book_info_list[2]
book_price = re.findall('\d+',book_info_list[3])[0]
else:
book_auth = 'NULL'
book_publish = book_info_list[0]
book_pub_date = book_info_list[1]
book_price = re.findall('\d+', book_info_list[2])[0]
#評分
rating_nums = i.find('span','rating_nums').string
#評論數資訊
comment_nums = i.find('span','pl').string.strip()
comment_nums = re.findall('\d+',comment_nums)
comment_nums = comment_nums[0]
#評論內容
if i.find('p'):
comment_content = i.find('p').string.strip().replace('\n','')
else:
comment_content= 'NULL'
print(book_name,
book_url,book_auth,book_publish,
book_pub_date,book_price,rating_nums,
comment_nums,comment_content)
複製程式碼
抓取完資訊我們要用pandas的to_csv方法把資料存入csv檔案裡方便後續分析
data_dict = {}
data_dict['書名'] = book_name
data_dict['連結'] = book_url
data_dict['作者'] = book_auth
data_dict['出版社'] = book_publish
data_dict['出版日期'] = book_pub_date
data_dict['價格'] = book_price
data_dict['評分'] = rating_nums
data_dict['評論數'] = comment_nums
data_dict['評論內容'] = comment_content
data_list.append(data_dict)
df = pandas.DataFrame(data_list_all)
df.to_csv('book.csv', encoding='utf_8_sig') # encoding解決亂碼問題
複製程式碼
這樣我們的資料抓取就算大功告成了。
3.資料分析
資料分析這段我們使用pyecharts工具,我們大概分析幾個方面,自我感覺分析的不是太到位,哈哈,大家主要還是用來學習下怎麼使用pyecharts和pandas。
首先我們用pandas分析上面的csv檔案,處理下等到我們想要的格式
from pyecharts import Bar,Pie
import pandas as pd
df = pd.read_csv('book.csv')
# print(df.loc[1:10,['書名','評論數']])
dfn = df.dropna(axis=0,subset=['書名']) #刪除書名為空的記錄
dfn_comment = dfn.sort_values('評論數',ascending=False).head(20) #根據評論數排序,取前20本書資訊
dfn_score = dfn[dfn['評論數']>200000].sort_values('評分',ascending=False).head(20) #根據評分排序,取前20本書資訊
# print(dfn['書名'],dfn['評論數'])
# print(dfn.loc[:,['書名','評論數']])
dfn_book_name = dfn_comment['書名'].values.tolist() #把dataframe型別轉成list型別
dfn_comment_nums = dfn_comment['評論數'].values.tolist()
dfn_book_name_score = dfn_score['書名'].values.tolist()
dfn_comment_score = dfn_score['評分'].values.tolist()
# print(dfn_book_name,dfn_comment_nums,dfn_comment_score)
# print(type(df),type(dfn))
# print(dfn.dtypes['出版日期']) #列印列型別
#日期型別轉換
# dfn['出版日期'] = pd.to_datetime(dfn['出版日期'],errors='coerce') #轉換成日期型別
# dfn['出版日期'] = dfn['出版日期'].dt.year #取年份
dfn_pub_date = dfn
dfn_pub_date['出版日期'] = pd.to_datetime(dfn['出版日期'],errors='coerce') #轉換成日期型別
dfn_pub_date['出版日期']= dfn['出版日期'].dt.year #取年份
# print(dfn_pub_date)
#根據出版日期年份分組,取出每年出版書籍數量
dfn_n = dfn_pub_date.groupby(['出版日期'],as_index=False)['書名'].size().reset_index(name='count')
#過濾出版數量在10以下的年份
dfn_n = dfn_n[dfn_n['count']>10]
dfn_n_year = dfn_n['出版日期'].values.tolist()
dfn_n_count = dfn_n['count'].values.tolist()
#最多產的出版社
dfn_n_pub = dfn.groupby(['出版社'],as_index=False)['書名'].size().reset_index(name='count')
dfn_n_pub = dfn_n_pub.sort_values('count',ascending=False).head(10)
dfn_n_pub_name = dfn_n_pub['出版社'].values.tolist()
dfn_n_pub_count = dfn_n_pub['count'].values.tolist()
複製程式碼
1.根據評論數量和評分,分析大家對那些書敢興趣,評分比較高
bar = Bar("豆瓣文學類圖書", "評價數量")
bar.add("評論數排名", dfn_book_name, dfn_comment_nums, is_more_utils=True)
# bar.print_echarts_options() # 該行只為了列印配置項,方便除錯時使用
bar.render('豆瓣文學評論數分析.html') # 生成本地 HTML 檔案
#
bar = Bar("豆瓣文學類圖書", "評價數量")
bar.add("評分排名", dfn_book_name_score, dfn_comment_score, is_more_utils=True)
# bar.print_echarts_options() # 該行只為了列印配置項,方便除錯時使用
bar.render('豆瓣文學書籍評分分析.html') # 生成本地 HTML 檔案
複製程式碼
從上面看的出來,<<風箏的人>>,<<活著>>,<<解憂雜貨店>>,<<小王子>>,<<白夜行>>等書,還是值得我們一看的,大家也可以上豆瓣讀書上看下,網站自己有個綜合排名,感覺和我分析的差不多,有興趣可以自己看下。
2.各年份出版的書籍數量
pie = Pie("各年份出版書籍數量分佈餅圖", title_pos='center')
pie.add("", dfn_n_year, dfn_n_count, radius=[40, 75],
label_text_color=None,
is_label_show=True,
legend_orient="vertical",
legend_pos="left")
# pie.show_config()
pie.render('年份出版書籍數量分佈餅圖.html')
複製程式碼
我們看隨著時間的推進,人們對書籍的需求也越來越大,從1999-2019,書籍的出版數量呈上升趨勢。
3.各大出版的發行書籍資料佔比
pie = Pie("各出版社出版書籍數量分佈餅圖", title_pos='center')
pie.add("", dfn_n_pub_name, dfn_n_pub_count, radius=[40, 75],
label_text_color=None,
is_label_show=True,
legend_orient="vertical",
legend_pos="left")
# pie.show_config()
pie.render('各出版社出版書籍數量分佈餅圖.html')
複製程式碼
出版社的分析,大家自己看下就行。
最後還是那句話,工作再忙,也要享受片刻的讀書時光,減少焦慮。
大家如果有興趣可以拿的程式碼自己執行抓取資料,自己做點自己想要知道的分析。
原始碼請關注公眾號:pythonislover , 回覆 "看書", 即可獲取。