《嚮往的生活》四季|豆瓣短評|python爬蟲|自己的分析

1 接口請求

1.1 確定接口地址

因爲只有四個接口需要訪問,且無規律,直接找到寫入templateurl數組中

#獲取url  
    templateurl = ['https://movie.douban.com/subject/26873657/comments?start={}&limit=20&sort=new_score&status=P',
                    'https://movie.douban.com/subject/27602222/comments?start={}&limit=20&sort=new_score&status=P',
                    'https://movie.douban.com/subject/30441625/comments?start={}&limit=20&sort=new_score&status=P',
                    'https://movie.douban.com/subject/34861173/comments?start={}&limit=20&sort=new_score&status=P'
    ]

1.2 封裝接口請求

定義一個接口請求函數,根據獲取到的地址進行請求,並返回獲取的結果。

    #下載源代碼
    def download_page(url):
        #頭        
        header={
            'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:54.0) Gecko/20100101 Firefox/54.0',
            'Cookie':'your cookie'
        }
        #生成下載源代碼
        html = requests.get(url,headers=header).content
        #返回下載源代碼
        return html

不設置Cookie的話,只能訪問前10頁。

1.3 循環調用接口

看評論時可發現,每翻一頁可看到規律,如下圖:
start=的值以0開始,每次增加20。
在這裏插入圖片描述
以此爲規律,設置接口地址爲:‘https://movie.douban.com/subject/34861173/comments?start={}&limit=20&sort=new_score&status=P’;
str.format函數,將 {} 替換成想要的值

for j in range(len(templateurl)):#循環調用四個接口
	#每頁20條,共爬25頁,共計500條
	for k in range(25):
		 targeturl = templateurl[j].format(k * 20)
		 res = dd.download_page(targeturl)
		 #設置爬蟲工作間隔時間
         time.sleep(float(random.randint(4, 9)) / 20 + float(random.randint(1, 20)) / 20+2)

測試發現豆瓣每次只有500條數據可以看到,所以用range()函數空值範圍;
後續發現第四季剛出,不到500條,用一個判斷來退出循環:判斷解析的結果集沒有數據時,即長度爲0時,break

flag=len(username_nodes) + len(comment_nodes) + len(vote_nodes)
            #當獲取不到數據時自動退出
            if flag==0 :
                break 
            else:
                #處理數據

僅用一個字段判斷不行,比如我一開始用的用戶名,後來發現數據只能獲取部分;後來將三個字段的長度相加進行判斷後可以。

2.處理數據

2.1 解析網頁返回結果

用lxml解析器解析頁面,並用BeautifulSoup的select選擇器篩出數據。
在這裏插入圖片描述

  #獲取豆瓣短評頁面  
   #lxml解析器有解析HTML和XML的功能,而且速度快,容錯能力強,所以推薦使用它。      
   soup = BeautifulSoup(res,"lxml")
   #獲取豆瓣短評
   comment_nodes = soup.select('.comment > p')
   #用戶名
   username_nodes = soup.select('.comment > h3 > span.comment-info > a')
   #贊同數
   vote_nodes = soup.select('.comment > h3 > span.comment-vote > span')      

2.2 保存數據

可以保存至 txt文件、csv表格和mysql數據庫;
都試了一下。

2.2.1 保存至 txt文件

首先將獲取的數據預處理拼接

comments_list = []  
usernames_list=[]
votes_list=[]
all_list=[]
for i in range(len(comment_nodes)):           
            str = '用戶名: '+username_nodes[i].get_text() +"||評論:"+comment_nodes[i].get_text().strip().replace("\n", "") +'||vote數量: '+vote_nodes[i].get_text()+ u'\n'
            all_list.append(str)

然後file.writelines寫入txt文件

with codecs.open('嚮往'+str(j+1)+'短評.txt', 'a', encoding='utf-8') as f:
         #調用dd的download_page函數獲取評論內容
         ps.get_douban_comments(res) 
         #寫入文件
         f.writelines(ps.get_douban_comments(res))

2.2.2 保存至 csv文件

與上面略不同的是保存方式,首先需要設置下列名;

df = pd.DataFrame(columns=['用戶名','評論', 'vote'])

然後在最內層的循環中修改寫入文件方式爲to_csv,需要注意編碼

#這裏是保存文件
df.loc[i+ k*20]=[username_nodes[i].get_text(),comment_nodes[i].get_text(),vote_nodes[i].get_text()]  
# 設置編碼爲utf-8無效,依舊爲亂碼;改爲utf-8-sig後ok
df.to_csv('嚮往'+str(j+1)+'短評.csv', index=False,encoding='utf-8-sig')  

2.2.3 保存至MySQL數據庫

首先設置數據庫連接

connection = pymysql.connect(host=host,
                                 port=3306,
                                 user=user,
                                 password=pwd,
                                 db=db_name,
                                 charset='utf8mb4')

在數據庫中建好相應的表,

CREATE TABLE `xwspider1` (
`name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`comments` longtext,
`vote` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

四個表 表結構一致,直接用create table tablename as select * from xwspider1 where 1=2複製表結構即可。

獲取到接口返回的數據經過selector選擇器後,還需要進一步處理。

  • 獲取到的是數組,需要循環遍歷
  • 需要數組中的get_text()內容
  • 因爲數據庫不能保存emoji表情符,需要刪除數據中的emoji
  • 評論中的 符號會與插入數據時 sql語句中的 衝突,也需要去掉

再調用連接的cursor,執行SQL語句

#這裏存入數據庫
sql = "INSERT into xwspider"+str(j+1)+" ( name,comments,vote) VALUES ( '%s', '%s', '%s')" % (
   emoji.demojize(#去掉emoji表情符號
       str(username_nodes[i].get_text()).replace("'", "")#去掉'符號
   ), 
   emoji.demojize(str(comment_nodes[i].get_text())), 
   (vote_nodes[i].get_text())
)
cursor.execute(sql)

數據庫結果一覽:
在這裏插入圖片描述

代碼鏈接:

https://github.com/wangjie182/xwspider

  • 下載代碼後,首先確保引入的模塊都已經下載
  • 然後修改請求文件downloader的Cookie值
  • 本地配置好數據庫後,修改db文件的數據庫配置與本地配置一致

數據分析

其實爬蟲不是本意,只是想看看大華在《往生》四季中別人對其評論的變化。

數據截取時間爲 2020/05/09,16:00點。

首先看第一季:

關鍵字篩選:大華 Henry henry 劉憲華

500個記錄中篩選出包含關鍵字的評論,共55條,佔比11%;再取vote前5的評論,

獲取到以下keyword:

  • 浪漫 可愛 幽默
  • 傻白甜

vote數是 2260,總vote數是 20283,佔比11.14%
在這裏插入圖片描述

同樣的對第二季、第三季的評論進行篩選:

第二季:
500條記錄篩選出80個匹配項,佔比16%,keyword爲:

  • 啊哦沒有欸
  • 油膩 泰迪 zhizhang

vote數是 3854,總數是 9710,佔比39.69%
在這裏插入圖片描述
第三季:
500條記錄篩選出117個匹配項,佔比23.2%,keyword爲:

  • 想大華 需要Henry 沒有他變尷尬、難看
  • 聒噪

vote數是 4501,總數是 21438,佔比21%

在這裏插入圖片描述
第四季:
240條記錄篩選出20個匹配項,佔比8.3%,keyword爲:

  • 想大華 貼心 搞笑 互動 遺憾
  • 啊哦沒有欸

vote數是 181,總數是 1450,佔比12.48%
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章