我正在尝试从中抓取机票信息(包括飞机信息和价格信息等)http://flight.qunar.com/使用python3和BeautifulSoup。下面是我正在使用的python代码。在这个代码中,我试图从北京获取航班信息(北京)去丽江(丽江)2012年7月25日。
import urllib.parse
import urllib.request
from bs4 import BeautifulSoup
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
response = urllib.request.urlopen(full_url)
soup = BeautifulSoup(response)
print(soup.prettify())
我得到的是提交请求后的初始页面,该页面仍在加载搜索结果。我想要的是加载完搜索结果后的最后一页。那么我如何使用python来实现这个目标呢?
问题实际上相当棘手-网站使用通过JavaScript加载的动态生成内容,但urllib
基本上只能获得禁用JavaScript时在浏览器中获得的内容。那么,我们能做什么呢?
使用
- 硒或
- PhantomJS或
- 撬棍
完全呈现网页(它们本质上是用于测试和抓取的无头自动浏览器)
或者,如果您想要一个(半)纯Python解决方案,请使用PyQt4.QtWebKit
来渲染页面。它的工作原理大致如下:
import sys
import signal
from optparse import OptionParser
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import QWebPage
url = "http://www.stackoverflow.com"
def page_to_file(page):
with open("output", 'w') as f:
f.write(page.mainFrame().toHtml())
f.close()
app = QApplication()
page = QWebPage()
signal.signal( signal.SIGINT, signal.SIG_DFL )
page.connect(page, SIGNAL( 'loadFinished(bool)' ), page_to_file)
page.mainFrame().load(QUrl(url))
sys.exit( app.exec_() )
编辑:这里有一个很好的解释。
Ps:您可能希望查看请求,而不是使用urllib
:)