通過爬取天貓商品評論例項分析Python爬取ajax動態生成的資料
阿新 • • 發佈:2019-02-02
本文主要通過爬取天貓商品kindle的評論為例來說明利用python爬取ajax動態生成的資料的方式,本文使用的工具如下:
工具
- chrome瀏覽器【尋找評論的動態連結】
- python3.5【執行程式碼】
- mysql【儲存爬蟲獲得的資料】
尋找連結
首先,我們要尋找到kindle商品的評論列表,如下:
和一般靜態網頁不同的是,動態網頁的連結並不在瀏覽器的頂部可以看到,也就是不可以輕易獲得,但是我們可以通過以下步驟找到連結:
右鍵點選-檢查-Network
將評論列表往下翻,選擇第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¤tPage='+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對天貓商品評論進行文字挖掘,探索千萬條評論中的奧祕。