selenium 将数据添加到 Dataframe 问题

eivgtgni  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(190)

我有一个代码,刮一个投注网站。以下是我的代码:

from os import pardir
import time
from selenium import webdriver
from bs4 import BeautifulSoup
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from urllib.parse import urlparse, parse_qs
import re
import pandas as pd
from selenium.webdriver.remote.webelement import WebElement

driver = webdriver.Chrome('C:/Users/tmarkac/source/repos/chromedriver.exe')
team_name = 'KYVO FC'

u =f'https://superbet.pl/wyszukaj?query={team_name}'

url = driver.get(u)
driver.maximize_window()
time.sleep(1)
driver.find_element(By.XPATH,'//*[@id="onetrust-accept-btn-handler"]').click()
time.sleep(1)
driver.find_element(By.CLASS_NAME,'pick__more-odds').click()
time.sleep(3)

# options = webdriver.ChromeOptions()

# prefs = {

# "translate_whitelists": {"po":"en"},

# "translate":{"enabled":"True"}

# }

# options.add_experimental_option('prefs', prefs)

# driver = webdriver.Chrome(chrome_options=options)

expand = driver.find_elements(By.CLASS_NAME,'icon.icon--md.event-row__expanded-market-icon.icon-chevron_down')
df = pd.DataFrame({'Market':[''],'Price1': [''],'Price2': [''],'Price3': [''],'Price4': [''],'Price5': [''],
                   'Price6': [''],'Price7': [''],'Price8': [''],'Price9': [''],'Price10': [''],'Price11': [''],'Price12': [''],
                   'Price1': [''],'Price13': [''],'Price14': [''],'Price15': [''],'Price16': [''],'Price17': ['']})

exp_clicks = 0
for i in expand:
    i.click()
    time.sleep(0.1)
    exp_clicks +=1
time.sleep(1)

market_data = []
market_list = driver.find_elements(By.CLASS_NAME,'event-row__expanded-market')

for market in market_list:
       name_elem = market.find_element(By.CLASS_NAME,'event-row__expanded-market-title')
       name = name_elem.text
       market_data.append(name)
       price_element = market.find_elements(By.CLASS_NAME,'value.new.actionable') 
       for j in price_element:
           price_list = []
           price = j.text
           market_data.append(price)
       df.loc[len(df)] = market_list
       market_list.clear()
print(df)

这一行:team_name = 'KYVO FC'类似于一个输入。KYVO FC只是我从投注站点复制/粘贴的团队名称(来自该站点的任何团队名称都可以复制/粘贴到team_name变量中,所以如果您希望运行代码,请这样做)。
问题在于我如何定义我的DataFrame,以及我如何向它追加数据。目前,我是这样定义我的DateFrame的:

df = pd.DataFrame({'Market':[''],'Price1': [''],'Price2': [''],'Price3': [''],'Price4': [''],'Price5': [''],
                   'Price6': [''],'Price7': [''],'Price8': [''],'Price9': [''],'Price10': [''],'Price11': [''],'Price12': [''],
                   'Price1': [''],'Price13': [''],'Price14': [''],'Price15': [''],'Price16': [''],'Price17': ['']})

这太可怕了。即使我在编码方面的技能如此之少,我也知道这一点。代码转到投注站点,使用查询找到游戏,展开所有市场,并获取市场名称和价格(这部分完成得很好)。问题是有些市场有2个价格,有些市场有3个价格,有些市场有更多的价格。当我不知道某个特定市场会有多少价格时,我如何正确地定义我的DataFrame?简而言之,我需要一种将数据添加到DataFrame的方法,方法如下(将市场名称翻译成英语):

如果我知道如何将数据添加到数据框中,这样每一行都会包含一个市场的数据,那就太好了。谢谢。

ymdaylpp

ymdaylpp1#

我将只发布代码的相关部分,因为其余部分与原始发布中的相同。

try:
    exp_clicks = 0
    for i in expand:
        i.click()
        time.sleep(0.2)
        exp_clicks +=1
    time.sleep(1)

    market_data = []
    market_list = driver.find_elements(By.CLASS_NAME,'event-row__expanded-market')

    for market in market_list:
           counter = 0
           name_elem = market.find_element(By.CLASS_NAME,'event-row__expanded-market-title')
           name = name_elem.text
           market_data.append(name)
           price_element = market.find_elements(By.CLASS_NAME,'value.new.actionable') 
           for j in price_element:
               price_list = []
               price = j.text
               market_data.append(price)
           market_df = pd.DataFrame(np.array(market_data).reshape(-1,len(market_data)))
           df = pd.concat([df,market_df], ignore_index = True, axis = 0).replace(np.nan,'')
           market_data.clear()
           counter += 1
except:
    pass

我刚刚从一个列表中创建了Dataframe,并对其进行了重塑,以根据需要显示数据。

market_df = pd.DataFrame(np.array(market_data).reshape(-1,len(market_data)))

然后,我将新的 Dataframe 与旧的 Dataframe 连接起来,并将NaN值设置为替换为空字符串。

df = pd.concat([df,market_df], ignore_index = True, axis = 0).replace(np.nan,'')

相关问题