首页 > 编程问答 >陷入尝试网络爬取PrizePicks CS2道具的困境

陷入尝试网络爬取PrizePicks CS2道具的困境

时间:2024-07-21 03:54:00浏览次数:12  
标签:python pandas selenium-webdriver web-scraping

我正在尝试从Prizepicks 中抓取CS2 道具,但它卡在了一段代码上,我不知道如何修复这部分。我尝试使用 api 东西,但它对我来说效果不太好,所以我尝试从 app.prizepicks 中提取它。任何建议将不胜感激,因为我真的不知道还能做什么。

下面是代码:

from path import Path
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import pandas as pd
import undetected_chromedriver as uc

############################################################################

# Initialize the WebDriver
driver = uc.Chrome()
driver.maximize_window()  # Open the window in full screen mode

############################################################################

# Scraping PrizePicks
driver.get("https://app.prizepicks.com/")
time.sleep(5)

# Waiting and closes popup
WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located((By.CLASS_NAME, "close")))
time.sleep(5)
driver.find_element(By.XPATH, "/html/body/div[3]/div[3]/div/div/button").click()
time.sleep(3)

# Creating tables for players
ppPlayers = []

# It will click CS2 tab, if you want to scrape a different sport, change 'CS2' to the sport of your liking. 
driver.find_element(By.XPATH, "//div[@class='name'][normalize-space()='CS2']").click()
time.sleep(3)

# Waits until stat container element is viewable
stat_container = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.CLASS_NAME, "stat-container")))

# Finding all the stat elements within the stat-container. (In this case, it's Map 1-2 Kills, Headshots, etc.)
categories = driver.find_element(By.XPATH, "//div[@role='button'][normalize-space()='MAPS 1-2 Headshots']").click()
projectionsPP = (By.CSS_SELECTOR, ".projection")
wait = WebDriverWait(driver, 25)
element_wait = wait.until(EC.presence_of_all_elements_located(projectionsPP))

# Creating tables for players
ppPlayers = []



############################################################################

# Data Scraping Automation begins here

for projection in projectionsPP:

    names = projection.find_element_by_xpath('.//div[@class="name"]').text
    value = projection.find_element_by_xpath('.//div[@class="presale-score"]').get_attribute('innerHTML')
    proptype = projection.find_element(By.CLASS_NAME, "text").get_attribute('innerHTML')

    players = {
            'Name': names,
            'Value': value,
            'Prop': proptype.replace("<wbr>", "")
        }

    ppPlayers.append(players)

dfProps = pd.DataFrame(ppPlayers)
dfProps.to_csv('CS2 Props.csv')

print("PrizePicks Props Offered: ", '\n')
print(dfProps)
print('\n')

driver.quit()

我希望它从 CS2 选项卡中提取道具信息并打印到 Excel 工作表,但是一旦我运行调试器,它会转到 CS2 选项卡并卡在这个特定部分。每次都会超时,无论我增加多少时间,它都会卡在那里。

projectionsPP = (By.CSS_SELECTOR, ".projection")
wait = WebDriverWait(driver, 25)
element_wait = wait.until(EC.presence_of_all_elements_located(projectionsPP))

任何帮助将不胜感激。另外,我还不知道如何有效地使用 Stack Overflow,所以如果我搞砸了一些基本的东西,请给我恩典,谢谢!


代码似乎存在一些问题,我将帮助你解决这些问题。

  1. 目标定位问题: 代码尝试定位 MAPS 1-2 Headshots 元素,但单击此元素并不一定会显示你尝试检索的 .projection 元素。这可能是 TimeoutException 的原因,因为预期元素在预期位置没有加载。

  2. 循环逻辑错误: for 循环 for projection in projectionsPP: 有问题,因为 projectionsPP 是一个定位器元组,而不是你想要迭代的元素列表。

  3. 缺少类别迭代: 代码旨在提取 CS2 道具,但它仅针对单个类别( MAPS 1-2 Headshots )。要抓取所有类别,你需要添加一个循环来遍历每个类别。

以下是经过改进的代码,可以解决这些问题:

from path import Path
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import pandas as pd
import undetected_chromedriver as uc

driver = uc.Chrome()
driver.maximize_window()
driver.get("https://app.prizepicks.com/")

time.sleep(5)
WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located((By.CLASS_NAME, "close")))
time.sleep(5)
driver.find_element(By.XPATH, "/html/body/div[3]/div[3]/div/div/button").click()
time.sleep(3)

driver.find_element(By.XPATH, "//div[@class='name'][normalize-space()='CS2']").click()
time.sleep(3)

ppPlayers = []
# 找到所有类别并迭代它们
categories = WebDriverWait(driver, 10).until(EC.visibility_of_all_elements_located((By.XPATH, "//div[@class='stat-container']//div[@role='button']")))
for category in categories:
    category.click()  # 点击类别以加载道具
    time.sleep(3)  # 调整等待时间,如果需要可以增加

    # 在类别中找到所有道具
    projections = WebDriverWait(driver, 25).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".projection")))

    for projection in projections:
        name = projection.find_element(By.CLASS_NAME, "name").text
        value = projection.find_element(By.CLASS_NAME, "presale-score").get_attribute('innerHTML')
        prop_type = projection.find_element(By.CLASS_NAME, "text").get_attribute('innerHTML').replace("&lt;wbr&gt;", "")

        players = {
            'Name': name,
            'Value': value,
            'Prop': prop_type
        }
        ppPlayers.append(players)

dfProps = pd.DataFrame(ppPlayers)
dfProps.to_csv('CS2 Props.csv')

print("PrizePicks Props Offered: ", '\n')
print(dfProps)
print('\n')

driver.quit()

这些更改包括:

  • 我们现在正在遍历所有类别并单击每个类别以加载道具。
  • 我们正在等待每个类别加载道具。
  • 我们已更正 for 循环以迭代找到的道具。

这应该可以解决你遇到的 TimeoutException 并正确抓取数据。请注意,网站结构可能会发生变化,如果代码再次停止工作,你可能需要调整定位器。

标签:python,pandas,selenium-webdriver,web-scraping
From: 78404073

相关文章

  • python 舰队容器
    我正在尝试使用容器在flet中制作一个菜单,它应该是半透明的,但其中的项目不是。我尝试将opacity=1分配给元素,但没有成功-它们与容器一样透明感谢任何帮助我的代码:nickname=ft.TextField(label="xxx",hint_text="xxx")column=ft.Column(controls=[nickname......
  • Python应用程序跨子包共享的配置文件
    我正在构建一个应用程序来控制一些硬件。我在包中实现了不同类型的硬件:电机和测量设备。我的文件结构如下:name_of_my_app/__init__.pymain.pyconfig.iniCONFIG.pymotors/__init__.pyone_kind_of_motor.pymeasurement_devices/......
  • python中时间序列数据的梯度计算
    我正在尝试编写一个函数,它可以从最适合下面的线返回梯度dataframe在浏览了谷歌的几个资源之后,我仍然不确定这是如何完成的。我明白最佳拟合线的计算公式为:y=mx+b将因变量(y)设置为foos,将自变量(x)设置为DateTimeDatafram......
  • 调试用 C 编写的 Python 扩展
    我非常熟悉编写C代码,并且很擅长编写Python代码。我正在尝试学习如何用C编写可以从OSX10.15.7上的Python-3.9.X调用的模块。我已经得到了几个“helloworld”类型的示例,但是对于复杂的示例,我正在努力弄清楚如何调试我编写的C扩展。MWE:src/add.c//......
  • 具有块大小选项的 Python pandas read_sas 因索引不匹配而失败并出现值错误
    我有一个非常大的SAS文件,无法容纳在我的服务器内存中。我只需要转换为镶木地板格式的文件。为此,我使用pandas中chunksize方法的read_sas选项分块读取它。它主要是在工作/做它的工作。除此之外,一段时间后它会失败并出现以下错误。此特定SAS文件有794......
  • 使用 requests 包 python 时打开文件太多
    我正在使用Pythonrequests包向API发出大量请求。然而,在某些时候,我的程序由于“打开的文件太多”而崩溃。当我明确关闭我的会话时,我真的不知道这是怎么回事。我使用以下代码:importrequestsimportmultiprocessingimportnumpyasnps=requests.session()s.keep......
  • Python 是一种选择性解释语言吗?为什么下面的代码不起作用?
    由于程序是从上到下运行的,为什么下面的代码不执行块中的第一行就直接抛出错误?if5>2:print("TwoislessthanFive!")print("Fiveisgreaterthantwo!")错误:文件“/Users/____/Desktop/Pythonpractise/practise.py”,第3行print("五比二大!")Indentati......
  • Pandas 哈希表给出 key error:0 和 get_item
    我试图获取两个pandas数据表的相同元素,对数据进行索引并将其合并。我将它用于大量数据(数百万)。第一个表(df)是恒定的,第二个表(d2)在每个循环中都在变化,新元素将与第一个表合并。这是我的此过程的代码:df=pd.read_csv("inputfile.csv",header=None)d1=pd.DataFram......
  • 裁剪时间变量 Python Matplotlib Xarray
    我不确定这是否是一个愚蠢的问题,但我想按时间变量剪辑.nc文件。我在xarray中打开了数据集,但以下ds.sel行(之前已运行)仅返回错误。ds=xr.open_dataset('/Users/mia/Desktop/RMP/data/tracking/mcs_tracks_2015_11.nc')selected_days=ds.sel(time=slice('2015-11-22',......
  • 用于匹配两个数据列表中的项目的高效数据结构 - python
    我有两个列表,其中一个列表填充ID,另一个列表填充进程名称。多个进程名称可以共享一个ID。我希望能够创建一个可以使用特定ID的数据结构,然后返回与该ID关联的进程列表。我还希望能够使用特定的进程名称并返回与其连接的ID列表。我知道我可以为此创建一个字典,但是I......