首页 > 编程问答 >如何使用 Selenium 在可滚动面板(而不是整个窗口)中向下滚动?

如何使用 Selenium 在可滚动面板(而不是整个窗口)中向下滚动?

时间:2024-07-24 06:32:05浏览次数:9  
标签:python selenium-webdriver

我试图从 https://www.pikalytics.com/ 的左侧面板中抓取神奇宝贝名称和使用数据。我尝试使用 BeautifulSoup,但显然它只能抓取前 25 个数据,因为源代码没有完全扩展。因此,我必须在面板中向下滚动才能获得完全访问权限。但是如何?

这里我尝试过的解决方案:

driver = webdriver.Chrome()
driver.get('https://www.pikalytics.com')
panel = '//*[@id="mini_list_wrapper"]'
driver.find_element(By.XPATH, panel).send_keys(Keys.PAGE_DOWN)

因此它返回了元素不可交互的错误。我已经从其子节点尝试了一些其他 xpath,但没有一个起作用。


以下是使用 Selenium 在可滚动面板中向下滚动的方法:

1. 使用 JavaScript 执行滚动

可以使用 JavaScript 在 Selenium 中滚动特定元素。为此,需要找到可滚动面板的 WebElement,然后使用 execute_script() 方法执行 JavaScript 代码来滚动它。

以下是代码示例:

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep

driver = webdriver.Chrome()
driver.get('https://www.pikalytics.com/')

# 等待页面加载完成
sleep(5) 

# 找到可滚动面板的 WebElement
panel = driver.find_element(By.XPATH, '//*[@id="mini_list_wrapper"]')

# 使用 JavaScript 滚动到底部
driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", panel)

# 等待页面加载完成
sleep(5) 

# 现在可以抓取所有数据了

# 关闭浏览器
driver.quit()

这段代码会找到 mini_list_wrapper 元素,然后使用 scrollTop 属性将其滚动到底部。 可以根据需要修改 JavaScript 代码来控制滚动距离和方向。

2. 使用 Actions 类模拟滚动

另一种方法是使用 Selenium 的 Actions 类模拟鼠标滚轮滚动。

以下是代码示例:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
driver.get('https://www.pikalytics.com/')

# 等待页面加载完成
sleep(5)

# 找到可滚动面板的 WebElement
panel = driver.find_element(By.XPATH, '//*[@id="mini_list_wrapper"]')

# 使用 Actions 类模拟鼠标滚轮滚动
actions = ActionChains(driver)
actions.move_to_element(panel).perform()
actions.scroll_by_amount(0, 500).perform() # 向下滚动 500 像素

# 等待页面加载完成
sleep(5)

# 现在可以抓取所有数据了

# 关闭浏览器
driver.quit()

这段代码会将鼠标移动到可滚动面板上,然后使用 scroll_by_amount() 方法向下滚动 500 像素。 可以根据需要修改滚动距离和方向。

请注意,这两种方法都需要在滚动后添加适当的等待时间,以确保页面加载完成,然后再抓取数据。

标签:python,selenium-webdriver
From: 78784075

相关文章

  • 在pip包中分发pythonnet dll类型信息
    我已经能够使用C#通过以下方式加载pythonnetdll:fromimportlib.resourcesimportpathimportsys#Assuming'my_package.lib'isthesub-packagecontainingtheDLLswithpath('pyrp.lib','')aslib_path:sys.path.append......
  • 尝试使用 pyinstaller 将 python 文件转换为可执行文件时出现 TypeError
    稍后的目的是通过命令行向GPT4all发送问题并将答案存储在文本文档中。我想将阻止代码转换为exe,但它产生了TypeError。这是到目前为止的代码:fromgpt4allimportGPT4Allmodel=GPT4All("Meta-Llama-3-8B-Instruct.Q4_0.gguf",device='cpu')#downloads/loads......
  • 使用 Python-PlexAPI 获取 plex 上所有好友的关注列表
    有关如何接收我的plex服务器上所有用户的监视列表的任何提示。我正在根据一些规则创建自动删除,其中一个规则是,如果电影位于用户观看列表中,则不应删除该电影。我遇到了麻烦,因为所有与观看列表相关的内容都在MyPlexAccount上。lexapi.myplex.MyPlexAccount具有我的用......
  • 如何在 Python 中查看与 Azure OpenAI 助手关联的所有上传文件?
    我正在使用Python对文档中的问题进行基准测试,并在jupyter笔记本中实例化了我的助手。我想确认助手是否有我上传的文件,但似乎找不到有关此功能将使用什么功能的文档。使用适用于AzureOpenAI的最新版本的PythonAPI。目前,无法使用AzureOpenAI的PythonAPI直接查看......
  • 如何在Python中计算小数?
    我正在创建一个计算器来用python计算企业的利润,但到目前为止我只能使用整数。这是我的代码示例:Gross=int(input("PleaseentertotalGrossRevenuefortheFiscalYear"))NetTaxes=int(Gross)*0.1所以我将会计年度的总收入乘以按“税率”计算,但我只能使用......
  • 如何使用 Python 打开 Google Firestore 上的特定数据库?
    我正在使用Firebase并使用以下代码从Firestore设置/检索文档:importfirebase_adminfromfirebase_adminimportcredentials,firestorecred=credentials.ApplicationDefault()firebase_admin.initialize_app(cred,options={"projectId":"huq-jimbo"})fires......
  • 如何使用 Python 和 Numpy 重现 Matlab 文件读取以解码 .dat 文件?
    我有一个Matlab脚本,可以读取编码的.dat文件,对其进行解码并保存。我试图使用numpy将其转换为Python。我发现对于同一个文件,我得到不同的输出结果(python数字没有意义)。该代码最初作为从串行端口读取的脚本的一部分运行,因此是数据的结构。我首先认为位移是问题所在,因为......
  • 在Python中调整pdf页面大小
    我正在使用python裁剪pdf页面。一切正常,但如何更改页面大小(宽度)?这是我的裁剪代码:input=PdfFileReader(file('my.pdf','rb'))p=input.getPage(1)(w,h)=p.mediaBox.upperRightp.mediaBox.upperRight=(w/4,h)output.addPage(p)当我裁剪页面时,我也需要......
  • 如何使用 python 更改资源管理器窗口中的路径?
    没有人知道如何在不使用python打开新实例的情况下更改资源管理器窗口中的当前路径吗?例如,如果用户使用C:\Users\User打开资源管理器窗口。然后我必须将该路径更改为C:\Windows\System32例如。提前致谢。很遗憾,无法直接使用Python更改现有文件资源管理器窗口的......
  • python 以及将数组传递给函数的问题
    我需要求解一些常微分方程$\frac{dy}{dx}=f(x)=x^2ln(x)$并继续在限制0之间创建数组xpt。<=xpt<=2因为我必须小心xpt=0,所以我将函数定义如下deff(x):ifx<=1.e-6:return0.else:returnnp.square(x)*np.log(x)我的调用程序读取Np......