2012-07-25 22 views
4

我想用python3和BeautifulSoup从http://flight.qunar.com/中刮取机票信息(包括飞机信息和价格信息等)。下面是我使用的Python代码。在此代码中,我试图在2012-07-25从北京(北京)到丽江(丽江)的航班信息。如何在页面完成加载所有搜索结果后使用python urlopen scraping?

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实现这个目标呢?

回答

7

问题其实很难 - 该网站使用通过JavaScript加载的动态生成的内容,但是urllib基本上只会获得您在浏览器中禁用JavaScript的情况。所以,我们能做些什么?

使用

完全呈现网页(它们是测试基本上是无头,自动浏览器和刮削)

或者,如果你想要一个(半)p Python解决方案,请使用PyQt4.QtWebKit来呈现页面。它的工作原理approxiametly这样的:

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_()) 

编辑:有一个很好的解释这是如何工作here

PS:你可能想看看requests,而不是使用urllib :)

+0

PyQt的似乎是我的问题一个很好的候选人。我会仔细看看的。谢谢,曼纽尔。还有一个问题:PyQt是免费的吗? – 2012-07-26 05:55:17

+0

是的,它是!在Linux上,只需执行'sudo apt-get install python-qt4 libqt4-webkit' - 在Mac和Windows上,您必须手动下载它们(尽管我认为您必须注册才能下载Qt) – 2012-07-26 12:47:06

+0

我试过PyQt。但我仍然得到了与urlopen相同的结果,这不是我想要的结果。 – 2012-08-13 05:18:41

相关问题