這篇文章主要是用來記錄自己用python編寫爬蟲以及數(shù)據(jù)分析代碼,簡單比較《你的名字。》和《超時空同居》兩部電影的豆瓣評論脸爱。兩部電影都是包含穿越元素的愛情片,初次在影院觀看都帶給筆者蠻多驚喜未妹,不過顯然前者在畫面簿废、音樂空入、故事等方面還是要勝過國產(chǎn)片,也成了筆者深夜寫代碼時又一部背景片族檬。做這個小項目歪赢,也是想練習一下python與數(shù)據(jù)分析相關(guān)的幾個庫,增加一些實戰(zhàn)經(jīng)驗单料。不足之處埋凯,日后繼續(xù)改進。
完整代碼:
電影短評爬蟲完整代碼
一扫尖、主要用到的python庫
import requests
from lxml import etree
import re
from pymongo import MongoClient
import time
二白对、網(wǎng)頁爬蟲流程
- 進入起始頁,解析頁面元素
- 保存每頁評論(共20條)內(nèi)容至mongoDB
- 判斷是否存在“下一頁”的鏈接换怖,若有甩恼,則翻頁進入下一頁,繼續(xù)解析
- 若沒有下一頁沉颂,爬蟲停止条摸。
目前豆瓣對用戶可瀏覽的評論數(shù)進行了限制,只允許瀏覽500條铸屉。因此钉蒲,爬取的數(shù)據(jù)最多只有500條記錄
三、簡要分析豆瓣電影短評頁面
豆瓣電影短評目前分為熱門抬探、最新、好友三類帆赢⌒⊙梗“熱門”類是列出被標記“有用”次數(shù)最多的評論。選擇這個分類也能更好代表用戶對一部電影的評價椰于。
每一條評論包含了用戶名稱怠益、打星情況、評論日期瘾婿、評論內(nèi)容以及被標記有用次數(shù)幾個信息蜻牢,相應爬蟲代碼為:
def get_comments(self, cur_url):
'''
從當前html頁面解析出20條評論的信息,并存入mongo數(shù)據(jù)庫。獲取每條評論的id,日期偏陪,評論內(nèi)容抢呆,有用數(shù)量
:param cur_url:待爬取頁面url
:return:當前頁面的20條評論數(shù)據(jù)信息
'''
print('解析頁面:%s' % cur_url)
html = self.get_html(cur_url)
commList = html.xpath('//div[@class="comment-item"]')
data = []
for item in commList:
user_id = item.attrib['data-cid']
vote = item.xpath('.//span[@class="votes"]')[0].text.strip()
user_name = item.xpath('.//span[@class="comment-info"]/a')[0].text.strip()
status = item.xpath('.//span[@class="comment-info"]//span[1]/text()')[0].strip()
if len(item.xpath('.//span[@class="comment-info"]//span')) == 3:
rating = item.xpath('.//span[@class="comment-info"]//span[2]/@title')[0].strip()
pub_time = item.xpath('.//span[@class="comment-info"]//span[3]/text()')[0].strip()
else:
rating = ''
pub_time = item.xpath('.//span[@class="comment-info"]//span[2]/text()')[0].strip()
comment_lines = item.xpath('.//p/text()')[0].strip()
comment_info = {
'user_id': user_id,
'vote': vote,
'user_name': user_name,
'status': status,
'rating': rating,
'pub_time': pub_time,
'comment_lines': comment_lines
}
data.append(comment_info)
return data
這里用到xpath語法定位爬取的元素.筆者覺得相比于BeautifulSoup庫需要分析上下節(jié)點之間的關(guān)系,用lxml庫解析網(wǎng)頁然后使用xpath技術(shù)會更加方便笛谦。
四抱虐、利用pymongo庫將數(shù)據(jù)存入mongoDB中
def saveData(self, data):
'''
:param data:
:param db:
:return:
'''
client = MongoClient()
mongo_DB = self.db
db = client[mongo_DB]
col = db[self.collection]
try:
if col.insert_many(data):
print('保存成功!')
except Exception:
print('保存失敗饥脑。')
return None
接下來用pandas庫和matplotlib庫進行數(shù)據(jù)分析及展示