爬虫入门指南(4): 使用Selenium和API爬取动态网页的最佳方法

news2024/11/16 15:50:00

文章目录

  • 动态网页爬取
  • 静态网页与动态网页的区别
  • 使用Selenium实现动态网页爬取
    • Selenium 的语法及介绍
      • Selenium简介
      • 安装和配置
      • 创建WebDriver对象
        • 页面交互操作
      • 元素定位
    • 等待机制
      • 页面切换和弹窗处理
      • 截图和页面信息获取
      • 关闭WebDriver对象
  • 使用API获取动态数据
  • 未完待续....

动态网页爬取

 动态网页爬取

随着互联网的发展,许多网站开始采用动态网页来呈现内容。与传统的静态网页不同,动态网页使用JavaScript等脚本技术来实现内容的动态加载和更新。这给网页爬取带来了一定的挑战,因为传统的爬虫工具往往只能获取静态网页的内容。本文将介绍如何使用Selenium和API来实现动态网页的爬取

静态网页与动态网页的区别

静态网页与动态网页的区别

静态网页是在服务器端生成并发送给客户端的固定内容,内容在客户端展示时并不会发生变化。而动态网页则是在客户端加载和渲染过程中,通过JavaScript等脚本技术动态生成和更新内容。这使得动态网页的内容无法通过简单地下载HTML源码来获取,而需要模拟浏览器行为来执行脚本并获取最终呈现的内容。

使用Selenium实现动态网页爬取

使用Selenium实现动态网页爬取

Selenium是一个用于自动化浏览器操作的工具,它可以模拟用户在浏览器中的操作,包括点击按钮、填写表单、执行JavaScript等。以下是使用Selenium进行动态网页爬取的基本步骤:

步骤1:安装Selenium库和浏览器驱动程序
首先,我们需要安装Selenium库以及与所使用的浏览器对应的驱动程序。例如,如果使用Google Chrome浏览器,可以下载Chrome Driver并将其添加到系统路径中。

步骤2:创建WebDriver对象
在Python中,可以通过导入selenium模块,并使用相应的驱动程序创建一个WebDriver对象来控制浏览器的行为。

from selenium import webdriver

# 创建Chrome WebDriver对象
driver = webdriver.Chrome()

步骤3:加载动态网页
使用WebDriver对象的get()方法加载目标动态网页。

url = "https://example.com"  # 目标动态网页的URL
driver.get(url)

步骤4:等待动态内容加载完成
由于动态网页的加载是异步进行的,通常需要等待一段时间才能确保所有内容都已加载完成。可以使用Selenium提供的等待机制来实现。

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 等待10秒钟,直到某个元素可见
wait = WebDriverWait(driver, 10)
element = wait.until(EC.visibility_of_element_located((By.XPATH, "//div[@class='dynamic-content']")))

步骤5:获取动态内容
一旦页面加载完成,可以使用WebDriver对象的各种方法来获取动态生成的内容。例如,可以使用find_element_by_xxx()方法找到特定的元素,并使用其text属性获取文本内容。

element = driver.find_element_by_xpath("//div[@class='dynamic-content']")
content = element.text
print(content)

步骤6:关闭WebDriver对象
最后,记得关闭WebDriver对象,释放资源。

driver.quit()

Selenium 的语法及介绍

Selenium 的语法及介绍

Selenium简介

  • Selenium是一个用于自动化浏览器操作的工具。
  • 它支持多种编程语言(如Python、Java、C#等)。
  • Selenium可以模拟用户在浏览器中的行为,如点击按钮、填写表单、执行JavaScript等。

安装和配置

  • 首先,你需要安装Selenium库。可以使用pip命令在命令行中安装:pip install selenium
  • 然后,下载与所使用的浏览器对应的驱动程序。例如,如果使用Google Chrome浏览器,需要下载Chrome Driver。
  • 将驱动程序路径添加到系统路径中,以便Selenium可以找到它。

创建WebDriver对象

  • 在Python中,使用相应的驱动程序创建一个WebDriver对象。例如,使用Chrome Driver创建Chrome WebDriver对象:
    from selenium import webdriver
    driver = webdriver.Chrome()
    

页面交互操作

  1. 输入文本框中输入文本:

    • 示例:
    # 通过元素定位找到文本框元素,并输入文本 "Hello World"
    element = driver.find_element_by_id("textbox")
    element.send_keys("Hello World")
    
  2. 点击按钮:

    • 示例:
    # 通过元素定位找到按钮元素,并点击按钮
    element = driver.find_element_by_id("button")
    element.click()
    
  3. 清空文本框内容:

    • 示例:
    # 通过元素定位找到文本框元素,并清空内容
    element = driver.find_element_by_id("textbox")
    element.clear()
    
  4. 获取元素的文本内容:

    • 示例:
    # 通过元素定位找到元素,并获取元素的文本内容
    element = driver.find_element_by_id("element")
    text = element.text
    
  5. 获取元素的属性值:

    • 示例:
    # 通过元素定位找到元素,并获取元素的指定属性值
    element = driver.find_element_by_id("element")
    attribute_value = element.get_attribute("attribute_name")
    
  6. 切换到 iframe 窗口:

    • 示例:
    # 通过元素定位找到 iframe 元素,并切换到 iframe 窗口
    iframe = driver.find_element_by_id("iframe")
    driver.switch_to.frame(iframe)
    
  7. 切换回主窗口:

    • 示例:
    # 切换回主窗口
    driver.switch_to.default_content()
    
  8. 下拉框选择选项:

    • 示例:
    from selenium.webdriver.support.ui import Select
    
    # 通过元素定位找到下拉框元素
    select_element = driver.find_element_by_id("selectbox")
    
    # 创建一个 Select 对象
    select = Select(select_element)
    
    # 通过索引选择选项(索引从 0 开始)
    select.select_by_index(0)
    
    # 通过值选择选项
    select.select_by_value("option_value")
    
    # 通过可见文本选择选项
    select.select_by_visible_text("Option Text")
    
  9. 鼠标操作(鼠标移动、单击、双击):

    • 示例:
    from selenium.webdriver import ActionChains
    
    # 创建一个 ActionChains 对象
    action_chains = ActionChains(driver)
    
    # 鼠标移动到指定元素
    element = driver.find_element_by_id("element")
    action_chains.move_to_element(element).perform()
    
    # 单击指定元素
    action_chains.click(element).perform()
    
    # 双击指定元素
    action_chains.double_click(element).perform()
    
  10. 页面滚动操作:

    • 示例:
    # 滚动到指定元素可见位置
    element = driver.find_element_by_id("element")
    driver.execute_script("arguments[0].scrollIntoView();", element)
    
    # 向下滚动到页面底部
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    

元素定位

  1. 通过 ID 定位元素:

    • 示例:
    # 通过 id(username)查找元素
    element = driver.find_element_by_id("username")
    
  2. 通过 Name 定位元素:

    • 示例:
    # 通过 name(email)查找元素
    element = driver.find_element_by_name("email")
    
  3. 通过 Class Name 定位元素:

    • 示例:
    # 通过 class name 查找元素
    element = driver.find_element_by_class_name("button")
    
  4. 通过 Tag Name 定位元素:

    • 示例:
    # 通过 tag name(a)查找元素
    elements = driver.find_elements_by_tag_name("a")
    
  5. 通过 Link Text 定位元素:

    • 示例:
    # 通过链接文本(Click Here)查找链接元素
    element = driver.find_element_by_link_text("Click Here")
    
  6. 通过 Partial Link Text 定位元素:

    • 示例:
    # 通过链接文本的部分内容(Click)查找链接元素
    element = driver.find_element_by_partial_link_text("Click")
    
  7. 通过 XPath 定位元素:

    • 示例:
    # 通过 XPath(//input[@id='username'])查找元素
    element = driver.find_element_by_xpath("//input[@id='username']")
    
  8. 通过 CSS Selector 定位元素:

    • 示例:
    # 通过 CSS Selector(input#username)查找元素
    element = driver.find_element_by_css_selector("input#username")
    
  9. 通过 Tag Name 和索引定位元素:

    • 示例:
    # 通过 tag name(input)和索引(0)查找第一个输入框元素
    element = driver.find_elements_by_tag_name("input")[0]
    
  10. 通过父子关系定位元素:

  • 示例:
 # 通过父元素(div)和子元素的 tag name(input)查找输入框元素
   parent_element = driver.find_element_by_tag_name("div")
   element = parent_element.find_element_by_tag_name("input")

等待机制

等待机制

动态网页加载过程是异步的,所以需要使用等待机制来确保页面上的元素已经加载完成。

  • Selenium提供了等待机制,如WebDriverWait类和expected_conditions模块,可以设置等待时间和条件。
  • 例如,使用visibility_of_element_located()方法等待某个元素可见。
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    wait = WebDriverWait(driver, 10)
    element = wait.until(EC.visibility_of_element_located((By.XPATH, "//div[@class='dynamic-content']")))
    

页面切换和弹窗处理

  • 在页面交互过程中,可能需要切换到其他窗口、帧或处理弹窗。
  • 使用switch_to对象可以实现这些操作。
  • 例如,使用switch_to.window()方法切换到新打开的窗口。
    # 获取所有窗口句柄
    window_handles = driver.window_handles
    
    # 切换到最新打开的窗口
    driver.switch_to.window(window_handles[-1])
    

截图和页面信息获取

  • Selenium可以截取当前浏览器窗口的截图,并获取页面信息。
  • 使用driver.save_screenshot()方法进行截图,并使用driver.page_source属性获取页面源码。
  • 例如,保存截图并获取页面源码:
    driver.save_screenshot("screenshot.png")
    page_source = driver.page_source
    

关闭WebDriver对象

  • 最后,记得关闭WebDriver对象以释放资源。
  • 使用driver.quit()方法关闭WebDriver对象。
    driver.quit()
    

使用API获取动态数据

除了使用Selenium模拟浏览器操作来获取动态网页的内容之外,有些网站也提供了API接口,通过调用该接口可以直接获取动态数据。这种方式通常比使用Selenium更加高效和稳定。

要使用API获取动态数据,首先需要查找目标网站是否提供了相应的API接口,并了解其请求方式和参数。然后可以使用Python的requests库发送HTTP请求,并解析返回的JSON数据。

示例代码:

import requests

url = "https:api.example.com/data"  # API接口URL
params = {"param1": "value1", "param2": "value2"}  # 请求参数

response = requests.get(url, params=params)
data = response.json()

# 处理返回的数据
for item in data["items"]:
    print(item["name"])

在实际使用中,需要根据具体的API接口文档来设置请求方式、参数和头部信息,并根据返回的数据结构进行相应的处理。

未完待续…

未完待续....

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/706103.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM-垃圾回收-基础知识

基础知识 什么是垃圾 简单说就是没有被任何引用指向的对象就是垃圾。后面会有详细说明。 和C的区别 java:GC处理垃圾,开发效率高,执行效率低 C:手工处理垃圾,如果忘记回收,会导致内存泄漏问题。如果回…

Linux Mint 21.2“Victoria”Beta 发布

导读近日消息,Beta 版 Linux Mint 21.2 “Victoria” 于今天发布,用户可以访问官网下载镜像。 Linux Mint 21.2 代号 “Victoria” ,基于 Canonical 长期支持的 Ubuntu 22.04 LTS(Jammy Jellyfish)操作系统&#xff0…

2023年第三届工业自动化、机器人与控制工程国际会议

会议简介 Brief Introduction 2023年第三届工业自动化、机器人与控制工程国际会议(IARCE 2023) 会议时间:2023年10月27 -30日 召开地点:中国成都 大会官网:www.iarce.org 2023年第三届工业自动化、机器人与控制工程国际…

JAVA http

javahttp 请求数据格式servletservlet生命周期servletrequest获取请求数据解决乱码response相应字符&字节数据 请求数据格式 servlet servlet生命周期 servlet request获取请求数据 解决乱码 response相应字符&字节数据 response.setHeader("content-type",…

A. Portal(dp优化枚举)

Problem - 1580A - Codeforces CQXYM发现了一个大小为nm的矩形。矩形由n行m列的方块组成,每个方块可以是黑曜石方块或空方块。CQXYM可以通过一次操作将黑曜石方块变为空方块,或将空方块变为黑曜石方块。 一个大小为ab的矩形M被称为传送门,当…

【Linux】程序员的基本素养学习

这是目录 写在前面一、内存管理1、分段2、分页 二、线程管理三、静态库1、编译1.1、预处理1.2、编译1.3、汇编1.4、链接2、编译器3、目标文件**.text****.data****.bss****__attribute__** 3.1、符号3.2、兼容C语言 -- extern C4、链接 -- ld 写在前面 本文记录自己的学习生涯…

五.组合数据类型

目录 1、数组类型 声明数组 初始化数组 数组赋值 访问数组元素 2、切片类型 1、定义切片 2、切片初始化 3、访问 4、空(nil)切片 5、切片的增删改查操作: 3、指针类型 1、什么是指针 2、如何使用指针、指针使用流程: 3、Go 空指针 4、指…

chatgpt赋能python:如何将Python打包-一个SEO优化指南

如何将Python打包 - 一个SEO优化指南 作为一名拥有10年Python编程经验的工程师,我意识到很多Python开发者面临一个共同的问题:如何将他们的Python项目打包并发布到PyPI上?打包一个Python项目不仅可以让您的代码更加组织化,也可以…

如何拆分PDF?拆分PDF软件分享!​

那么如何拆分PDF?PDF是一种流行的电子文档格式,它可以在不同的操作系统和设备上进行查看和共享,而不会因为不同的软件或硬件而出现兼容性问题。同时,在使用的过程中,PDF拆分PDF文件是一个比较常见的需求,它…

threejs入门

个人博客地址: https://cxx001.gitee.io 前言 随着HTML5的发布,我们可以通过WebGL在浏览器上直接使用显卡资源来创建高性能的二维和三维图形,但是直接使用WebGL编程来创建三维场景十分复杂而且还容易出问题。而使用Three.js库可以简化这个过程&#xff…

机器学习——决策树1(三种算法)

要开始了…内心还是有些复杂的 因为涉及到熵…单纯的熵,可以单纯 复杂的熵,如何能通俗理解呢… 我也没有底气,且写且思考吧 1. 决策树分类思想 首先,决策树的思想,有点儿像KNN里的KD树。 KNN里的KD树,是每…

如何将非平稳的时间序列变为平稳的时间序列?

可以采用现代信号处理算法,比如小波分解,经验模态分解,变分模态分解等算法。 以经济金融领域的数据为例,经济金融领域的数据作为一种时间序列,和我们平常工程领域分析的信号具有相同特性。一般来说,信号是…

在 Maya、ZBrush 和 Arnold 中重塑来自邪恶西部的 Edgar Gravenor

今天瑞云渲染小编给大家带来Giancarlo Penton 介绍的Edgar Gravenor项目背后过程,展示了皮肤纹理和头发是如何制作的,并解释了详细的服装是如何设置的。 介绍 大家好,我的名字是Giancarlo Penton。我是一名3D角色艺术家,最近毕业…

从零开始 Spring Boot 53:JPA 属性转换器

从零开始 Spring Boot 53:JPA 属性转换器 图源:简书 (jianshu.com) 这篇文章介绍如何在 JPA(Hibernate)中使用属性转换器。 在前篇文章中,我介绍了如何使用Embedded和Embeddable将一个类型嵌入实体类,并映…

初识mysql之表内容的增删查改

目录 一、插入 1. 插入基础语法 2. 单行数据 全列插入 3. 多行数据 全列插入 4. 插入,失败则更新 5. 替换 二、基础查询 1. 查询基础语法 2. 全列查询 3. 指定列查询 4. 表达式查询 5. 结果去重 6. where条件 6.1 比较运算符与逻辑运算符 6.2 查询…

爬虫入门指南(5): 分布式爬虫与并发控制 【提高爬取效率与请求合理性控制的实现方法】

文章目录 前言多线程与多进程多线程多进程多线程和多进程的选择 使用Scrapy框架实现分布式爬虫1. 创建Scrapy项目2. 配置Scrapy-Redis3. 创建爬虫4. 启动爬虫节点5. 添加任务到队列 并发控制与限制请求频率并发控制限制请求频率 未完待续... 前言 在进行爬虫任务时,…

STM32外设系列—红外遥控

文章目录 一、红外遥控简介二、红外遥控的原理三、二进制脉冲编码3.1 NEC码的位定义3.2 NEC遥控指令的数据格式 四、红外遥控程序设计思路五、红外遥控程序设计5.1 红外遥控初始化程序5.2 记录高电平持续时间函数5.3 中断服务函数5.4 读取键值5.5 参数定义 六、应用实例 一、红…

ADB原理,常用命令汇总及示例

一. ADB简介 ADB,即 Android Debug Bridge 是一种允许模拟器或已连接的 Android 设备进行通信的命令行工具,它可为各种设备操作提供便利,如安装和调试应用,并提供对 Unix shell(可用来在模拟器或连接的设备上运行各种…

基于Java+SpringBoot+vue的食品安全管理系统设计与实现

博主介绍:✌擅长Java、微信小程序、Python、Android等,专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟 Java项目精品实战案…

基于Java+Vue前后端分离网络教学平台设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…