爬取動態(tài)網(wǎng)頁python+Web kit

上一篇文章爬取動態(tài)網(wǎng)頁python+selenium+webdriver介紹了爬取動態(tài)網(wǎng)站的一種模擬瀏覽器的方法,該方法的優(yōu)劣也很明顯

優(yōu):
可以模擬任何人的操作,輸入賬號密碼,點擊登錄等等操作
劣:
1.每次執(zhí)行都要打開桌面上的Chrome瀏覽器(自動化測試需要)
2.瀏覽器的各個操作步驟都需要sleep幾秒進行等待,效率低

本文針對兩個劣點的進行解決

PhantomJS

webdriver有很多種類的瀏覽器比如Internet Explorer、Chrome和 Firefox等,PhantomJS是一個無界面的瀏覽器,可以解決第一個問題。

渲染的問題

一個含有 JS 渲染的網(wǎng)頁。想要抓取網(wǎng)頁中所有信息。如果我們利用 HTTP 方法無法獲得任何信息。

import requests
from lxml import html
 
# storing response
response = requests.get('http://pycoders.com/archive')
# creating lxml tree from response body
tree = html.fromstring(response.text)
 
# Finding all anchor tags in response
print tree.xpath('//div[@class="campaign"]/a/@href')

因為這是動態(tài)渲染的網(wǎng)站,我們只能拿到一堆還沒被解析為html的js代碼。

Web kit

什么是 Web kit呢?

Web kit 可以實現(xiàn)瀏覽器所能處理的任何事情。對于某些瀏覽器來說,Web kit就是其底層的網(wǎng)頁渲染工具。

Web kit 是 QT 庫的一部分,因此需要安裝 QT 和PyQT4 庫來使用Web kit

sudo apt-get install python-qt4

注意:

上篇文章中使用selenium+webdriver其實也是通過瀏覽器來進行渲染那些js,原理相同

解析數(shù)據(jù)

思路:我們首先通過 Web kit 發(fā)送請求信息,然后等待網(wǎng)頁被完全加載后將其賦值到某個變量中。接下來我們利用 lxml 從 HTML 數(shù)據(jù)中提取出有效的信息。
1.類 Render 可以用來渲染網(wǎng)頁,當(dāng)我們新建一個 Render 類時,它可以將 url 中的所有信息加載下來并存到一個新的框架中。

import sys
from PyQt4.QtGui import *
from PyQt4.Qtcore import *
from PyQt4.QtWebKit import *
 
class Render(QWebPage):
    def __init__(self, url):
        self.app = QApplication(sys.argv)
        QWebPage.__init__(self)
        self.loadFinished.connect(self._loadFinished)
        self.mainFrame().load(QUrl(url))
        self.app.exec_()
 
    def _loadFinished(self, result):
        self.frame = self.mainFrame()
        self.app.quit()

2.利用以上的代碼我們將 HTML 結(jié)果儲存到變量 result 中

url = 'http://pycoders.com/archive/'
# This does the magic.Loads everything
r = Render(url)
# Result is a QString.
result = r.frame.toHtml()

3.轉(zhuǎn)換數(shù)據(jù)格式并解析

# QString should be converted to string before processed by lxml
formatted_result = str(result.toAscii())
 
# Next build lxml tree from formatted_result
tree = html.fromstring(formatted_result)
 
# Now using correct Xpath we are fetching URL of archives
archive_links = tree.xpath('//div[@class="campaign"]/a/@href')
print archive_links

總結(jié)

1.動態(tài)網(wǎng)站爬取核心步驟是渲染js
2.python+selenium+webdriver方式是模擬出真實環(huán)境解決的,既可以解決渲染,又可以附帶很多人的操作(輸入、點擊、最大化等),功能強大但是純采集的話效率略低
3.python+Web kit方式直接把渲染的核心部件拿出來進行解決,這種方式簡單直接,作為純采集來說是首選,但是受限于需要登錄驗證的網(wǎng)站

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 這篇文章在介紹官網(wǎng)的同時使用了比較多的腳本示例,示例里遇到的問題有部分在本篇文章進行了解釋,還有一篇文章專門記錄了...
    顧顧314閱讀 13,082評論 3 32
  • 前言 離上一篇更新的博文應(yīng)該過了挺久的了(python爬蟲(上)–請求——關(guān)于旅游網(wǎng)站的酒店評論爬?。▊鲄⒎椒ǎ?..
    Mrhyden閱讀 555評論 0 0
  • # selenium和phantomJS ——編輯:大牧莫邪 ### 目錄清單 - [x].selenium和ph...
    繁花落盡不忘初心閱讀 806評論 0 1
  • Selenium是一款強大的基于瀏覽器的開源自動化測試工具,最初由 Jason Huggins 于 2004 年在...
    FifiZhuang閱讀 7,857評論 5 71
  • 乘船從北島惠靈頓到南島皮克頓是一段令人愉快的旅程,坐在一船艙座椅上,透過明亮的玻璃窗看著窗外景色,那是海水、天空與...
    科研鐵匠鋪閱讀 531評論 0 1

友情鏈接更多精彩內(nèi)容