【问题标题】:Scraping an 'onclick' table with Selenium in Python在 Python 中使用 Selenium 抓取“onclick”表
【发布时间】:2018-11-23 11:24:49
【问题描述】:

我正在尝试使用 Python 中的 Selenium(使用 Chrome Web 驱动程序)抓取以下网页。

https://www.betexplorer.com/soccer/argentina/superliga/argentinos-jrs-talleres-cordoba/ptSIK7kB/#ah1

我只想收集博彩公司为 Bet365 的数据行。

我已经能够获得这种情况的所有行。但是,我正在努力抓取单击值时出现的“onclick”表中的信息:

上图显示了表格 ARCHIVE ODDS,当点击 5.90 时出现。

目的是从 Bet365 是博彩公司的所有行中的每个表中收集信息。

到目前为止,我的尝试是使用 CSS 选择器找到所有“onclick”链接:

table_links = browser.find_elements_by_css_selector("span[onclick*='16);']")

然后循环遍历每个 table_links,单击每个,然后使用 xpath 抓取出现的数据:

bet365table = []
for i in table_links:
    i.click()
    xx = browser.find_element_by_xpath("//TBODY[@id='aodds-tbody']")
    bet365table.append(xx)

但是,每次都会失败,并显示元素不可点击的错误。

【问题讨论】:

  • 使用相关的 HTML 和您的代码试验更新问题
  • @DebanjanB 到目前为止,我已经用我的尝试更新了帖子 - 从我的结尾开始,帖子中的链接有效,但如果您遇到困难,请告诉我!

标签: python selenium web-scraping


【解决方案1】:

您还可以模仿 XHR 请求并获取 JSON 响应。 Bet365 的 id 为 16。您可以使用 CSS 选择器测试符合条件的行

import requests
import pandas as pd
import json
from pandas.io.json import json_normalize
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

d = webdriver.Chrome()
d.get("https://www.betexplorer.com/soccer/argentina/superliga/argentinos-jrs-talleres-cordoba/ptSIK7kB/#ah")
WebDriverWait(d,10).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, ".in-bookmaker-logo-link.in-bookmaker-logo-link--primary.l16")))

base = 'https://www.betexplorer.com/archive-odds/'
links = d.find_elements_by_css_selector("[onclick$=', 16);']")
extracted_links = [link.get_attribute("onclick").strip("load_odds_archive(this, '").strip("', 16);") for link in links]
json_links = [base + link + '/16/?_=1' for link in extracted_links]

for link in json_links:
    res = requests.get(link)
    data= json.loads(res.content)
    data = json_normalize(data)
    print(data)

d.quit()

【讨论】:

  • 不知道这是一种可能的方法!请问,您是如何发现本网站有这种可能性的?
  • 我使用开发工具 (F12) 在按下显示赔率表时监控流量。我注意到 16 与 Bet365 相关联,并且返回了 JSON 响应。我还看到请求 URL 的开头是常量,中间部分来自现有的 365 href,结尾是一个常量加上一个递增的数字,这对 AFAICS 没有真正意义,所以我只是将数字 1 插入到末尾的请求 URL。我怀疑他们甚至可能提供一个非常值得研究的 API。
猜你喜欢
  • 2021-04-26
  • 1970-01-01
  • 1970-01-01
  • 2019-10-30
  • 2020-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
相关资源
最近更新 更多