我正在尝试使用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
中加载,但代码并没有给我这个。如何确保表格已加载数据并先获取数据?
答案 0 :(得分:4)
抱歉,我无法打开该链接。但该表可能以两种方式之一生成:
如果是第一种情况,那么除了使用selenium-webdriver in Python之外别无选择。另外,您可以查看此answer中的示例。
如果是第二种情况,那么您可以找到URL和发送的数据,然后使用requests
模块发送类似的请求来获取数据。数据可以是JSON格式或HTML(取决于开发人员的优秀程度)。你必须相应地解析它。
有时,AJAX调用可能需要作为数据的CSRF令牌或cookie,在这种情况下,您将不得不在第一种情况下恢复到解决方案。
答案 1 :(得分: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))
这会显示:
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()