通過抓取淘寶評論為例講解Python爬取ajax動態(tài)生成的數(shù)據(jù)(經(jīng)典)
在學(xué)習(xí)python的時(shí)候,一定會遇到網(wǎng)站內(nèi)容是通過 ajax動態(tài)請求、異步刷新生成的json數(shù)據(jù) 的情況,并且通過python使用之前爬取靜態(tài)網(wǎng)頁內(nèi)容的方式是不可以實(shí)現(xiàn)的,所以這篇文章將要講述如果在python中爬取ajax動態(tài)生成的數(shù)據(jù)。
至于讀取靜態(tài)網(wǎng)頁內(nèi)容的方式,有興趣的可以查看本文內(nèi)容。
這里我們以爬取淘寶評論為例子講解一下如何去做到的。
這里主要分為了四步:
一 獲取淘寶評論時(shí),ajax請求鏈接(url)
二 獲取該ajax請求返回的json數(shù)據(jù)
三 使用python解析json數(shù)據(jù)
四 保存解析的結(jié)果
步驟一:
獲取淘寶評論時(shí),ajax請求鏈接(url)這里我使用的是Chrome瀏覽器來完成的。打開淘寶鏈接,在搜索框中搜索一個商品,比如“鞋子”,這里我們選擇第一項(xiàng)商品。
然后跳轉(zhuǎn)到了一個新的網(wǎng)頁中。在這里由于我們需要爬取用戶的評論,所以我們點(diǎn)擊累計(jì)評價(jià)。
然后我們就可以看到用戶對該商品的評價(jià)了,這時(shí)我們在網(wǎng)頁中右擊選擇審查元素(或者直接使用F12打開)并且選中Network選項(xiàng),如圖所示:
我們在用戶評論中,翻到底部 點(diǎn)擊下一頁或者第二頁,我們在Network中看到動態(tài)添加了幾項(xiàng),我們選擇開頭為list_detail_rate.htm?itemId=35648967399的一項(xiàng)。
然后點(diǎn)擊該選項(xiàng),我們可以在右邊選項(xiàng)框中看到有關(guān)該鏈接的信息,我們要復(fù)制Request URL中的鏈接內(nèi)容。
我們在瀏覽器的地址欄中輸入剛才我們獲得url鏈接,打開后我們會發(fā)現(xiàn)頁面返回的是我們所需要的數(shù)據(jù),不過顯得很亂,因?yàn)檫@是json數(shù)據(jù)。
二 獲取該ajax請求返回的json數(shù)據(jù)
下一步,我們就要獲取url中的json數(shù)據(jù)了。我所使用的python編輯器是pycharm,下面看一下python代碼:
# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import requests
url='https://rate.tmall.com/list_detail_rate.htm?itemId=35648967399&spuId=226460655&sellerId=1809124267ℴ=3¤tPage=1&append=0&content=1&tagId=&posi=&picture=&ua=011UW5TcyMNYQwiAiwQRHhBfEF8QXtHcklnMWc%3D%7CUm5OcktyT3ZCf0B9Qn9GeC4%3D%7CU2xMHDJ7G2AHYg8hAS8WKAYmCFQ1Uz9YJlxyJHI%3D%7CVGhXd1llXGVYYVVoV2pVaFFvWGVHe0Z%2FRHFMeUB4QHxCdkh8SXJcCg%3D%3D%7CVWldfS0RMQ47ASEdJwcpSDdNPm4LNBA7RiJLDXIJZBk3YTc%3D%7CVmhIGCUFOBgkGiMXNwswCzALKxcpEikJMwg9HSEfJB8%2FBToPWQ8%3D%7CV29PHzEfP29VbFZ2SnBKdiAAPR0zHT0BOQI8A1UD%7CWGFBET8RMQszDy8QLxUuDjIJNQA1YzU%3D%7CWWBAED4QMAU%2BASEYLBksDDAEOgA1YzU%3D%7CWmJCEjwSMmJXb1d3T3JMc1NmWGJAeFhmW2JCfEZmWGw6GicHKQcnGCUdIBpMGg%3D%3D%7CW2JfYkJ%2FX2BAfEV5WWdfZUV8XGBUdEBgVXVJciQ%3D&isg=82B6A3A1ED52A6996BCA2111C9DAAEE6&_ksTS=1440490222698_2142&callback=jsonp2143' #這里的url比較長
content=requests.get(url).content
print content #打印出來的內(nèi)容就是我們之前在網(wǎng)頁中獲取到的json數(shù)據(jù)。包括用戶的評論。
這里的content就是我們所需要的json數(shù)據(jù),下一步就需要我們解析這些個json數(shù)據(jù)了。
三 使用python解析json數(shù)據(jù)
# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import requests
import json
import re
url='https://rate.tmall.com/list_detail_rate.htm?itemId=35648967399&spuId=226460655&sellerId=1809124267ℴ=3¤tPage=1&append=0&content=1&tagId=&posi=&picture=&ua=011UW5TcyMNYQwiAiwQRHhBfEF8QXtHcklnMWc%3D%7CUm5OcktyT3ZCf0B9Qn9GeC4%3D%7CU2xMHDJ7G2AHYg8hAS8WKAYmCFQ1Uz9YJlxyJHI%3D%7CVGhXd1llXGVYYVVoV2pVaFFvWGVHe0Z%2FRHFMeUB4QHxCdkh8SXJcCg%3D%3D%7CVWldfS0RMQ47ASEdJwcpSDdNPm4LNBA7RiJLDXIJZBk3YTc%3D%7CVmhIGCUFOBgkGiMXNwswCzALKxcpEikJMwg9HSEfJB8%2FBToPWQ8%3D%7CV29PHzEfP29VbFZ2SnBKdiAAPR0zHT0BOQI8A1UD%7CWGFBET8RMQszDy8QLxUuDjIJNQA1YzU%3D%7CWWBAED4QMAU%2BASEYLBksDDAEOgA1YzU%3D%7CWmJCEjwSMmJXb1d3T3JMc1NmWGJAeFhmW2JCfEZmWGw6GicHKQcnGCUdIBpMGg%3D%3D%7CW2JfYkJ%2FX2BAfEV5WWdfZUV8XGBUdEBgVXVJciQ%3D&isg=82B6A3A1ED52A6996BCA2111C9DAAEE6&_ksTS=1440490222698_2142&callback=jsonp2143'
cont=requests.get(url).content
rex=re.compile(r'\w+[(]{1}(.*)[)]{1}')
content=rex.findall(cont)[0]
con=json.loads(content,"gbk")
count=len(con['rateDetail']['rateList'])
for i in xrange(count):
print con['rateDetail']['rateList'][i]['appendComment']['content']
解析:
這里需要導(dǎo)入所要的包,re為正則表達(dá)式需要的包,解析json數(shù)據(jù)需要import json
cont=requests.get(url).content #獲取網(wǎng)頁中json數(shù)據(jù)
rex=re.compile(r'\w+[(]{1}(.*)[)]{1}') #正則表達(dá)式去除cont數(shù)據(jù)中多余的部分,是數(shù)據(jù)成為真正的json格式的數(shù)據(jù){“a”:”b”,”c”:”d”}
con=json.loads(content,”gbk”) 使用json的loads函數(shù) 將content內(nèi)容轉(zhuǎn)化為json庫函數(shù)可以處理的數(shù)據(jù)格式,”gbk”為數(shù)據(jù)的編碼方式,由于win系統(tǒng)默認(rèn)為gbk
count=len(con[‘rateDetail'][‘rateList']) #獲取用戶評論的個數(shù)(這里只是當(dāng)前頁的)
for i in xrange(count):
print con[‘rateDetail'][‘rateList'][i][‘a(chǎn)ppendComment']
#循環(huán)遍歷用戶的評論 并輸出(也可以根據(jù)需求保存數(shù)據(jù),可以查看第四部分)
這里的難點(diǎn)是在雜亂的json數(shù)據(jù)中查找用戶評論的路徑
四 保存解析的結(jié)果
這里用戶可以將用戶的評論信息保存到本地,如保存為csv格式。
以上就是本文的全部所述,希望大家喜歡。
- python+selenium定時(shí)爬取丁香園的新型冠狀病毒數(shù)據(jù)并制作出類似的地圖(部署到云服務(wù)器)
- python 爬取疫情數(shù)據(jù)的源碼
- 用python爬取歷史天氣數(shù)據(jù)的方法示例
- Python大數(shù)據(jù)之從網(wǎng)頁上爬取數(shù)據(jù)的方法詳解
- python多線程+代理池爬取天天基金網(wǎng)、股票數(shù)據(jù)過程解析
- Python如何爬取實(shí)時(shí)變化的WebSocket數(shù)據(jù)的方法
- 實(shí)例講解Python爬取網(wǎng)頁數(shù)據(jù)
- Python爬取數(shù)據(jù)并寫入MySQL數(shù)據(jù)庫的實(shí)例
- python爬蟲爬取網(wǎng)頁表格數(shù)據(jù)
- python爬取網(wǎng)站數(shù)據(jù)保存使用的方法
- 如何用python爬取微博熱搜數(shù)據(jù)并保存
相關(guān)文章
基于iframe實(shí)現(xiàn)ajax跨域請求 獲取網(wǎng)頁中ajax數(shù)據(jù)
這篇文章主要介紹了基于iframe實(shí)現(xiàn)ajax跨域請求,并獲取網(wǎng)頁中ajax數(shù)據(jù),如何利用網(wǎng)頁ajax請求暴露出來的接口去抓取網(wǎng)頁數(shù)據(jù)?需要的朋友可以參考下2016-01-01
Django使用AJAX向服務(wù)器發(fā)起請求的操作方法
AJAX是一種用于創(chuàng)建交互式網(wǎng)頁應(yīng)用程序的技術(shù),它允許在不重新加載整個頁面的情況下向服務(wù)器發(fā)送和接收數(shù)據(jù),本文給大家介紹Django使用AJAX向服務(wù)器發(fā)起請求的操作方法,感興趣的朋友跟隨小編一起看看吧2024-05-05
Ajax 無刷新在注冊用戶名時(shí)判斷是否為空是否被使用
這篇文章主要介紹了Ajax 無刷新在注冊用戶名時(shí)判斷是否為空是否被使用,需要的朋友可以參考下2014-05-05
AJAX亂碼與異步同步以及封裝jQuery庫實(shí)現(xiàn)步驟詳解
這篇文章主要介紹了異步通信技術(shù)AJAX亂碼問題、異步與同步、手動封裝一個jQuery庫,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01
Ajax 高級功能之a(chǎn)jax向服務(wù)器發(fā)送數(shù)據(jù)
這篇文章主要介紹了Ajax 高級功能之a(chǎn)jax向服務(wù)器發(fā)送數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2016-08-08
用AJAX實(shí)現(xiàn)的無刷新的分頁實(shí)現(xiàn)代碼(asp.net)
最近學(xué)習(xí)了AJAX技術(shù)。AJAX,指的是異步的Javascript和xml。它的基本原理就是頁面用Javascript發(fā)送一個異步的http請求到服務(wù)器,服務(wù)器返回?cái)?shù)據(jù)后,再用Javascript靜態(tài)的去更改頁面某個地方的值,而無需提交表單。2011-04-04
利用XMLHTTP實(shí)現(xiàn)的二級連動Select
利用XMLHTTP實(shí)現(xiàn)的二級連動Select...2006-09-09
前端ajax請求+后端java實(shí)現(xiàn)的下載zip壓縮包功能示例
這篇文章主要介紹了前端ajax請求+后端java實(shí)現(xiàn)的下載zip壓縮包功能,結(jié)合實(shí)例形式分析了ajax請求交互與后端圖片zip格式壓縮并下載功能相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2023-05-05

