js抓取网页内容(利用Python和BeautifulSoup抓取网页内容中的解决方法是PyQt或Selenium)
优采云 发布时间: 2021-11-02 08:06js抓取网页内容(利用Python和BeautifulSoup抓取网页内容中的解决方法是PyQt或Selenium)
《使用Python和BeautifulSoup抓取网页内容》中提到的方法在处理网页中JavaScript执行的结果时会遇到问题。比如我想爬去去哪儿网的机票搜索结果,抓到的结果是“请稍等,您的查询结果正在实时搜索中”。这不是我想要的结果。我在stackoverflow上提出了这个问题,得到的回答是Python中的urllib模块无法解决这个问题,因为这个页面调用了JavaScript函数来执行搜索和加载搜索结果。本回复中给出的解决方案是PyQt或Selenium。因为我还是想用Python来解决这个问题,所以尝试了PyQt。
PyQt 是为诺基亚 Qt 应用程序框架开发的一组 Python 库,可以运行在 Window、Mac OSX 和 Linux 平台上。最新版本是 PyQt v4.9.4。
在Mac OSX上安装PyQt4:以在Mac OSX 10.7.5上安装PyQt v4.9.4为例。
1. 下载并安装 Qt。您可以根据安装程序向导逐步执行。
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解决不了我的问题,可能……问题还在摸索中……