在本次推送中,以貓眼電影 APP 中的電影評論作為爬取目標(biāo),完成對網(wǎng)頁數(shù)據(jù)的采集。在采集完成后,我們將每個評論數(shù)據(jù)采集分用戶名、評論時間、用戶性別、用戶等級、用戶所在城地、用戶評分、以及評論內(nèi)容等,并將它們以 .xls 的文件格式進行保存。
1 準(zhǔn)備工作
在爬蟲開始之前,請確保已經(jīng)安裝好了 requests 庫、xlwt 庫以及 json 庫。如果沒有安裝,請使用 cmd 打開命令行界面,輸入以下代碼:
pip install requests
pip install xlwt
pip install json
2 抓取分析
我們發(fā)現(xiàn),在貓眼PC端的網(wǎng)頁中,只存在最熱門的10條評論數(shù)據(jù),這顯示是不夠支撐我們進行后續(xù)的數(shù)據(jù)分析的。
貓眼PC端網(wǎng)頁地址 https://maoyan.com/films/342166
因此,我們選擇登錄手機網(wǎng)頁版本,即
貓眼移動端網(wǎng)頁地址 http://m.maoyan.com/movie/342166/comments?v=yes
按下 F12 或者鼠標(biāo)點擊右鍵檢查按鈕,點擊進入Network一欄。如下圖所示:
隨后我們再次按下 F5 刷新按鈕,有時需要按下 CTRL + F5組合鍵。便能夠?qū)㈨撁嬖俅嗡⑿?。尋找網(wǎng)站評論入口,如下圖所示:
可以看到里面包含了 Request URL(請求地址)、Request Method(請求方式)、Status Code(狀態(tài)碼)等信息。再往下翻比較重要的信息就是 Host、Referer、User-Agent、以及X-Requested-With等信息。
這些信息獲取之后,我們便可以開始今天的爬蟲工作了。
3 爬取信息
首先,我們需要導(dǎo)入一些第三方庫。具體如下:
import requests
import xlwt
import json
其中,requests 庫是用來向服務(wù)器發(fā)送 GET 類型的請求,xlwt 庫是用來操作 .xls 文件的,而我們的數(shù)據(jù)因為是 json 格式的數(shù)據(jù),因此需要對它進行解析,這里便用到了 json 庫。
3.1 設(shè)置請求頭
一般情況下,為了避免觸發(fā)反爬蟲機制,需要完善一下請求頭信息,這里我們把它作為一個獨立的函數(shù)方便后續(xù)調(diào)用,具體如下:
def get_page(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36',
'Cookie':'_lxsdk_cuid=1661ae34b39c8-0c8c15380422c-2711639-144000-1661ae34b39c8; v=3; __utma=17099173.21012536.1539393286.1539393286.1539393286.1; __utmc=17099173; __utmz=17099173.1539393286.1.1.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); __utmb=17099173.2.9.1539393288643; uuid_n_v=v1; iuuid=B7EC5090CE8511E89675C9EEEAD92C526D3F6AA2E9344F5091F4218FA118AAEF; webp=true; ci=55%2C%E5%8D%97%E4%BA%AC; __mta=207950381.1538049396050.1539393287057.1539393443480.10; _lx_utm=utm_source%3Dgoogle%26utm_medium%3Dorganic; _lxsdk=B7EC5090CE8511E89675C9EEEAD92C526D3F6AA2E9344F5091F4218FA118AAEF; _lxsdk_s=1666af306c5-403-5fd-037%7C%7C45',
'Host':'m.maoyan.com',
'Referer':'http://m.maoyan.com/movie/342166/comments?_v_=yes',
'X-Requested-With':'superagent'
}
return requests.get(url,headers = headers)
接下來我們便開始網(wǎng)頁評論的爬取工作。
3.2 評論爬取與保存
在分析爬取的網(wǎng)址時,具體如下:
http://m.maoyan.com/mmdb/comments/movie/342166.json?_v_=yes&offset=0&startTime=0
http://m.maoyan.com/mmdb/comments/movie/342166.json?_v_=yes&offset=15&startTime=2018-10-15%2016%3A56%3A10
http://m.maoyan.com/mmdb/comments/movie/342166.json?_v_=yes&offset=30&startTime=2018-10-15%2016%3A56%3A10
我們發(fā)現(xiàn),網(wǎng)頁請求URL前面部分都是一致的,只有在 offset 的地方才發(fā)生改變,而后面的 startTime 便是你此刻獲取最新評論的最后時間(這里的內(nèi)容不是很重要,我們可以從任意時間獲取評論)。最簡單的做法就是我們直接更改 offset 位置的數(shù)字,從0,15,30,……一直加下去。
但是這個時候問題又出現(xiàn)了,采取這一方式只能獲取當(dāng)天的前1000條評論,怎么辦?后來我又發(fā)現(xiàn)可以對 startTime 的時間進行修改。比如當(dāng)前的日期是2018-10-15,只要電影上映后,任意的時間日期我都可以獲取到數(shù)據(jù)。此時可以再加入一個對日期的循環(huán)。
這里的爬取網(wǎng)頁 URL 的任務(wù)我們便完成了,接下來便是對數(shù)據(jù)的保存工作。我們選擇 .xls 文件進行保存,因為第三方 xlwt 庫只能對文件保存一次,后續(xù)的修改將會覆蓋之間的內(nèi)容。因此我們將文件的保存一并寫入評論獲取的函數(shù)中,方便操作。具體代碼如下:
def get_comment():
comment = [None] * 7
file = 'Project_Gutenberg_comment.xls'
# 創(chuàng)建一個Excel
book = xlwt.Workbook()
# 在其中創(chuàng)建一個名為'無雙'的sheet
sheet1 = book.add_sheet('無雙', cell_overwrite_ok=True)
#設(shè)置需要保存的信息欄
row0 = ['nickName', 'startTime', 'gender', 'userLevel', 'cityName', 'score', 'content']
#將首行信息寫入
for l in range(len(row0)):
sheet1.write(0, l, row0[l])
#對時間進行循環(huán),因為電影上映的時間是9月30號,我們選擇從爬取的評論是從10月1號到10月15號(也就是今天)
for day in range(1,16):
print('正在爬取10月{}日的評論'.format(day))
#每天只能爬取前1000條數(shù)據(jù),每頁15條,因此67次循環(huán)之后,便不再有數(shù)據(jù)可以爬取了
for i in range(67):
print('正在下載第{}頁評論'.format(i + 1))
r = get_page('http://m.maoyan.com/mmdb/comments/movie/1217402.json?_v_=yes&offset=' + str(
i*15) + '&startTime=2018-10-{}%2023%3A59%3A59'.format(day))
#判斷網(wǎng)頁狀態(tài)碼,正常則對數(shù)據(jù)進行爬取,否則直接退出循環(huán)
if r.status_code == 200:
try:
soup = json.loads(r.text)['cmts']
j= 0
#保存數(shù)據(jù)
for cmt in soup:
j += 1
try:
comment[0] = cmt['nickName']
comment[1] = cmt['startTime']
if cmt.get('gender'):
comment[2] = cmt['gender']
else:
comment[2] = None
comment[3] = cmt['userLevel']
comment[4] = cmt['cityName']
comment[5] = cmt['score']
comment[6] = cmt['content']
except:
break
#寫入數(shù)據(jù)
for k in range(len(comment)):
sheet1.write((day-1)*1005+(i*15+j), k, comment[k])
except:
break
else:
break
#保存文件
book.save(file)
3.3 啟動程序
輸入以下代碼便能完成整個程序的運行:
if __name__ == '__main__':
get_comment()
print('爬取結(jié)束')
4 總結(jié)與展望
當(dāng)最后程序完成后,會在根目錄下顯示 Project_Gutenberg_comment.xls 文件,這時便完成了數(shù)據(jù)采取工作。值得一提的是,無論是機器學(xué)習(xí),還是數(shù)據(jù)分析,它們的基礎(chǔ)便是數(shù)據(jù),因此數(shù)據(jù)的獲取至關(guān)重要。
這里我們只是簡單的獲取了貓眼電影移動端每天前1000條評論,并未完整的爬取某一天的全部評論,這一任務(wù)可以留作后續(xù)我們繼續(xù)完成。
微信公眾號:Python一號通
關(guān)注可了解更多的爬蟲教程及機器學(xué)習(xí)內(nèi)容。
問題或建議,請評論留言