js抓取网页内容(利用Python和BeautifulSoup抓取网页内容中的解决方法是PyQt或Selenium)

优采云 发布时间: 2021-11-02 08:06

  js抓取网页内容(利用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解决不了我的问题,可能……问题还在摸索中……

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线