在“利用Python和BeautifulSoup抓取網頁內容”中談到的方法在處理網頁中含有JavaScript執行結果時會遇到問題,比如我想抓取去哪兒網上的機票搜尋結果時,抓取到的結果是“請稍等,您查詢的結果正在即時搜尋中”。這並不是我想要的結果。我在stackoverflow上提出了這個問題,得到的回複是利用Python中urllib模組無法解決這個問題,因為這個網頁中調用了JavaScript函數去執行搜尋並載入搜尋結果。該回複給出的解決方案是PyQt或Selenium。因為我還是想利用Python解決該問題,所以嘗試了一下PyQt。
PyQt是一套為Nokia Qt應用程式框架開發的Python庫,可以在Window,Mac OSX和Linux平台上運行。最新版本是PyQt v4.9.4。
PyQt4在Mac OSX上的安裝:以在Mac OSX 10.7.5上安裝PyQt v4.9.4為例。
1. 下載並安裝Qt。根據安裝程式wizard一步一步執行下去就可以。
2. 下載並安裝SIP。SIP是一個串連Python和C/C++的工具。解壓SIP安裝包並運行:
cd ~/Downloads/sip-4.13.3python3 configure.py -d /Library/Python/3.2/site-packages --arch x86_64makesudo make install
其中--arch x86_64指定了SIP安裝平台的體繫結構。
3. 下載並安裝PyQt4 。解壓安裝包並執行:
cd PyQt-mac-gpl-4.9.4python3 configure.py -q /Users/Sam/QtSDK/Desktop/Qt/4.8.1/gcc/bin/qmake -d /Library/Python/3.2/site-packages/ --use-arch x86_64makesudo make install
這個安裝過程可能會花一段時間。其中/Users/Sam/QtSDK是Qt的安裝目錄。
利用QtWebKit抓取網頁中JavaScript執行結果的嘗試
QtWebKit提供了一個Web瀏覽器引擎,可以解析含有CSS和JS的HTML。根據stackoverflow的回複,我嘗試利用QtWebKit中的QWebPage來解決我的問題,範例程式碼如下:
View Code
import sysimport signalimport urllib.parsefrom PyQt4.QtWebKit import QWebPageclass Crawler( QWebPage ): def __init__(self, url, file): QWebPage.__init__( self ) self._url = url self._file = file def crawl( self ): signal.signal( signal.SIGINT, signal.SIG_DFL ) self.connect( self, SIGNAL( 'loadFinished(bool)' ), self._finished_loading ) self.mainFrame().load( QUrl( self._url ) ) def _finished_loading( self, result ): file = open( self._file, 'w' ) file.write( self.mainFrame().toHtml() ) file.close() sys.exit( 0 )def main(): app = QApplication( sys.argv ) url = 'http://flight.qunar.com/site/oneway_list.htm' values = {'searchDepartureAirport':'北京', 'searchArrivalAirport':'麗江', 'searchDepartureTime':'2012-07-25'} encoded_param = urllib.parse.urlencode(values) full_url = url + '?' + encoded_param filename = 'output.txt' crawler = Crawler( full_url, filename ) crawler.crawl() sys.exit( app.exec_() )if __name__ == '__main__': main()
但是遺憾的是我得到的依然是“請稍等,您查詢的結果正在即時搜尋中”。也許某個地方處理錯了,也許PyQt並不能解決我的問題,也許⋯⋯。問題還在探索中⋯⋯