1. 程式人生 > >通過爬取天貓商品評論例項分析Python爬取ajax動態生成的資料

通過爬取天貓商品評論例項分析Python爬取ajax動態生成的資料

本文主要通過爬取天貓商品kindle的評論為例來說明利用python爬取ajax動態生成的資料的方式,本文使用的工具如下:

工具

  1. chrome瀏覽器【尋找評論的動態連結】
  2. python3.5【執行程式碼】
  3. mysql【儲存爬蟲獲得的資料】

尋找連結

首先,我們要尋找到kindle商品的評論列表,如下:

這裡寫圖片描述

和一般靜態網頁不同的是,動態網頁的連結並不在瀏覽器的頂部可以看到,也就是不可以輕易獲得,但是我們可以通過以下步驟找到連結:

  1. 右鍵點選-檢查-Network

  2. 將評論列表往下翻,選擇第2頁,看到左邊Name多出來一些動態生成的資料,可以找到紅線框住的內容就是我們要找的動態連結:

這裡寫圖片描述

不同商品的連結中,itemId不一樣,可以到相應商品的詳情頁去找這個ID。需要連續爬取不同頁碼的資料,只需要修改page=2即可。

爬取資料

本文首先通過連結下載json格式的資料,並解析資料,遍歷所有資料提取需要的資訊儲存到mysql中,所以前提是你在mysql中建立這樣一個表格:

這裡寫圖片描述

不熟悉SQL語句可以通過navicate建立資料表格,方便視覺化。

接下來開始爬取資料,以下是所有程式碼:

# -*- coding: utf-8 -*-
import urllib.request
import json
import time
import random
import
pymysql.cursors # 從給定連結中下載json格式資料,並解析資料,提取出重要資訊儲存到SQL資料庫中 def crawlProductComment(url): # 讀取原始資料(注意選擇gbk編碼方式) html = urllib.request.urlopen(url).read().decode('gbk') # 從原始資料中提取出JSON格式資料(分別以'{'和'}'作為開始和結束標誌) jsondata = html[273:-29] # 把Json格式字串解碼轉換成Python物件 print(jsondata) data = json.loads(jsondata) # 遍歷商品評論列表
for i in data: uid = i['id'] aliMallSeller = i['aliMallSeller'] anony = i['anony'] auctionSku = i['auctionSku'] buyCount = i['buyCount'] cmsSource = i['cmsSource'] displayUserNick = i['displayUserNick'] fromMall = i['fromMall'] fromMemory = i['fromMemory'] gmtCreateTime = i['gmtCreateTime'] goldUser = i['goldUser'] rateContent = i['rateContent'] rateDate = i['rateDate'] sellerId = i['sellerId'] # 輸出商品評論關鍵資訊 print("使用者評論時間:{}".format(uid)) print("-----------------------------") # 獲取資料庫連結 connection = pymysql.connect(host = 'localhost', user = 'root', password = 'password', db = 'jd', charset = 'utf8') try: with connection.cursor() as cursor: # 建立sql語句 sql = "insert into `tb_kindle` (`uid`,`aliMallSeller`,`anony`,`auctionSku`,`buyCount`,`cmsSource`,`displayUserNick`,`fromMall`,`fromMemory`,`gmtCreateTime`," \ "`goldUser`,`rateContent`,`rateDate`,`sellerId`) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)" # 執行sql語句 cursor.execute(sql, (uid, aliMallSeller, anony, auctionSku, buyCount, cmsSource, displayUserNick, fromMall, fromMemory, gmtCreateTime, goldUser, rateContent, rateDate, sellerId)) # 提交資料庫 connection.commit() finally: connection.close() # 迴圈爬取頁面 if __name__ == '__main__': for i in range(1,500): print("正在獲取第{}頁評論資料!".format(i)) # kindle評論連結,通過更改page引數的值來迴圈讀取多頁評論資訊 url = 'https://rate.tmall.com/list_detail_rate.htm?itemId=522680881881&spuId=337259102&sellerId=2099020602&order=3&currentPage='+str(i)+'&append=0&content=1&tagId=&posi=&picture=&ua=098%23E1hv7pvovLWvUvCkvvvvvjiPPLMOQjnhPLSpgjEUPmPpQjrUR2cwtjEvn2FWtjrURphvCvvvphmCvpvWzPQ3w3cNznswO6a4dphvmpvCWomFvvv7E46Cvvyv9ET7tvvvk%2BhtvpvhvvCvpUwCvvpv9hCviQhvCvvvpZpPvpvhvv2MMqyCvm9vvhCvvvvvvvvvBBWvvvHbvvCHhQvv9pvvvhZLvvvCfvvvBBWvvvH%2BuphvmvvvpoViwCEXkphvC9hvpyPOsvyCvhACFKLyjX7re8TxEcqvaB4AdB9aUU31K39XVoE%2FlwvXeXyKnpcUA2WKK33ApO7UHd8re169kU97%2Bu04jo2v%2BboJ5E3Apf2XrqpAhjvnvphvC9mvphvvv2yCvvpvvhCv9phv2nsGM7VkqYswzPld7u6Cvvyvvog0XpvvjBUtvpvhvvCvpUhCvCLwPPC1ErMwznQyCxSSmPsSzha49p%3D%3D&isg=AqSkEzQqoiDsXtSOfIGIVQlMdaJWlclEcT_pvL7FSm88aUYz5k2YN9rbXfcK&needFold=0&_ksTS=1513608734625_1700&callback=jsonp1701' crawlProductComment(url) # 設定爬蟲過程中休眠時間 time.sleep(random.randint(30,70))

由於淘寶設定有複雜的反爬蟲機制,因此該程式碼雖然可以執行,但是一段時間會出現錯誤,只要重新設定頁碼,並執行程式碼就可以繼續爬取資料了。當然,也可以通過一些巧妙的方法來優化程式碼應對反爬蟲機制,本人才疏學淺,下次繼續。

後記:爬取資料是為了更好的分析資料,因此後續會推出利用python對天貓商品評論進行文字挖掘,探索千萬條評論中的奧祕。