在“利用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来解决我的问题,示例代码如下:
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并不能解决我的问题,也许⋯⋯。问题还在探索中⋯⋯