使用Selenium 控制加载页面和运行 JavaScript 的 Web 浏览器的最小示例。
因为 JavaScript 需要一些时间来添加元素,所以我使用 time.sleep(10) 但你可以使用特殊函数来等待元素。见Waits
因为div.game-result 在<iframe> 内部,所以首先我必须找到iframe 并切换到这个iframe。在示例中,我检查了所有 iframe,但您只能使用 all_iframes[1] 来获取元素。
Selenium有很多功能find_element_by_...和find_elements_by_... to search elements in HTML so you could do it without BeautifulSoup`
import selenium.webdriver
from bs4 import BeautifulSoup
import time
driver = selenium.webdriver.Firefox()
driver.get("https://www.bet.co.za/bet-games/")
time.sleep(10)
all_iframes = driver.find_elements_by_tag_name('iframe')
print('len(all_iframes):', len(all_iframes))
for number, iframe in enumerate(all_iframes):
print('--- iframe', number, '---')
driver.switch_to.frame(iframe)
soup = BeautifulSoup(driver.page_source, "html.parser")
samples = soup.find_all('div', {'class': 'game-result'})
print('len(samples):', len(samples))
for item in samples:
print(item.get_text(separator=','))
driver.switch_to.default_content()
结果:
len(all_iframes): 4
--- iframe 0 ---
len(samples): 0
--- iframe 1 ---
len(samples): 5
13,15,35,21,4
3,14,4,25,33
25,34,14,4,8
30,18,25,24,10
35,30,5,34,21
--- iframe 2 ---
len(samples): 0
--- iframe 3 ---
len(samples): 0
编辑:类似的版本有一个iframe,没有BeautifulSoup
import selenium.webdriver
import time
driver = selenium.webdriver.Firefox()
driver.get("https://www.bet.co.za/bet-games/")
time.sleep(10)
all_iframes = driver.find_elements_by_tag_name('iframe')
driver.switch_to.frame(all_iframes[1])
all_samples = driver.find_elements_by_css_selector('div.game-result')
print('len(all_samples):', len(all_samples))
for sample in all_samples:
all_balls = sample.find_elements_by_css_selector('span.ball-item')
all_text = [ball.text for ball in all_balls]
print(','.join(all_text))
结果:
len(all_samples): 5
13,1,12,2,10
13,14,33,26,4
21,18,12,9,4
13,15,35,21,4
3,14,4,25,33
顺便说一句: 有时页面会显示视频而不是这些数字,然后代码可能会给出空字符串。等待视频结束可能需要更复杂的代码。
编辑:
要更改游戏,您必须找到指向Lucky 7 和click() 的链接
all_titles = driver.find_elements_by_css_selector('div.game-title')
all_titles[6].click()
最小的工作示例
import selenium.webdriver
import time
driver = selenium.webdriver.Firefox()
driver.get("https://www.bet.co.za/bet-games/")
time.sleep(10)
all_iframes = driver.find_elements_by_tag_name('iframe')
driver.switch_to.frame(all_iframes[1])
all_titles = driver.find_elements_by_css_selector('div.game-title')
print('len(all_titles):', len(all_titles))
# click on link to `Lucky 7`
all_titles[6].click()
time.sleep(1)
all_samples = driver.find_elements_by_css_selector('div.game-result')
print('len(all_samples):', len(all_samples))
for sample in all_samples:
all_balls = sample.find_elements_by_css_selector('span.ball-item')
all_text = [ball.text for ball in all_balls]
print(','.join(all_text))
顺便说一句:
通常你也可以使用文本
link = driver.find_element_by_link_text('Lucky 7')
link.click()
但这个元素不在<a> 中,所以它不起作用。
但有效:
link = driver.find_element_by_xpath('//*[text()="Lucky 7"]')
link.click()