1. 程式人生 > >如何爬取天貓評論資料

如何爬取天貓評論資料

(本文原作於2016年3月5日,有刪改)

一、原理

首先在瀏覽器位址列中輸入https://www.tmall.com/開啟天貓商城,任意檢索某一商品,以奶粉為例,搜尋結果如下圖所示:

天貓奶粉搜尋結果

任意點開其中的某個商品:

這裡寫圖片描述

這是我們常見的網頁,由文字、圖片和排版組成。現在將螢幕向下翻,直到看到“累計評價”,即下圖中紅色矩形圈起來的東西:

這裡寫圖片描述

到目前為止這個頁面沒有任何評價資訊,當用滑鼠點選“累計評價”後,評價資訊才會顯示出來。資訊並不會憑空產生,那麼,這些資訊是從哪裡來的?顯然是從伺服器而來。具體的講便是:

  1. 瀏覽器傳送請求到伺服器,告訴伺服器自己需要顯示某某商品的評論資訊;
  2. 伺服器接到請求,查詢某某商品的評論資訊;
  3. 伺服器將查詢到的評論資訊傳送給瀏覽器;
  4. 瀏覽器接收到評論資訊,將其解析為符合人類閱讀習慣的格式,顯示在網頁上。

現在來看看這一過程具體是如何實現的。需要用到流量監控工具,火狐瀏覽器按Ctrl+Q或F12可調出此工具。在火狐瀏覽器中,其介面如下:

這裡寫圖片描述

頁面下方的部分便是流量監控工具,它可以實時的顯示該網頁與外界通訊的情況,即流量。當然只會監控開啟它之後的流量。主流瀏覽器都內建了此工具,可能會有不同的名稱,但功能都大同小異,調出它的快捷鍵可能不同,但大都為F12。當然也有獨立的功能更強大的專業流量監控工具,如WireShark等,不過這次使用瀏覽器內建的工具足矣。

以下部分強烈建議讀者實際操作。網頁結構經常會發生巨大改變,若在實踐中發現有與下述不符的部分,實屬正常。網頁在變,但其原理不變。

我們利用流量監控工具來檢視瀏覽器和伺服器之間的通訊是如何完成的。在開啟流量監控工具的情況下,點選“累計評價”,點選完成後可以看到流量監控工具捕捉到了許多資料包,即下圖中紅框框起來的部分:

這裡寫圖片描述

其中每一行都是一個完整的通訊過程,包括了瀏覽器向伺服器發出的請求和伺服器返回的資料。可以看到,點選“累計評價”後,瀏覽器總共發出了9個數據包,請求不同的資訊,也接收到了9個數據包,獲得了不同的資訊。用滑鼠選中某一資料包,右鍵單擊,再在彈出選單中點選”Open in new tab”,就可以看到該資料包返回的檔案的具體內容了。

但逐個檢視,會發現評論資訊並不存在於任何一個數據包中。這是因為流量監控工具只會監控開啟它之後的流量,而第一頁的評論在我們開啟流量監控工具之前就已經載入了。現在我們先點流量監控工具右下角的“Clear”(這樣做是為了減少無用的資料包,便於以後分析,不點也可以),然後將螢幕向下翻,點選“下一頁”,再次捕捉流量,觀察瀏覽器與伺服器之間的通訊:

這裡寫圖片描述

這次只有兩個資料包,而且其中一個是圖片,對另一個”Open in new tab”,可以看到如下頁圖中所示的內容,確實是評論資訊。這個檔案的字尾雖然是.html,但實際上是一個不規範的Json檔案(JavaScript Object Notation,一種輕量級的資料交換格式)。有許多現成的庫可以解析該格式的資料。

這裡寫圖片描述

對比網頁中的評論:

這裡寫圖片描述

可以看到兩者是相符的。

分析第一個資料包,Method為GET,也就是說,它僅僅通過URL來告訴伺服器自己需要什麼商品的評論資訊。來分析下它的URL,是下面長長的一串:

https://rate.tmall.com/list_detail_rate.htm?itemId=44090725053&spuId=324363453&sellerId=725677994&order=3&currentPage=2&append=0&content=1&tagId=&posi=&picture=&ua=251UW5TcyMNYQwiAiwTR3tCf0J%2FQnhEcUpkMmQ%3D|Um5OcktzSXdDdkhxSnVMeS8%3D|U2xMHDJ%2BH2QJZwBxX39RaFF%2FX3E3VjBMPRNFEw%3D%3D|VGhXd1llXGReYFRhX2ZdYltuWWRGeEN5Q31EcEV7QnlMc01xSnNdCw%3D%3D|VWldfS0SMg41ASEbOxU5WDYSfg98UgRS|VmhIGCMaOAM4AzgDOgY5Bz8BOQU%2BHiMDPwA6BiYaJx8hGzsHOA0wECoVKAg0Cz4DIxkkHUsd|V2xMHDIcPAA6GicHPAI4bjg%3D|WGNDEz0TMw80FCgIMwk1YzU%3D|WWJCEjwSMgkzEysLMQsyZDI%3D|WmNDEz0TMws1Dy8bIRU1DDAMMGYw|W2JCEjwSMgs3Dy8bJhk5DDQONmA2|XGVFFTsVNQ8xCCgUKRAtDTkGOAxaDA%3D%3D|XWREFDoUNAg1DzQUKBUtEzMPMgY%2FBlAG|XmVFFTsVNQkzEy4OMg46DzpsOg%3D%3D|X2REFDoUNAgzEy8PMw87DzttOw%3D%3D|QHtbCyULKxAqCjISLhEtEil%2FKQ%3D%3D|QXhYCCYIKBArFzcDOgAgHCMYLBdBFw%3D%3D|QntbCyULKxIpETEEPAEhHSUcIBhOGA%3D%3D|Q3paCiRPKE4zXjhFa0t2VmlWaEh0T3VKfyl%2F|RH1dDSMNLRUuGjoGOwQ4GCYeJBsncSc%3D|RXxcDCIMLBUuEzMGPwcnGSIdIB1LHQ%3D%3D|Rn5eDiAOLn5HekBgVWtSBCQZORc5GSccJh0pfyk%3D|R35eDiAOLhcrFzcCPAgoFiwXKBZAFg%3D%3D|SHBQAC4AIHBEfUdnWGNcZ0dzT3ZWalJpS3BLcEtxTXdPcER7T3VVYFp6RHEnBzoaNBo6DjIKMQU7bTs%3D|SXBNcFBtTXJSbldrS3VNd1duTnBNbVJmRnlMbFZ2TW1VdUxsU21Nck1tUm5Oc1NyTm5PcFBxT29Od1duTm9UdEsd&_ksTS=1457399262078_1440&callback=jsonp1441

看上去很複雜,包含了很多引數。整理一下,按所含引數換行:

https://rate.tmall.com/list_detail_rate.htm
?itemId=44090725053
&spuId=324363453
&sellerId=725677994
&order=3
&currentPage=2
&append=0
&content=1
&tagId=
&posi=
&picture=
&ua=251UW5TcyMNYQwiAiwTR3tCf0J/QnhEcUpkMmQ=|Um5OcktzSXdDdkhxSnVMeS8=|U2xMHDJ+H2QJZwBxX39RaFF/X3E3VjBMPRNFEw==|VGhXd1llXGReYFRhX2ZdYltuWWRGeEN5Q31EcEV7QnlMc01xSnNdCw==|VWldfS0SMg41ASEbOxU5WDYSfg98UgRS|VmhIGCMaOAM4AzgDOgY5Bz8BOQU+HiMDPwA6BiYaJx8hGzsHOA0wECoVKAg0Cz4DIxkkHUsd|V2xMHDIcPAA6GicHPAI4bjg=|WGNDEz0TMw80FCgIMwk1YzU=|WWJCEjwSMgkzEysLMQsyZDI=|WmNDEz0TMws1Dy8bIRU1DDAMMGYw|W2JCEjwSMgs3Dy8bJhk5DDQONmA2|XGVFFTsVNQ8xCCgUKRAtDTkGOAxaDA==|XWREFDoUNAg1DzQUKBUtEzMPMgY/BlAG|XmVFFTsVNQkzEy4OMg46DzpsOg==|X2REFDoUNAgzEy8PMw87DzttOw==|QHtbCyULKxAqCjISLhEtEil/KQ==|QXhYCCYIKBArFzcDOgAgHCMYLBdBFw==|QntbCyULKxIpETEEPAEhHSUcIBhOGA==|Q3paCiRPKE4zXjhFa0t2VmlWaEh0T3VKfyl/|RH1dDSMNLRUuGjoGOwQ4GCYeJBsncSc=|RXxcDCIMLBUuEzMGPwcnGSIdIB1LHQ==|Rn5eDiAOLn5HekBgVWtSBCQZORc5GSccJh0pfyk=|R35eDiAOLhcrFzcCPAgoFiwXKBZAFg==|SHBQAC4AIHBEfUdnWGNcZ0dzT3ZWalJpS3BLcEtxTXdPcER7T3VVYFp6RHEnBzoaNBo6DjIKMQU7bTs=|SXBNcFBtTXJSbldrS3VNd1duTnBNbVJmRnlMbFZ2TW1VdUxsU21Nck1tUm5Oc1NyTm5PcFBxT29Od1duTm9UdEsd
&_ksTS=1457399262078_1440
&callback=jsonp1441

現在很清楚了,以下引數無疑是很關鍵的:

?itemId=44090725053
&sellerId=725677994
&currentPage=2

itemId是商品ID, sellerId 是賣家ID, currentPage是當前頁碼。基於此構造如下URL:

https://rate.tmall.com/list_detail_rate.htm?
ItemId=44090725053
&sellerId=725677994
&currentPage=2

將其複製貼上到瀏覽器位址列後開啟(當然先要去掉換行),可以看到同樣的評論資訊。把currentPage的值修改為1,便可以看到第1頁的評論,修改為3,便可以看到第3頁的評論。簡單實驗可知,可以看到前99頁的評論(當然該商品得有這麼多的評論),currentPage=100及以上時的內容與currentPage=99時相同。而若某商品評論較少,不足99頁,例如只有45頁,那麼,currentPage=46及以上時的內容與currentPage=45時相同。

這樣,只要知道某商品的itemId和sellerId就可以通過遍歷currentPage獲取該商品的所有的評論(前99頁,人工不停地點“下一頁”也最多隻能翻到第99頁)。
如何得知商品的itemId和sellerId呢?回到搜尋“奶粉”後的介面(即第一張插圖),把滑鼠放在任意商品上,可以在瀏覽器左下角看到如下的URL:

左下角可以看到URL

檢視網頁原始碼:

HTML中檢視URL

放大後:

放大後的URL

這個URL指向了商品詳情頁面,其中的id就是我們需要的itemId,user_id就是sellerId(可能對於天貓來說,賣家就是使用者,所以叫user_id)。基於此,只要獲取搜尋結果頁的各商品的URL就可以獲得itemId和sellerId了。這件簡單的事情用八爪魚之類的資料採集器可以迅速完成。當然也可以自己寫爬蟲獲取。

小結:

當我們在天貓商品詳情頁點“累計評價”時及檢視評論翻頁時,瀏覽器用如下的URL:

https://rate.tmall.com/list_detail_rate.htm?
itemId=itemID&sellerId=sellerID&currentPage=N

(省略了其他引數)來告訴伺服器自己需要的是那個商品的第幾頁評論。伺服器接到請求,查詢該商品的特定評論並將查詢結果返回給瀏覽器,瀏覽器解析並顯示接收到評論資訊。
經上面的試驗已經知道,不開啟天貓紛繁龐雜的電商網頁,只發送申請評論資訊的URL,產生很少的網路流量,也可以獲得評論資訊,這對爬取者和被爬取者來說都是一件好事。
以上便是爬取天貓評論資訊的原理。總結一下:

需注意第5步中很多商品評論較少,不應以N<100為結束條件,
而應以currentPage=N+1與currentPage=N返回資料是否相同來判斷,若相同則認為該商品評論資料已爬取完畢。

二、用Python實現的爬蟲

這個程式會對每個商品產生一個日誌檔案,並且會在爬取完一個商品的評論資訊時,刪除上上一個商品的日誌檔案。這樣做就避免了爬取1G的資料,產生1G多的日誌,而其中有用的往往只是最後幾百行。

用到了Python的庫pandas來解析Json。而引入正則庫re的原因則是傳送HTTP請求後接收到的資料並不是標準的Json,需要加工,去掉多餘的部分,以使Json可以被正確的解析。

檔案itemId.txt 和sellerId.txt 中分別存放itemId和sellerId,一行一個相對應。

考慮到爬蟲程式往往會被部署到雲主機執行,所以添加了郵件預警機制,即程式意外中斷後會發送含有錯誤報告的郵件到指定的郵箱。在這裡使用了配置較為簡單的163郵箱作為發件郵箱,收件郵箱可以是任意的有效郵箱。

若想使用該程式,請進行如下操作:

1.配置郵箱

修改在程式開頭處的管理員郵箱,這個郵箱會接收程式執行的錯誤資訊和完成資訊:

receiver = ["[email protected]",] 

正確配置函式 send163mail中的作為發件郵箱的163郵箱:

sender = '************@163.com'  #設定發件郵箱,一定要自己註冊的郵箱
pwd = '************'  #設定發件郵箱的密碼,等會登陸會用到

2.配置資料庫

首先修改資料庫配置部分:

#在此處設定資料庫連線資訊
db_config = {
    "hostname": "localhost",#主機名
    "username": "root",#資料庫使用者名稱
    "password": "root",#資料庫密碼
    "databasename": "test",#要存入資料的資料庫名
    }

然後進入Mysql執行一下語句建立資料庫:

CREATE DATABASE test DEFAULT charACTER SET utf8 COLLATE utf8_general_ci;

資料庫名test可以隨意修改,但兩處要相同。

3.準備itemId.txt 和sellerId.txt

需要準備好各商品的itemId.txt 和sellerId.txt,同一類商品的itemId和sellerId分別存放在同一個檔案中並放在以商品類別名命名的資料夾中,如下所示:

 . 
├── abc 
│   ├── itemId.txt 
│   └── sellerId.txt 
├── def 
│   ├── itemId.txt 
│   └── sellerId.txt 
├── ghi 
│   ├── itemId.txt 
│   └── sellerId.txt 
└── rateList.py 

採用如上所示的檔案目錄結構最後生成的資料庫會是這樣的:

mysql> show tables; 
+----------------+ 
| Tables_in_test | 
+----------------+ 
| abc            | 
| def            | 
| ghi            | 
+----------------+ 

表abc中的資料是根據目錄abc下的sellerId.txt 和itemId.txt 檔案採集的。

4.關於失效

網頁結構常常發生變化,使得爬蟲程式常常失效。若失效了,請研究HTTP請求返回的原網頁,嘗試修改

newjson = ''.join(re.findall(r'\"rateList\":(\[.*?\])\,\"searchinfo\"',response))

使正則匹配能順利完成。當然改變太大了就只好大規模重寫程式碼了。

5.其他提示

在遠端主機使用nohup python2 rateList.py &命令(執行後若無命令提示符可按回車)可以確保退出ssh後爬蟲程式繼續執行。
用ls命令檢視日誌檔案的檔名就可以知道爬取進度。使用tail命令檢視日誌檔案的最後幾行,可以方便的追蹤日誌。

相關推薦

如何評論資料

(本文原作於2016年3月5日,有刪改) 一、原理 首先在瀏覽器位址列中輸入https://www.tmall.com/開啟天貓商城,任意檢索某一商品,以奶粉為例,搜尋結果如下圖所示: 任意點開其中的某個商品: 這是我們常見的網頁,由文字、圖

通過Python抓評論資料

接著點進去後,發現有非常多的歷史累計評價,於是我一條條的檢視,一頁頁的翻,覺得口碑還是非常不錯的,於是選擇這款商品。我想大家可能也是這樣的購物模式,也許還可能更加複雜(貨比三家,口碑比較,聯絡賣家......)。如果有一天,我想研究這些個評論資料,然後玩玩高大上的自然語言處理,我是不

通過商品評論例項分析Pythonajax動態生成的資料

本文主要通過爬取天貓商品kindle的評論為例來說明利用python爬取ajax動態生成的資料的方式,本文使用的工具如下: 工具 chrome瀏覽器【尋找評論的動態連結】 python3.5【執行程式碼】 mysql【儲存爬蟲獲得

利用Jsoup列表頁資料

由於技術有限天貓詳細頁的銷售資料爬取不到,所以採用折中的方法改為爬列表頁. 本文針對的是店內搜尋頁 以下是獲取網頁資料: /** * @param URL 根據URL獲取document

國際、京東全球購、淘寶全球購的商品資料

公司內部mini專案–智慧選品 “智慧選品”專案主要是方便採購人員瞭解其他競品平臺的商品資料,將其他平臺上賣的特別好的商品資料展示給採購人員,方便他們去採購商品,擴大公司自己的商品,所以就需要爬取其他平臺的資料,本著需求出發,這裡主要爬取天貓國際、京東全球購、

scrapy 商品資訊

spider # -*- coding: utf-8 -*- from urllib.parse import urlencode import requests import scrapy import re import json from ..items import TmallItem co

python:用scrapy評論

1,建立scrapy startproject  tb 2 ,   cd  tb  ,建立一個spider scrapy genspider 爬蟲名字 網站域名 3, 在items中寫自己想爬的東西  ,這裡我爬的是評論 ,型號,使用者名稱 4,在pippeli

Python 爬蟲 京東 商品評論 資料,並存入CSV檔案

利用閒暇時間寫了一個抓取京東商品評論資料的爬蟲。之前寫了抓取拉勾網資料的爬蟲,請 參考1,參考2。 我的開發環境是Windows + Anaconda3(Python 3.6),家用電腦沒安裝Linux(Linux下也是可以的)。 京東的評論資料是通過介面提供的,所以先找

selenium跳過webdriver檢測並商品數據

-a src 速度 tor lee lac chrome瀏覽器 自動 oca 目錄 簡介 編寫思路 使用教程 演示圖片 源代碼

手機評論

meta pen 天貓 lang ret ntp cat last eat import re import json import time import requests from bs4 import BeautifulSoup tm_headers =

php抓淘寶/評論,抓成功後自動儲存為"文字格式",儲存在當前目錄下

不說其他的,上段程式碼先index.html<!DOCTYPE html><html><meta charset="utf-8"><head><title>抓取淘寶評論</title></head&

python制作爬蟲京東商品評論教程

頭文件 天津 ref back 文字 eai 目的 格式 open 作者:藍鯨 類型:轉載 本文是繼前2篇Python爬蟲系列文章的後續篇,給大家介紹的是如何使用Python爬取京東商品評論信息的方法,並根據數據繪制成各種統計圖表,非常的細致,有需要的小夥伴可以參考下

豆瓣網評論最多的書籍

ups info 程序 不容易 ima nta 單元 bs4 很多 相信很多人都有書荒的時候,想要找到一本合適的書籍確實不容易,所以這次利用剛學習到的知識爬取豆瓣網的各類書籍,傳送門https://book.douban.com/tag/?view=cloud。 首先是這個

python 視頻評論生成詞雲圖

爬取評論生成詞雲首先爬取評論寫入文件,用上一篇爬取騰訊是視頻的評論的方法提取評論http://blog.51cto.com/superleedo/2126099 代碼需要稍作修改如下:#!/usr/bin/env python # -*- coding: utf-8 -*- import re import

利用python3淘寶評論出問題了,求高手幫忙分析下,急!!!!

這是我按照視訊教程裡面,弄的程式碼,現在有兩個問題 1.程式碼只迴圈一次,而且只運行了最後一個數值 2.生成的Excel表格,不規律,都集中在第一行 coding:utf-8 import requests import re import time import random im

crawler碎碎念6 豆瓣操作之獲取資料

import requests from lxml import etree   s = requests.Session() for id in range(0,251,25):   url ='https://movie.douban.com/top250/?start-'+str(i

同步虹商城圖片連結

import requests import time from bs4 import BeautifulSoup import re #判斷連結開啟是否正常 def get_url(url): response=requests.get(url) if response.stat

Scrapy貓眼電影評論

Scrapy爬取貓眼電影評論 文章目錄 Scrapy爬取貓眼電影評論 1、尋找評論介面 2、分析介面URL 介面URL規律 構造URL介面 分析JSON引數 3、Scrapy程式碼

urllib:Post方式AJAX載入的資料

Request請求物件的裡有data引數,它就是用在POST裡的,我們要傳送的資料就是這個引數data,data是一個字典,裡面要匹配鍵值對。 POST請求:程式碼模板 匯入request模組 import urllib.request 程式碼模板 # 首先對data進行轉碼

urllib:貼吧靜態資料

    所謂網頁抓取,就是把URL地址中指定的網路資源從網路流中讀取出來,儲存到本地。 在Python中有很多庫可以用來抓取網頁,其中最常用的就是urllib。 urllib庫的基本使用 urllib提供了一系列用於操作URL的功能