首页 > 其他分享 >怎么解决pytnon爬虫遇到需滚动才能获取数据(selenium)

怎么解决pytnon爬虫遇到需滚动才能获取数据(selenium)

时间:2024-07-30 22:25:51浏览次数:8  
标签:滚动 selenium driver 获取数据 import pytnon 加载 页面

需要滑轮滚动才能显示元素获取数据

当你遇到网页数据需要滚动到底部或滚动到某个位置才能加载出来时,这通常是因为网页采用了懒加载(Lazy Loading)技术来优化页面加载速度和性能。在这种情况下,使用Python爬虫时,你需要模拟滚动行为以触发数据的加载。这可以通过几种方式实现,包括使用Selenium这样的工具来模拟浏览器行为。

1.使用Selenium模拟滚动

Selenium是一个自动化测试工具,可以用来模拟用户在浏览器中的操作,包括滚动页面。以下是一个基本的示例,展示如何使用Selenium和Python来滚动页面并抓取数据:

2.安装Selenium和WebDriver

首先,你需要安装Selenium库。如果你打算使用Chrome浏览器,还需要下载ChromeDriver,并确保它在你的系统路径中,或者指定ChromeDriver的路径。

pip install selenium

下载ChromeDriver,并放在合适的路径。

3.编写代码模拟滚动

from selenium import webdriver  
from selenium.webdriver.common.by import By  
from selenium.webdriver.common.keys import Keys  
from selenium.webdriver.support.ui import WebDriverWait  
from selenium.webdriver.support import expected_conditions as EC  
from time import sleep  

# 配置WebDriver  
driver = webdriver.Chrome('/path/to/chromedriver')  # 指定ChromeDriver的路径  
driver.get('你的目标网页URL')  

# 滚动到底部  
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")  

# 如果需要等待数据加载,可以使用WebDriverWait  
wait = WebDriverWait(driver, 10)  # 等待最多10秒  
# 假设页面加载完成后,某个元素会出现,这里用该元素作为加载完成的标志  
element = wait.until(EC.presence_of_element_located((By.ID, "某个已知的元素ID")))  

# 接下来可以获取数据了  
# 例如,获取页面上的所有链接  
links = driver.find_elements(By.TAG_NAME, 'a')  
for link in links:  
    print(link.get_attribute('href'))  

# 关闭浏览器  
driver.quit()

注意

  1. 等待数据加载:使用WebDriverWait和expected_conditions可以确保在继续执行脚本之前,页面已经加载了所需的数据。

  2. 动态内容:如果页面在滚动后继续动态加载内容(如无限滚动),你可能需要编写一个循环来不断滚动并检查是否还有新内容加载。
  3. 异常处理:添加异常处理来捕获并处理可能的错误,如元素未找到、超时等。
  4. 性能考虑:滚动和等待操作可能会使脚本运行较慢,特别是在网络条件不佳或页面内容较多的情况下。

需要滚动才能获取数据(无限滚动)

对于处理无限滚动的页面,你需要编写一个循环来不断滚动页面,并检查是否还有新内容加载。这通常涉及到监听页面元素的变化(如新元素的添加)或检查滚动位置是否已经到达底部但内容仍在加载。

以下是一个基于Selenium的Python示例,展示了如何编写一个循环来处理无限滚动的页面:

from selenium import webdriver  
from selenium.webdriver.common.by import By  
from selenium.webdriver.common.keys import Keys  
from selenium.webdriver.support.ui import WebDriverWait  
from selenium.webdriver.support import expected_conditions as EC  
from time import sleep  
  
def scroll_to_bottom(driver, wait_time=1):  
    """滚动到页面底部,并等待一定时间(以秒为单位)"""  
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")  
    sleep(wait_time)  # 等待页面加载新内容,这里使用了简单的sleep,但更好的做法是使用显式等待  
  
def has_more_content(driver, last_height):  
    """检查页面是否有更多内容加载,通过比较滚动前后的页面高度"""  
    new_height = driver.execute_script("return document.body.scrollHeight;")  
    return new_height != last_height  
  
def scrape_infinite_scroll(driver, url, max_scrolls=10):  
    """滚动无限滚动的页面并抓取数据,最多滚动max_scrolls次"""  
    driver.get(url)  
    last_height = driver.execute_script("return document.body.scrollHeight;")  
    scroll_count = 0  
  
    while scroll_count < max_scrolls and has_more_content(driver, last_height):  
        scroll_to_bottom(driver)  
        # 在这里可以添加抓取新加载内容的代码  
        # 例如,抓取页面上所有的某个元素  
        # elements = driver.find_elements(By.CSS_SELECTOR, 'some-selector')  
        # ... 处理elements ...  
  
        # 更新页面高度,以便下次循环时进行比较  
        last_height = driver.execute_script("return document.body.scrollHeight;")  
        scroll_count += 1  
  
    # 所有滚动完成后,可以添加最后的处理逻辑(如保存数据)  
  
# 使用示例  
driver = webdriver.Chrome('/path/to/chromedriver')  
scrape_infinite_scroll(driver, '你的目标网页URL', max_scrolls=20)  # 最多滚动20次  
driver.quit()

注意

  1. sleep(wait_time):在这个例子中,我使用了sleep来等待页面加载新内容。然而,这不是一个高效的做法,因为它会无条件地等待指定时间,无论页面是否加载了新内容。更好的做法是使用Selenium的WebDriverWaitexpected_conditions来等待某个具体的条件(如新元素的可见性)。但是,对于无限滚动,通常没有一个简单的条件可以直接等待,因此你可能需要结合页面特有的逻辑来编写一个自定义的等待条件。

  2. has_more_content:这个函数通过比较滚动前后的页面高度来判断是否有新内容加载。然而,这种方法并不总是可靠的,因为有些页面在滚动到底部后可能仍然显示加载动画或占位符,但不再加载新内容。因此,你可能需要根据页面的具体行为来调整这个检查逻辑。

  3. max_scrolls:这个参数限制了滚动的最大次数,以防止无限循环。你应该根据页面的具体内容和你的需求来设置这个值。

  4. 性能考虑:无限滚动页面可能包含大量数据,滚动和抓取这些数据可能会非常耗时和占用资源。在处理大量数据时,请考虑优化你的脚本和代码结构,以减少内存使用和提高处理速度。

标签:滚动,selenium,driver,获取数据,import,pytnon,加载,页面
From: https://blog.csdn.net/qq_43446948/article/details/140807689

相关文章

  • 学精python selenium自动化只要读完这一篇
    第一篇基础案例篇大牛测试出品,视频/代码项目案例请联系作者:2574674466前言:●内卷时代测试人员如何面对?逃避还是提高自己?●为什么要学习selenium?●内功如何修炼学习目标:●学会selenium环境搭建、不同浏览器驱动●虚拟环境与代码异常原因分析●十六大元素定位......
  • Pandas 将从 OECD 修订后的统计 API 中获取数据
    OECD更改了其统计API。在以前的版本中,此结构有效。oecd=pdmx.Request("OECD")data=oecd.data(resource_id="HH_DASH",key="AUS+DEU+ITA+JPN+KOR+GBR+USA+EU27_2020+EMU+G7M+OECD.RGDP_INDEX+RHHGDI_INDEX.Q/all?startTime=2007-Q1&endTime=202......
  • 界面自动化测试录制工具,让python selenium自动化测试脚本开发更加方便
    自动化测试中,QTP和seleniumIDE都支持浏览器录制与回放功能,简单的来说就像一个记录操作步骤的机器人,可以按照记录的步骤重新执行一遍,这就是脚本录制。个人觉得传统录制工具有些弊端,加上要定制支持我自己的自动化框架(python单机版自动化测试框架源代码),所以自己用javascript写了一个......
  • Selenium4.0自动化测试从入门到实践介绍
    前言:本专栏是以Selenium4.0 +Python3为基础的UI自动化测试,小编结合自己多年的工作实践经验将工作过程中对Selenium的思考、实践倾囊相授:主要包括Selenium基础用法、高级用法、测试环境切换、图表自动化、PO模式(页面对象)、关键字模式、持续集成、测试报告生成、疑难杂症等,通......
  • 如何在 Python 中从 Milesight TrafficX 摄像头、Post(MQTT、TCP/IP、HTTP) 获取数据?
    你好,祝你度过愉快的一天或一夜,我有这个MilesightTrafficX摄像头已启动并正在运行,仪表板中有一个名为POST的设置,您可以在下图中看到:我想要的是知道如何设置这些设置(基于实际上我的意思是)能够在我的Python代码中接收数据。无论协议如何,数据都将如下所示:......
  • 使用 Python 进行 Web 抓取以获取数据 NoneType ERROR
    我正在努力为我的学校项目获取美元和价格。所以我决定为此使用网络抓取,但我有一个问题。当我尝试在服务器上使用我的代码时,它给我NoneType错误。它可以在googlecolab上使用,但我无法在我的电脑或服务器上使用。我该如何解决这个问题?网页抓取代码;defdolar():he......
  • 如何将 Brave 网络浏览器与 python、selenium 和 chromedriver 结合使用?
    我从Google的Chrome切换到Brave网络浏览器并且很难让它像Chrome一样与Brave一起使用。Brave是基于Chromium的,所以我猜它应该不会那么难。我确保我的Brave和Chromedriver处于相同版本,像这样,~/some/path$chromedriver--versionChromeDriver76.0.3......
  • selenium----CSS表达式选择元素
    前面我们学习了根据id、class属性、tag名选择元素。如果我们要选择的元素没有id、class属性,或者有些我们不想选择的元素也有相同的id、class属性值,怎么办呢?这时候我们通常可以通过 CSSselector 语法选择元素。选择元素通过CSSSelector选择单个元素的方法是fin......
  • 将 chrome 更新到 127 版本后,用 selenium 编写的脚本遇到错误
    将我的chrome更新到127版本后,我所有的selenium测试脚本都开始出现错误。有人有同样的问题吗?我在其中一个问题上看到通过添加脚本options.addArguments("--disable-search-engine-choice-screen");来解决这种情况,但是我如何才能将它正确添加到我的脚本中?fromse......
  • 使用 Selenium 时的 WebDriver 错误错误:OSError: [WinError 193] %1 不是有效的 Win32
    我正在使用文档中的代码:https://pypi.org/project/webdriver-manager/#use-with-chrome安装并升级所有软件包并运行下面的代码后:fromseleniumimportwebdriverfromselenium.webdriver.chrome.serviceimportServiceasChromeServicefromwebdriver_manager.......