【问题标题】:web scraping (football odds)网页抓取(足球赔率)
【发布时间】:2017-08-25 11:01:14
【问题描述】:

我是网络爬虫的新手,现在我尝试理解它,以便与朋友进行关于德甲联赛的投注竞赛。 (我们使用的平台是kicktipp.de)。我已经设法登录到该网站并使用 python 发布足球结果。不幸的是,到目前为止,这些只是泊松分布的随机数。为了改进这一点,我的想法是从bwin 下载赔率。更准确地说,我尝试下载确切结果的赔率。问题从这里开始。到目前为止,我无法用 BeautifulSoup 提取那些。使用 google chrome 我试图了解我需要的 html 代码的哪一部分。但由于某些原因,我无法使用 BeautifulSoup 找到这些部分。 我现在的代码确实是这样的:

from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup

my_url = "https://sports.bwin.com/de/sports/4/wetten/fußball#categoryIds=192&eventId=&leagueIds=43&marketGroupId=&page=0&sportId=4&templateIds=0.8649061927316986"

# opening up connection, grabbing the page
uClient = uReq(my_url)
page_html = uClient.read()
uClient.close()

# html parsing
page_soup = soup(page_html, "html.parser")
containers1 = page_soup.findAll("div", {"class": "marketboard-event-
group__item--sub-group"})
print(len(containers1))
containers2 = page_soup.findAll("table", {"class": "marketboard-event-with-
header__markets-list"})
print(len(containers2))

从我已经看到的容器的长度来看,它们要么包含比我预期的更多的物品,要么由于未知原因它们是空的......希望你能指导我。提前致谢!

【问题讨论】:

  • 当您打印出page_soup.prettify() 时,它是否像您期望的那样显示所有表格?另外,您是否考虑过使用 requests 而不是 urllib.request?

标签: python web-scraping beautifulsoup


【解决方案1】:

您可以将seleniumChromeDriver 一起使用来抓取生成JavaScript 内容的页面,因为这里就是这种情况。

from selenium import webdriver
from bs4 import BeautifulSoup

url = "https://sports.bwin.com/de/sports/4/wetten/fußball#categoryIds=192&eventId=&leagueIds=43&marketGroupId=&page=0&sportId=4&templateIds=0.8649061927316986"
driver = webdriver.Chrome()
driver.get(url)
soup = BeautifulSoup(driver.page_source, 'html.parser')

containers = soup.findAll("table", {"class": "marketboard-event-with-header__markets-list"})

现在containers 确实有我们想要的,表格元素,检查更多,很容易看到我们想要的文本在交替的<div> 标签中,所以我们可以使用zipiter 创建一个结果和赔率的元组列表,交替 divs 列表元素:

resultAndOdds = []    
for container in containers:
    divs = container.findAll('div')
    texts = [div.text for div in divs]
    it = iter(texts)
    resultAndOdds.append(list(zip(it, it)))

演示:

>>> resultAndOdds[0]
[('1:0', '9.25'), ('0:0', '7.25'), ('0:1', '7.50'), ('2:0', '16.00'), ('1:1', '6.25'), ('0:2', '10.00'), ('2:1', '11.50'), ('2:2', '15.00'), ('1:2', '9.25'), ('3:0', '36.00'), ('3:3', '51.00'), ('0:3', '19.50'), ('3:1', '26.00'), ('4:4', '251.00'), ('1:3', '17.00'), ('3:2', '36.00'), ('2:3', '29.00'), ('4:0', '126.00'), ('0:4', '51.00'), ('4:1', '101.00'), ('1:4', '41.00'), ('4:2', '151.00'), ('2:4', '81.00'), ('4:3', '251.00'), ('3:4', '251.00'), ('Jedes andere Ergebnis', '29.00')]
>>> resultAndOdds[1]
[('1:0', '5.00'), ('0:0', '2.65'), ('0:1', '4.10'), ('2:0', '15.50'), ('1:1', '7.25'), ('0:2', '10.50'), ('2:1', '21.00'), ('2:2', '67.00'), ('1:2', '18.00'), ('3:0', '81.00'), ('3:3', '251.00'), ('0:3', '36.00'), ('3:1', '126.00'), ('4:4', '251.00'), ('1:3', '81.00'), ('3:2', '251.00'), ('2:3', '251.00'), ('4:0', '251.00'), ('0:4', '201.00'), ('4:1', '251.00'), ('1:4', '251.00'), ('4:2', '251.00'), ('2:4', '251.00'), ('4:3', '251.00'), ('3:4', '251.00'), ('Jedes andere Ergebnis', '251.00')]
>>> len(resultAndOdds)
24

根据您希望数据的样子,您还可以使用以下内容获取每个表的标题:

titlesElements = soup.findAll("div", {"class":"marketboard-event-with-header__market-name"})
titlesTexts = [title.text for title in titlesElements]

【讨论】:

  • 这无疑是很少出现的更好的想法之一。顺便说一句,driver.quit 命令应该放在哪里?谢谢。
  • 您可以使用driver.quit()similars。这将在soup 创建后立即生效。
  • @Shahin 我一意识到就编辑了,对不起! =)
  • @HighwayJohn 很高兴为您提供帮助!
猜你喜欢
  • 2019-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多