【问题标题】:How to scrape html table only after data loads using Python Requests?如何仅在使用 Python 请求加载数据后抓取 html 表?
【发布时间】:2016-07-03 11:43:49
【问题描述】:

我正在尝试学习使用 python 进行数据抓取,并且一直在使用 Requests 和 BeautifulSoup4 库。它适用于普通网站。但是,当我尝试从一些延迟后加载表数据的网站中获取一些数据时,我发现我得到了一个空表。一个例子是this webpage

我尝试过的脚本是相当常规的。

import requests
from bs4 import BeautifulSoup

response = requests.get("http://www.oddsportal.com/soccer/england/premier-league/everton-arsenal-tnWxil2o#over-under;2")
soup = BeautifulSoup(response.text, "html.parser")

content = soup.find('div', {'id': 'odds-data-portal'})

数据加载到页面中的表odds-data-portal 中,但代码没有给我。如何确保表格已加载数据并首先获取?

【问题讨论】:

  • 表格(内容)可能是由 JavaScript 生成的,因此当你只是 HTTP GET 时无法“看到”。

标签: python python-3.x web-scraping beautifulsoup python-requests


【解决方案1】:

您需要使用 selenium 之类的东西来获取 html。您可以继续使用BeautifulSoup 来解析它,如下所示:

from bs4 import BeautifulSoup
from operator import itemgetter
from selenium import webdriver

url = "http://www.oddsportal.com/soccer/england/premier-league/everton-arsenal-tnWxil2o#over-under;2"
browser = webdriver.Firefox()

browser.get(url)
soup = BeautifulSoup(browser.page_source)
data_table = soup.find('div', {'id': 'odds-data-table'})

for div in data_table.find_all_next('div', class_='table-container'):
    row = div.find_all(['span', 'strong'])

    if len(row):
        print ','.join(cell.get_text(strip=True) for cell in itemgetter(0, 4, 3, 2, 1)(row))

这将显示:

Over/Under +0.5,(8),1.04,11.91,95.5%
Over/Under +0.75,(1),1.04,10.00,94.2%
Over/Under +1,(1),1.04,11.00,95.0%
Over/Under +1.25,(2),1.13,5.88,94.8%
Over/Under +1.5,(9),1.21,4.31,94.7%
Over/Under +1.75,(2),1.25,3.93,94.8%
Over/Under +2,(2),1.31,3.58,95.9%
Over/Under +2.25,(4),1.52,2.59,95.7%   

更新 - 正如@JRodDynamite 所建议的,运行无头PhantomJS 可以代替Firefox。为此:

  1. 下载PhantomJS Windows binary

  2. 提取 phantomjs.exe 可执行文件并确保它在您的 PATH 中。

  3. 更改以下行:browser = webdriver.PhantomJS()

【讨论】:

  • 谢谢马丁!这很好用。关于这个的一个问题。这似乎打开了 firefox 浏览器,但这在命令行环境中不可用。在这种情况下,人们会怎么做?
  • 它使用 Firefox 进行处理并获取生成的 html,因此您需要它来运行。不过有一些技巧可以让它隐藏起来。尝试搜索Selenium headless
  • @sfactor - 您可以使用像PhantomJS 这样的无头浏览器。看看这个answer
【解决方案2】:

抱歉,我无法打开链接。但该表可能是通过以下两种方式之一生成的:

  1. 纯 JavaScript 没有 AJAX 调用。
  2. 使用 AJAX 调用和一些 JavaScript 进行 DOM 操作。

如果是第一种情况,那么您别无选择,只能使用selenium-webdriver in Python。另外,您可以查看answer 中的示例。

如果是第二种情况,那么你可以找出URL和发送的数据,然后使用requests模块发送类似的请求来获取数据。数据可以是 JSON 格式或 HTML(取决于开发人员的水平)。你必须相应地解析它。

有时,AJAX 调用可能需要 CSRF 令牌或 cookie 作为数据,在这种情况下,您必须恢复到第一种情况的解决方案。

【讨论】:

    猜你喜欢
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多