? 由于日后實(shí)習(xí)需要链蕊,新年假期在家里有空寫了個(gè)抓取天mao評論的程序,并用python的snownlp模塊進(jìn)行簡單的情感分析,由于本人剛接觸python例嘱,項(xiàng)目可能有許多不足,請大家諒解宁舰!具體流程如下:
0.主要流程
0.數(shù)據(jù)采集
0.?目標(biāo)網(wǎng)址獲取
首先拼卵,獲取自己要爬取的商品網(wǎng)頁。如圖:
這里用iPhone x的商品做樣例(博主目前使用的手機(jī)是小米3蛮艰,窮鬼啊有沒有腋腮!)。因?yàn)榧虞d評論的頁面用js封裝起來了。因此需要用到瀏覽器開發(fā)者工具獲取保存評論的頁面即寡,直接按F12打開徊哑。如圖:
在NETwork//js目錄下有一個(gè)形如上圖的網(wǎng)址(巨長無比呀),細(xì)心發(fā)現(xiàn)會有一個(gè)page=1的字段聪富,這個(gè)是控制不同頁數(shù)的關(guān)鍵字莺丑!因此我們只需要改變page的值就能爬取不同頁面的內(nèi)容了!墩蔓!具體代碼如下:
# -*- coding: utf-8 -*-
import urllib.request
import json
import time
import re
import pymysql
def find_message(url,x,j):
? ? print('已有' + str(x) + '頁無法獲取')
? ? #讀取網(wǎng)頁數(shù)據(jù)
? ? html = urllib.request.urlopen(url).read().decode('gbk')
? ? #篩選json格式數(shù)據(jù)
? ? jsondata=re.search('^[^(]*?\((.*)\)[^)]*$', html).group(1)
? ? #用json加載數(shù)據(jù)
? ? data = json.loads(jsondata)
? ? #數(shù)據(jù)保存在變量里
? ? conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='1234', db='pysql', charset='utf8')
? ? cur = conn.cursor()
? ? # 連接mysql
? ? print('連接成功!!!!')
? ? try:
? ? ? ? for i in range(0, len(data['rateDetail']['rateList'])):
? ? ? ? ? ? #print(str(i + 1) + data['rateDetail']['rateList'][i])
? ? ? ? ? ? name = data['rateDetail']['rateList'][i]['displayUserNick']
? ? ? ? ? ? #處理過的用戶名
? ? ? ? ? ? content = data['rateDetail']['rateList'][i]['rateContent']
? ? ? ? ? ? #當(dāng)天評論
? ? ? ? ? ? time = data['rateDetail']['rateList'][i]['rateDate']
? ? ? ? ? ? # 評論日期
? ? ? ? ? ? iphonetype = data['rateDetail']['rateList'][i]['auctionSku']
? ? ? ? ? ? #機(jī)型
? ? ? ? ? ? appenddays = data['rateDetail']['rateList'][i]['appendComment']['days']
? ? ? ? ? ? #追加評論的天數(shù)
? ? ? ? ? ? appendtime=data['rateDetail']['rateList'][i]['appendComment']['commentTime']
? ? ? ? ? ? #追加評論的時(shí)間
? ? ? ? ? ? appendcontent=data['rateDetail']['rateList'][i]['appendComment']['content']
? ? ? ? ? ? #追加評論的內(nèi)容
? ? ? ? ? ? cur.execute("insert into iphonex(用戶名,當(dāng)天評論,當(dāng)天時(shí)間,機(jī)型,追加天數(shù),追加時(shí)間,追加評論) values (\"%s\",\"%s\",\"%s\",\"%s\",%d,\"%s\",\"%s\")"%(str(name),str(content),str(time),str(iphonetype),int(appenddays),str(appendtime),str(appendcontent)))
? ? ? ? print(str(j+1)+"頁數(shù)據(jù)已經(jīng)保存")
? ? ? ? #數(shù)據(jù)插入mysql
? ? ? ? return x
? ? except BaseException:
? ? ? ? x+=1
? ? ? ? print('已有'+str(x)+'頁無法獲取')
? ? ? ? print("####此頁無法獲取####")
? ? ? ? return x
#主函數(shù)
x=0
for j in range(1,50):
? ? try:
? ? ? ? print("正在獲取第{}頁評論數(shù)據(jù)!".format(j))
? ? ? ? url = 'https://rate.tmall.com/list_detail_rate.htm?itemId=560257961625&spuId=893336129&sellerId=1917047079&order=3¤tPage=' + str(j) +'&append=1&' \
? ? ? ? ? ? ? 'content=1&tagId=&posi=&picture=0&ua=098%23E1hvLpvZv7UvUpCkvvvvvjiPPLLhzjtbPscOsjljPmPhljlUR25Z0jlURFSWljn8RFyCvvpvvvvvdphvmpvhOOhvvv2' \
? ? ? ? ? ? ? 'psOhCvv147GzzgY147Dunrn%2FrvpvEvvkj9oIuvWLMdphvmpvWPgEboQvgfOhCvv14cOjzyC147DikWn%2Fjvpvhvvpvv8wCvvpvvUmmRphvCvvvvvvPvpvhMMGvvvyCvhQpm' \
? ? ? ? ? ? ? 'kwvCszEDajxRLa9mNLhQnmOjVQ4S47B9CkaU6bnDO2hV36AxYjxAfyp%2B3%2BuQjc60fJ6EvLv%2BExreE9aUExr0jZ7%2B3%2Buzjc61C4Auphvmvvv9bvT4yc7kphvC99v' \
? ? ? ? ? ? ? 'vOClpbyCvm9vvvvvphvvvvvv96Cvpvs4vvm2phCvhRvvvUnvphvppvvv96CvpCCvvphvC9vhvvCvp86Cvvyv224CeiIvHUytvpvhvvvvv86CvvyvhEKCFgGv1WQtvpvhvvvvvUh' \
? ? ? ? ? ? ? 'CvmDz7GczTr147Dup2nGD1TAqsd%2FoU0dieGd8S6STvI8byIKB9OHmvtmWyv%3D%3D&isg=BAMDf2HuXRdECBGLXKb6oZc2ksdt0Jbc5_lgETXg6mLa9CIWvUsTCypmaoS61O-y&itemPropertyId=&itemPropertyIndex=&userProp' \
? ? ? ? ? ? ? 'ertyId=&userPropertyIndex=&rateQuery=&location=&needFold=0&_ksTS=1518175553706_1200&callback=jsonp1201'
? ? ? ? x=find_message(url,x,j)
? ? ? ? time.sleep(3)
? ? ? ? # 設(shè)置時(shí)間間隔(這個(gè)不要忽視)
? ? except BaseException:
? ? ? ? continue
說幾點(diǎn)代碼的問題:
js網(wǎng)頁效果圖如下:
jsondata=re.search('^[^(]*?\((.*)\)[^)]*$', html).group(1)
由網(wǎng)頁效果圖可知梢莽,評論信息是保存在jsonp719()里面的,因此需要用正則表達(dá)式獲燃榕()里面的內(nèi)容昏名,去除無用部分,然后用json.loads得到字典data阵面。
如上圖轻局,用pycharm里面的json格式打開輸出的數(shù)據(jù)data可以得到想要的數(shù)據(jù)在字典中位置。
在data = json.loads(jsondata)后面加print(data)輸出原數(shù)據(jù)會發(fā)現(xiàn)一些問題:如下
打開圖中url得到:
沒錯(cuò)這個(gè)就是securitymatrix(下篇文章介紹)膜钓,這樣會有一些頁面無法獲取一些頁面嗽交,所以需要設(shè)置?time.sleep(3),這里用參數(shù)3颂斜,其實(shí)最好用random()選隨機(jī)數(shù)3到5的參數(shù)(這樣T貓機(jī)器人沒那么容易發(fā)現(xiàn)你也是它的同類夫壁,頁面丟失率會降低,當(dāng)然你也可以寫個(gè)函數(shù)重新獲取丟失的頁面)?
運(yùn)行結(jié)果:
由于丟失了2頁數(shù)據(jù)沃疮,所以剩下960條記錄(50頁每頁20條)
好了爬取工作完成了盒让!
1.?爬蟲框架選用
本來打算是用python的selenium模塊模擬登錄爬取的但是由于天貓的securitymatrix安全系統(tǒng)()比較強(qiáng)大,博主還沒有能力破解司蔬,這里只能使用自己寫的流程用request庫抓取網(wǎng)頁邑茄。
當(dāng)然你也可以選擇python的scrapy模塊爬取,這個(gè)看個(gè)人喜好吧俊啼!核心思路是不變的肺缕。
好了爬蟲部分寫到這里了,后面的內(nèi)容以后會更新授帕!由于博主還是小白同木,寫的代碼,特別是異常處理寫的不是很規(guī)范跛十。希望各位大師指點(diǎn)彤路。
聽說帥的人都點(diǎn)贊和打賞了!
? 那么你帥嗎芥映?洲尊?远豺??^-^
? ? 還有歡迎各位留言交流N豚帧Gぁ!
? ? ? 預(yù)祝2018姆吭,新年快樂榛做!