3

Chicago Transit Authority bustrackerのWeb サイトから情報を取得しようとしています。特に、上位 2 つのバスの到着 ETA をすばやく出力したいと考えています。これは Splinter を使えばかなり簡単に行うことができます。ただし、このスクリプトをヘッドレス Raspberry Pi モデル B と Splinter と pyvirtualdisplay で実行すると、かなりのオーバーヘッドが発生します。

の線に沿った何か

from bs4 import BeautifulSoup
import requests

url = 'http://www.ctabustracker.com/bustime/eta/eta.jsp?id=15475'
r = requests.get(url)
s = BeautifulSoup(r.text,'html.parser')

トリックはしません。すべてのデータ フィールドは空です (まあ、  があります)。たとえば、ページが次のようになっている場合:

ここに画像の説明を入力

このコード スニペットs.find(id='time1').textu'\xa0'、Splinter で同様の検索を実行すると、「12 MINUTES」の代わりに表示されます。

私は BeautifulSoup/requests に執着していません。Splinter/pyvirtualdisplay のオーバーヘッドを必要としないものが欲しいだけです。プロジェクトでは、文字列の短いリスト (上の画像など[['9','104th/Vincennes','1158','12 MINUTES'],['9','95th','1300','13 MINUTES']]) を取得してから終了する必要があるためです。

4

1 に答える 1

10

悪いニュース

したがって、悪いニュースは、スクレイピングしようとしているページが Javascript を介してレンダリングされていることです。Splinter、Selenium、PhantomJS などのツールはこれをレンダリングして、簡単にスクレイピングできる出力を提供できますが、Python + Requests + BeautifulSoup はそのままでは提供しません。

良いニュース

Javascript から取り込まれたデータは、どこかから取得する必要があり、通常、これは解析しやすい形式で取得されます (マシンによって読み取られるように設計されているため)。

この場合、あなたの例はこの XMLをロードします。

XML 応答では JSON ほど良くないため、要求ライブラリとの統合に関するこの回答を読むことをお勧めします。ただし、Splinter よりもはるかに軽量です。

于 2015-07-31T20:27:09.337 に答える