天猫爬虫--爬取天猫评论中的图片
畢業設計做的是基于電商的評論圖片爬取,本次以天貓NIKE網店為爬取對象,
鏈接為:點擊打開鏈接
首先按F12打開火狐瀏覽器的流量監控工具,點擊網絡,然后依次點擊累計評論、圖片,顯示含有圖片的評論,經過艱辛查找,最后發現評論內容存放在類型為html,
https://rate.tmall.com/list_detail_rate.htm?itemId=560632678223&spuId=894371803&sellerId=890482188&order=3¤tPage=1&append=0&content=1&tagId=&posi=&picture=1&ua=098%23E1hv3vvbvPUvUvCkvvvvvjiPPss9tjDRPLqOzj1VPmPw1jDnRLSZAjDvR2SwljEvRphvCvvvvvm5vpvhvvmv99GCvvpvvPMMKphv8vvvvvCvpvvvvvvCNyCvmUOvvUUdphvWvvvv9krvpvQvvvmm86Cv2vmEvpvVmvvC9jXCuphvmvvv92UQORKfmphvLv1T89vjOezhsjZ7%2B3%2Butj7gQfut8vmxfwLZdiB%2Bm7zhlj7JecnOD7zhQ8g7EcqhQjc6%2Bul1B57OD70Oe361D7zht8gcWhcnI4mxdX9CvpvVvvpvvhCvRphvCvvvvvmjvpvhvvpvvUhCvmig7TbMur147Di3mrGD1TAqsd%2FoU0diu%2BRYsIndkv8PFOuoI75mvIApyUG%3D&isg=BKSkHuFqoyir-NZCcbH79TAIdaJWlcnPNpZBrr7Fp28paUAz5k2YN9rbLYFUsQD_&itemPropertyId=&itemPropertyIndex=&userPropertyId=&userPropertyIndex=&rateQuery=&location=&needFold=0&_ksTS=1530892714671_987&callback=jsonp988
這樣的鏈接里,
分析鏈接后,我們爬取所用的最終鏈接為:
https://rate.tmall.com/list_detail_rate.htm?itemId=560632678223&sellerId=890482188&picture=1¤tPage=1
其中itemId為商品ID,sellerId為賣家ID,picture=1表示有圖片的評論,刪除&picture=1就可以爬取所有的評論,currentId為當前頁號,它等于1得到的是評論的第一頁,借此我們可以做到循環爬取。
打開上述鏈接,發現它是json格式的,如果不加處理會是一串很讓人頭疼的字符串,我這里使用了一個叫做JSON-handle的瀏覽器插件,它可以將json文件自動排版,幫助我們分析。
效果如圖:
ok,分析完畢接下來進入正題。
首先,我們需要獲取和加載json文件
import urllib.request import json import re html = urllib.request.urlopen(url).read().decode('gbk') jsondata = re.search(r'{(.*)', html).group() data = json.loads(jsondata)由于使用了精簡的url,所以得到的html不是完整的json格式,所以用正則修改下。
獲得了data后,我們對需要的信息進行保存:
num = len(data['rateList']) #獲取當前頁總評論數 for i in range(0,num):id = data['rateList'][i]['displayUserNick']#用戶名content = data['rateList'][i]['rateContent']#評論time = data['rateList'][i]['rateDate']# 評論日期type = data['rateList'][i]['auctionSku']#型號及顏色pics=data['rateList'][i]['pics']#買家秀if(data['rateList'][i]['appendComment']==''): #判斷是否有追評,如果沒有將追評的信息默認為空appenddays=''appendtime=''appendcontent=''appendpics=''else:appenddays = data['rateList'][i]['appendComment']['days']#追加評論的間隔天數appendtime=data['rateList'][i]['appendComment']['commentTime']#追加評論的時間appendcontent=data['rateList'][i]['appendComment']['content']#追加評論的內容appendpics=data['rateList'][i]['appendComment']['pics']#追加評論的內容如上代碼,考慮到存在有些買家有追評,有些沒有,而沒有的數據中 data['rateList'][i]['appendComment'] 所對應的values是空的,如果不加判斷后面保存追加信息時會報錯。
接下來考慮循環爬取,其實只要將url循環變更就好
for j in range(1,100):url='https://rate.tmall.com/list_detail_rate.htm?itemId=560632678223&sellerId=890482188¤tPage='+str(j)print('開始爬取第'+str(j)+'頁')pagenum = data["paginator"]["lastPage"]if(j>=pagenum):break經過分析,發現data["paginator"]["lastPage"]中存放著評論總頁數,我們在循環中加個判斷,當我們爬取的當前頁碼大于或等于總頁數時跳出循環,終止爬取。
考慮到數據的存儲,我使用了mysql這個數據庫,最后對代碼進行面向對象的重新編寫,最終代碼為:
import urllib.request import pymysql import re import time import json#鏈接數據庫 def connect_db():conn = pymysql.connect(host="localhost", user="root", password="1409", port=3306, db="tmall", charset="utf8")return conn#關閉數據庫 def close_db(cursor, conn):cursor.close()conn.close()#獲取json數據 def getdata(url):html = urllib.request.urlopen(url).read().decode('gbk')jsondata = re.search(r'{(.*)', html).group()data = json.loads(jsondata)return data#獲取當前頁總評論數 def getnum(data):num = len(data['rateList'])return num#獲取總共有多少頁評論 def getpagenum(data):pagenum = data["paginator"]["lastPage"]return pagenum#抓取內容并放入數據庫中 def sql(data,num):conn = connect_db()cursor = conn.cursor()for i in range(0,num):id = data['rateList'][i]['displayUserNick']#用戶名content = data['rateList'][i]['rateContent']#評論time = data['rateList'][i]['rateDate']# 評論日期type = data['rateList'][i]['auctionSku']#型號及顏色pics=data['rateList'][i]['pics']#買家秀if(data['rateList'][i]['appendComment']==''): #判斷是否有追評,如果沒有將追評的信息默認為空appenddays=''appendtime=''appendcontent=''appendpics=''else:appenddays = data['rateList'][i]['appendComment']['days']#追加評論的間隔天數appendtime=data['rateList'][i]['appendComment']['commentTime']#追加評論的時間appendcontent=data['rateList'][i]['appendComment']['content']#追加評論的內容appendpics=data['rateList'][i]['appendComment']['pics']#追加評論的內容sql = 'insert into nikeshoes(id,content,time,type,pics,appenddays,appendtime,appendcontent,appendpics) values(%s,%s,%s,%s,%s,%s,%s,%s,%s)'params = (str(id),str(content),str(time),str(type),str(pics),str(appenddays),str(appendtime),str(appendcontent),str(appendpics))cursor.execute(sql, params)conn.commit()print(str(i) + "頁數據已經保存")close_db(cursor, conn)#主程序 #從第一頁開始,當抓取的頁數等于總評論頁數時終止循環 def main():for j in range(1,100):url='https://rate.tmall.com/list_detail_rate.htm?itemId=560632678223&sellerId=890482188¤tPage='+str(j)print('開始爬取第'+str(j)+'頁')data = getdata(url)num = getnum(data)pagenum = getpagenum(data)sql(data, num)if(j>=pagenum):breaktime.sleep(3)if __name__ == '__main__':main()本以為大功告成了,結果天貓的反爬還是厲害的,我才爬到第5頁就被攔下來了
?
最終也沒爬下來多少內容,不過我發現這個反爬其實也就攔那一下,你重新運行以下也就好了,不過記得把開始爬取的頁號改為你剛才被攔下的頁號就好了。
經過辛勤的手工勞動,完成了共1000條信息的爬取
本人學生,對于python爬蟲的學習也是剛剛入門,本文及代碼如有漏洞,還請各路大神不吝賜教,謝謝!
?
注:轉載請標明出處!
總結
以上是生活随笔為你收集整理的天猫爬虫--爬取天猫评论中的图片的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JSP打印九九乘法表和表格
- 下一篇: Acrobat如何将word文件转换成p