1. 程式人生 > >Python爬蟲——實戰三:爬取蘇寧易購的商品價格(渲染引擎方法)

Python爬蟲——實戰三:爬取蘇寧易購的商品價格(渲染引擎方法)

蘇寧易購的商品價格請求URL為

https://pas.suning.com/nspcsale_0_000000000152709847_000000000152709847_0000000000_10_010_0100101_20268_1000000_9017_10106_Z001___R0104002_46.5_0_.html?callback=pcData&_=1503023077300

價格在返回的資料中結構為:pcData[0]–>data–>price–>saleInfo–>0–>promotionPrice。

但是上面的URL很難看出是什麼結構,並且也不知道需要的資訊應該從哪裡獲得。所以直接訪問URL這種方法不具備通用性。

渲染引擎WebKit

抓取蘇寧易購的商品價格時,用於上面所說的原因,我們不再採用逆向工程方法。而是採用渲染引擎WebKit方法。渲染引擎在載入頁面的時候,除了載入靜態頁面之外,還會載入所有的動態內容,相當於我們所看到的顯示內容都會被載入。

對價格點選右鍵,選擇查元素可以看到價格在如下標籤中:

這裡寫圖片描述

程式碼:

from PySide.QtGui import *
from PySide.QtWebKit import *
from PySide.QtCore import *

import sys
import time

class BrowserRender(QWebView):
    def __init__(self, show=True):
        self.app = QApplication(sys.argv)
        QWebView.__init__(self)
        if
show: self.show() def download(self, url, timeout=60): loop = QEventLoop() timer = QTimer() timer.setSingleShot(True) timer.timeout.connect(loop.quit) self.loadFinished.connect(loop.quit) self.load(QUrl(url)) timer.start(timeout * 1000
) loop.exec_() if timer.isActive(): timer.stop() return self.html() else: print "Request time out: " + url def html(self): return self.page().mainFrame().toHtml() def find(self, pattern): return self.page().mainFrame().findAllElements(pattern) def attr(self, pattern, name, value): for e in self.find(pattern): e.setAttribute(name, value) def text(self, pattern, value): for e in self.find(pattern): e.setPlainText(value) def click(self, pattern): for e in self.find(patter): e.evaluateJavaScript("this.click()") """ def wait_load(self, pattern, timeout=60): deadline = time.time() + timeout while time.time() < deadline: self.app.processEvents() matches = self.find(pattern) if matches: return matches print "wait load time out" """ if __name__=="__main__": br = BrowserRender(show=False) br.download("https://product.suning.com/0000000000/152709847.html? \ srcpoint=index3_homepage1_32618213038_prod02") price = br.find("span.mainprice" ) print price[0].toPlainText().encode("utf-8").strip() #如果不加encode("utf-8")會出現UnicodeEncodeError:gbk無法對u'\xa5'進行編碼的錯誤