2017-08-23 3 views
0

ニューヨークマラソン2016(http://results.nyrr.org/event/M2016/finishers)のランナーズ情報を使ってデータベースを作成したいと考えています。これはjavascriptの重いサイトで、ランナーごとに「結果を展開」をクリックして情報を読み込む必要があります。ご覧のとおり、5万人以上のランナーがいるので、この作業は容易ではありません。JavaScriptを使用したウェブサイトのスクラップに関するアドバイス

私はこれを行うためにPython-Seleniumを使用しようとしています。まず、すべてのランナーのリストが表示されるまで、「もっと見る」をクリックしました。次に、各ランナーの「Expand Results」ボタンをクリックし、最後にBeautifulSoupを使用して必要な情報を取得しました。このメソッドの問題は、クリックするボタンがないために非常に遅く、エラーが発生することです。

これを行う方法がいくつかありますか。このデータベースを作成するより良い方法はありますか?より良い方法や私の改善方法についてのアドバイスをいただければ幸いです。

+0

ブラウザのネットワークパネルに移動し、結果を展開するときにどのリクエストが送信されるかを確認して、それを複製します。セレンは含まれていません。 – Ryan

+0

** http://results.nyrr.org/api/runners/finishers(POST)**は** "pageSize"を使用しています:51(ペイロード内)**あなたが結果の数を確認するだけならこの番号を変更することができます – mahesh

+0

@ライアン私は結果を拡大するときに送信されるrequest.postを行うことができます。しかし、応答でBeautifulSoupを使用した後、データが存在しないようですが、見つけられません。 – Belisario

答えて

0

以下のコードを試すことができます。スレッドを使用してパフォーマンスを向上させることもできます。

import json 

import requests 

API_URL = 'http://results.nyrr.org/api/runners/finishers' 
PAGE_SIZE = 51 


def get_page(index): 
    request = requests.post(API_URL, { 
     'ageGroup': None, 
     'city': None, 
     'eventCode': "M2016", 
     'gender': None, 
     'handicap': None, 
     'pageIndex': index, 
     'pageSize': PAGE_SIZE, 
     'runnerId': None, 
     'searchString': None, 
     'sortColumn': "overallTime", 
     'sortDescending': False 
    }) 
    data = json.loads(request.text).get('response', {}) 
    items = data.get('items', []) 
    store(items) 
    return len(items) > 0 


def store(items): 
    """Store items into database""" 
    # Write your code to store the given items 
    print(items) 


page = 1 
while get_page(page): 
    page += 1 
+0

それは素晴らしいです!しかし、問題があります。このアプローチでは、1)5k、10k、...、40kスプリット、2)年齢層の場所、3)全体的なガンの場所、4)チームが必要な情報を私に与えません。あなたの方法を使ってこの情報を入手する方法はありますか? – Belisario

+0

"詳細表示"をクリックするたびにサーバーに送信されるAJAX要求を調べて、サーバーに送信されるデータを確認することができます。その後、次の行にある投稿データの変更を試してください。 request = requests.post(API_URL、{....}) –

+0

ありがとうございました!今、私は "結果を展開"をクリックしたときに送信されたリクエストを複製しようとしています。私はそれが動作することを願っ:) – Belisario

関連する問題