躁動不安的年代,你須要讀幾本好書(python爬蟲及數據分析)

當今社會,速度已經深刻人心了,「快」成了你們默認的辦事境界,看機器上一件件飛通常傳遞着的產品,聽辦公室一族打電話時那種無人能及的語速......休閒的概念已日漸模糊,你們彷佛都變成了在「快咒」控制下的小人兒,彷佛連騰出點時間來鬆口氣的時間都沒有了,看得見的、看不見的規則約束着咱們;有形的、無形的的鞭子驅趕着咱們,咱們快馬加鞭追求事業、愛情、地位、財富,彷佛本身慢一拍,就會被這個世界拋棄html

工做僅僅是生活的一部分,千萬不要忽略了其餘樂趣,人生本是一幅美麗的風景畫,沒必要對全部的事情都抱有強烈的目的性,人的一輩子總有作不完的事情,只要咱們有一個平和之心,就不會錯過沿途風景。python

一個陽光明媚的早晨,手拿一杯咖啡,翻開一本喜歡的書,也不失爲一種人生樂趣,做爲IT一族,咱們不能只是侷限於IT類的數據,要廣大本身的視野,提高本身的內在,今天這篇文章咱們會給你推薦幾本不錯的文學書籍,你們一塊兒來看下。json

做爲一名程序猿,咱們不用爲該讀什麼書發愁,由於咱們有python,一個號稱除了生孩子,什麼均可以作的語言。下面進入正題。瀏覽器

本文大概涉及兩個方法:bash

1.書籍信息爬取cookie

​ 1.1 requests 抓取網頁session

​ 1.2 BeautifulSoup ,re正則分析網頁結構app

2.信息分析echarts

​ 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瀏覽器)

1557396314353.png

通過上面的幾行代碼,我能就能夠抓取頁面的內容了

2.分析網頁,抓取數據

此次咱們要抓取的信息包括:

書名,連接,做者,出版社,出版日期,價格,評分,評論數,評論內容
複製代碼

咱們下面看看怎麼獲取信息

1557453991021.png

咱們能夠選擇咱們想要抓取的信息,下面顯示在 div class='article' 這個標籤下,到這裏先別急寫代碼,咱們能夠繼續往下看幾層,是否是能夠搜小咱們選擇的範圍

1557454378956.png

1557454471938.png

咱們向下看了幾層,發現其實咱們想要的數據都在 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" 標籤

1557454966673.png

下面全部要的信息,以及標籤我在圖上作了標識

下面看代碼

#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.根據評論數量和評分,分析你們對那些書敢興趣,評分比較高

1557456705121.png

1557457009197.png

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.各年份出版的書籍數量

![1557455832083.png](https://upload-images.jianshu.io/upload_images/17607823-d32f18320c4b1a47.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

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.各大出版的發行書籍數據佔比

1557455832083.png

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 , 回覆 "看書", 便可獲取。

1557457721086.png
相關文章
相關標籤/搜索