利用PyQt抓取含有JavaScript執行結果的網頁內容?

來源:互聯網
上載者:User

      在“利用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並不能解決我的問題,也許⋯⋯。問題還在探索中⋯⋯

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.