如何在使用Python请求加载数据后才刮取html表?

2024-05-13 22:03:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试学习使用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中,但是代码没有给出这个值。如何确保表已加载数据并先获取它?在


Tags: 数据importdata网站responsethisrequestsportal
2条回答

您需要使用类似于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))

这将显示:

^{pr2}$

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

  1. 下载PhantomJS Windows binary

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

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

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

  1. 完全通过JavaScript,没有AJAX调用。在
  2. 使用一个JavaScript和一个对DOM进行操作的调用。在

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

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

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

相关问题 更多 >