导航

利用PyQt抓取含有JavaScript执行结果的网页内容?

Posted on 2012-08-11 21:06  SamWei  阅读(2152)  评论(2编辑  收藏  举报

      在“利用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.3
python3 configure.py -d /Library/Python/3.2/site-packages --arch x86_64
make
sudo make install

其中--arch x86_64指定了SIP安装平台的体系结构。

3. 下载并安装PyQt4 。解压安装包并执行:

cd PyQt-mac-gpl-4.9.4
python3 configure.py -q /Users/Sam/QtSDK/Desktop/Qt/4.8.1/gcc/bin/qmake -d /Library/Python/3.2/site-packages/ --use-arch x86_64
make
sudo make install

这个安装过程可能会花一段时间。其中/Users/Sam/QtSDK是Qt的安装目录。

      利用QtWebKit抓取网页中JavaScript执行结果的尝试

      QtWebKit提供了一个Web浏览器引擎,可以解析含有CSS和JS的HTML。根据stackoverflow的回复,我尝试利用QtWebKit中的QWebPage来解决我的问题,示例代码如下:

View Code
import sys
import signal
import urllib.parse

from PyQt4.QtWebKit import QWebPage

class 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并不能解决我的问题,也许⋯⋯。问题还在探索中⋯⋯