【问题标题】:Advice about scraping a JavaScript-heavy website关于抓取大量 JavaScript 网站的建议
【发布时间】:2017-08-23 07:43:35
【问题描述】:

我想创建一个包含 2016 年纽约马拉松赛跑者信息的数据库 (http://results.nyrr.org/event/M2016/finishers)。这是一个大量 javascript 的网站,需要为每个跑步者点击每个“扩展结果”来加载他们的信息。如您所见,有超过 50,000 名跑步者,因此这项任务并不容易。

我一直在尝试使用 Python-selenium 来做到这一点。首先,我单击“显示更多”,直到获得所有跑步者的列表。然后,我点击了每个跑者的“Expand Results”按钮,最后使用 BeautifulSoup 来获取我想要的信息。这种方法的问题是它非常慢并且会出错,因为有时没有按钮可以点击。

我想问一下有哪些方法可以做到这一点。有没有更好的方法来制作这个数据库?任何有关更好方法或如何改进我的方法的建议将不胜感激。

【问题讨论】:

  • 进入浏览器的网络面板,查看展开结果时发送的请求,复制它。不涉及硒。
  • 似乎 ** results.nyrr.org/api/runners/finishers (POST) ** 正在使用 ** "pageSize":51 (in payload) ** 如果您只想验证结果的数量,您可以更改此数字
  • @Ryan 我能够执行展开结果时发送的 request.post 。但是,在响应上使用 BeautifulSoup 后,似乎数据不存在,我找不到它。

标签: javascript python selenium-webdriver web-scraping


【解决方案1】:

你可以试试下面的代码。您还可以使用线程来提高性能。

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

【讨论】:

  • 太棒了!但是,有一个问题。这种方法没有给我一些我需要的信息:1)5k、10k、...、40k 分裂,2)年龄组位置,3)整体枪位置,4)团队。有没有办法使用您的方法获取这些信息?
  • 您可以尝试检查每次“显示更多”单击时发送到服务器的 AJAX 请求,以查看哪些数据发送到服务器。之后,尝试更改我们在该行中的发布数据字典: request = requests.post(API_URL, {....})
  • 谢谢!现在我正在尝试复制单击“扩展结果”时发送的请求。我希望它有效:)
猜你喜欢
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-23
相关资源
最近更新 更多