当前位置: 首页 > 知识库问答 >
问题:

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

蒲德曜
2023-03-14

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

我试过的剧本是相当常规的。

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'})

数据加载到页面的表赔率数据门户中,但代码没有给出。如何确保该表已加载数据并首先获取数据?


共有2个答案

孟均
2023-03-14

您需要使用类似于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。要做到这一点:

提取phantomjs。exe可执行文件,并确保它位于您的路径中。

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

邹山
2023-03-14

对不起,我打不开链接。但该表可能是通过以下两种方式之一生成的:

  1. 完全由JavaScript实现,没有AJAX调用
  2. 使用AJAX调用和一些JavaScript进行DOM操作

如果这是第一种情况,那么你别无选择,只能在Python中使用selenium-webDrive。另外,你可以看看这个答案中的例子。

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

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

 类似资料:
  • 我对python和刮擦是新手,请帮助我如何从这个表中刮擦数据。对于登录,请转到公共登录,然后输入收件人和收件人日期。 数据模型:数据模型具有以下特定顺序和大小写的列:“record_date”、“doc_number”、“doc_type”、“role”、“name”、“apn”、“transfer_amount”、“county”和“state”。“角色”列可以是“授权人”,也可以是“授权人”,

  • 问题内容: 我正在尝试教自己一些基本的网络抓取。使用Python的请求模块,在尝试以下操作之前,我能够抓取各种网站的html: 我得到的不是基本的html,而是本页面的内容: 我已经尝试过将get / post与我可以从文档,SO和其他示例中猜到的每种语法进行多种组合。我不明白上面看到的内容,无法将其转换为可以阅读的任何内容,也无法弄清楚如何获得自己真正想要的东西。我的问题是,如何获取以上页面的h

  • 我试图在一个网站上获得一个内容列表(若有人感兴趣的话,这一个)。布局最近发生了变化,现在他们不会一次加载所有内容,而是使用magic(可能是js)。我目前正在使用JSoup分析HTML,但我愿意接受建议。 这就是我得到的: 实现此目的的代码: 这是我想看到的(复制从检查元素后,页面加载了所有的内容): 谷歌帮不了什么忙,因为与微调器等相关的所有内容都与javascript有关。 解决方案: 由于J

  • 问题内容: 我正在尝试使用的模块从网络下载并保存图像。 这是我使用的(工作)代码: 你能帮助我从响应中使用什么属性吗? 问题答案: 你可以使用对象,也可以遍历响应。 默认情况下,使用类似文件的对象不会解码压缩的响应(使用GZIP或deflate)。你可以通过将属性设置为True(requests将其设置False为控制自身解码)来强制为你解压缩。然后,你可以使用将数据流式传输到文件对象: 要遍历响

  • 我正在执行使用Python请求库上传文件的简单任务。我搜索了Stack Overflow,似乎没有人遇到同样的问题,即服务器无法接收文件: 我正在用我的文件名填充upload_file关键字的值,因为如果我把它留空,它会说 现在我得到了 只有当文件为空时才会显示。所以我一直在思考如何成功地发送文件。我知道这个文件是有效的,因为如果我去这个网站手动填写表单,它会返回一个匹配对象的列表,这就是我想要的

  • 问题内容: 我有一个.jsp页面,其中有一个GUI表,该表显示来自Oracle数据库的记录。该表允许典型的分页行为,例如“ FIRST”,“ NEXT”,“ PREVIOUS”和“ LAST”。记录是从Java ResultSet对象获得的,该对象是从执行SQL语句返回的。 这个ResultSet可能很大,所以我的问题是: 如果我的ResultSet包含一百万条记录,但是我的表仅显示ResultS

  • 问题内容: 我的Python代码处理了以下文本: 您能建议我如何从内部提取数据吗?我的想法是将其放入具有以下格式的CSV文件中:。 我希望没有正则表达式会很困难,但实际上我仍然在反对正则表达式。 我或多或少地通过以下方式使用了代码: 理想情况下是将每个td竞争以某个数组进行竞争。上面的HTML是python的结果。 问题答案: 获取BeautifulSoup并使用它。这很棒。

  • 我和Gremlin.Net一起工作