2017-08-23 125 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