网络抓取的问题(William HillUFC赔率)

2024-09-29 18:30:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个网页刮板,它可以让我得到即将到来的威廉山UFC战斗的几率。我用的是漂亮的汤,但还能够成功地获取所需的数据。(https://sports.williamhill.com/betting/en-gb/ufc

我需要战士的名字和胜算。在

我尝试了各种方法来获取数据,尝试刮取不同的标签等等,但是什么都没有发生。在

def scrape_data():
    data = requests.get("https://sports.williamhill.com/betting/en- 
gb/ufc")
    soup = BeautifulSoup(data.text, 'html.parser')
    links = soup.find_all('a',{'class': 'btmarket__name btmarket__name-- 
featured'}, href=True)

        for link in links:

        links.append(link.get('href'))

        for link in links:
        print(f"Now currently scraping link: {link}")

        data = requests.get(link)
        soup = BeautifulSoup(data.text, 'html.parser')
        time.sleep(1)            

        fighters = soup.find_all('p', {'class': "btmarket__name"})
        c = fighters[0].text.strip()
        d = fighters[1].text.strip()

        f1.append(c)
        f2.append(d)

        odds = soup.find_all('span', {'class': "betbutton_odds"})

        a = odds[0].text.strip()
        b = odds[1].text.strip()

        f1_odds.append(a)
        f2_odds.append(b)

    return None

我希望它被导出到一个CSV文件。我目前正在使用Morph.io来托管和运行scraper,但它没有返回任何内容。在

如果正确,它将输出:

  1. Fighter1名称:
  2. 照片2名称:
  3. F1赔率:
  4. F2赔率:

每一场战斗。
任何帮助都将不胜感激。在


Tags: textnamedatagetlinklinksallfind
1条回答
网友
1楼 · 发布于 2024-09-29 18:30:16

返回的html具有不同的属性和值。你需要检查一下反应。在

对于写出来的csv,你需要在赔率前面加上“'”,以防止赔率被当作分数或日期处理。请参阅下面代码中注释掉的备选方案。在

import requests
from bs4 import BeautifulSoup as bs
import pandas as pd

r = requests.get('https://sports.williamhill.com/betting/en-gb/ufc')
soup = bs(r.content, 'lxml')
results = []

for item in soup.select('.btmarket:has([data-odds])'):
    match_name = item.select_one('.btmarket__name[title]')['title']
    odds = [i['data-odds'] for i in item.select('[data-odds]')]
    row = {'event-starttime' : item.select_one('[datetime]')['datetime']        
     ,'match_name' : match_name 
     ,'home_name' : match_name.split(' vs ')[0]
     #,'home_odds' : "'" + str(odds[0])
     ,'home_odds' : odds[0]
     ,'away_name' : match_name.split(' vs ')[1]
     ,'away_odds' :  odds[1]
     #,'away_odds' : "'" + str(odds[1])
   }
    results.append(row)

df = pd.DataFrame(results, columns = ['event-starttime','match_name','home_name','home_odds','away_name','away_odds'])
print(df.head())
#write to csv
df.to_csv(r'C:\Users\User\Desktop\Data.csv', sep=',', encoding='utf-8-sig',index = False )

相关问题 更多 >

    热门问题