上一篇文章爬取動態網頁python+selenium+webdriver介紹了爬取動態網站的一種模擬瀏覽器的方法,該方法的優劣也很明顯
優:
可以模擬任何人的操作,輸入賬號密碼,點擊登錄等等操作
劣:
1.每次執行都要打開桌面上的Chrome瀏覽器(自動化測試需要)
2.瀏覽器的各個操作步驟都需要sleep幾秒進行等待,效率低
本文針對兩個劣點的進行解決
PhantomJS
webdriver有很多種類的瀏覽器比如Internet Explorer、Chrome和 Firefox等,PhantomJS是一個無界面的瀏覽器,可以解決第一個問題。
渲染的問題
一個含有 JS 渲染的網頁。想要抓取網頁中所有信息。如果我們利用 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')
因為這是動態渲染的網站,我們只能拿到一堆還沒被解析為html的js代碼。
Web kit
什么是 Web kit呢?
Web kit 可以實現瀏覽器所能處理的任何事情。對于某些瀏覽器來說,Web kit就是其底層的網頁渲染工具。
Web kit 是 QT 庫的一部分,因此需要安裝 QT 和PyQT4 庫來使用Web kit
sudo apt-get install python-qt4
注意:
上篇文章中使用selenium+webdriver其實也是通過瀏覽器來進行渲染那些js,原理相同
解析數據
思路:我們首先通過 Web kit 發送請求信息,然后等待網頁被完全加載后將其賦值到某個變量中。接下來我們利用 lxml 從 HTML 數據中提取出有效的信息。
1.類 Render 可以用來渲染網頁,當我們新建一個 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 結果儲存到變量 result 中
url = 'http://pycoders.com/archive/'
# This does the magic.Loads everything
r = Render(url)
# Result is a QString.
result = r.frame.toHtml()
3.轉換數據格式并解析
# 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
總結
1.動態網站爬取核心步驟是渲染js
2.python+selenium+webdriver方式是模擬出真實環境解決的,既可以解決渲染,又可以附帶很多人的操作(輸入、點擊、最大化等),功能強大但是純采集的話效率略低
3.python+Web kit方式直接把渲染的核心部件拿出來進行解決,這種方式簡單直接,作為純采集來說是首選,但是受限于需要登錄驗證的網站