5

python3 と BeautifulSoup を使用して、 http: //flight.qunar.com/から航空券情報 (飛行機情報や価格情報などを含む) をスクレイピングしようとしています。以下は、私が使用している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を使用してこの目標を達成するにはどうすればよいですか?

4

1 に答える 1

7

この問題は実際には非常に難しいものです。このサイトでは、JavaScript を介して読み込まれる動的に生成されたコンテンツを使用してurllibいますが、基本的には、JavaScript を無効にした場合にブラウザーで取得できるものしか取得しません。では、何ができるでしょうか。

使用する

Web ページを完全にレンダリングする (基本的には、テストとスクレイピングのためのヘッドレスの自動化されたブラウザーです)

または、(半) 純粋な 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_() )

編集:これがどのように機能するかについての素晴らしい説明がありますhere

Ps: :)を使用する代わりに、リクエストを調べることをお勧めします。urllib

于 2012-07-25T11:01:21.320 に答える