2017-08-23 160 views
0

我想從紐約馬拉松2016(http://results.nyrr.org/event/M2016/finishers)的跑步者的信息數據庫。這是一個JavaScript大型網站,需要點擊每個「展開結果」才能加載其信息。正如你所看到的,有超過5萬名選手,所以這項任務並不容易。關於刮JavaScript重網站的建議

我一直在嘗試使用Python-selenium來做到這一點。首先,我點擊「顯示更多」,直到我獲得所有參賽選手的名單。然後,我點擊每個參賽者的「展開結果」按鈕,最後使用BeautifulSoup獲取我想要的信息。這種方法的問題在於它非常緩慢並且出錯,因爲有時沒有按鈕可以點擊。

我想問一下有哪些方法可以做到這一點。有沒有更好的方法來創建這個數據庫?任何關於更好的方法或如何改善我的意見將不勝感激。

+0

進入瀏覽器的網絡面板,找出擴展結果後發送的請求,並複製它。沒有涉及硒。 – Ryan

+0

它似乎** http://results.nyrr.org/api/runners/finishers(POST)**正在使用**「pageSize」:51(在有效載荷中)**如果您只想驗證結果數可以改變這個數字 – mahesh

+0

@Ryan我可以做我在展開結果時發送的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