使用Selenium爬取动态表格中的多语言和编码格式

news2024/11/26 10:33:47

正文

Selenium是一个用于自动化Web浏览器的工具,它可以模拟用户的操作,如点击、输入、滚动等。Selenium也可以用于爬取网页中的数据,特别是对于那些动态生成的内容,如表格、图表、下拉菜单等。本文将介绍如何使用Selenium Python爬取一个动态表格中的多语言和编码格式的数据,并将其保存为CSV文件。

特点

·Selenium可以处理JavaScript渲染的网页,而不需要额外的库或工具。

· Selenium可以支持多种浏览器,如Chrome、Firefox、Edge等,只需要安装相应的驱动程序。

· Selenium可以模拟用户的交互行为,如点击、滑动、拖拽等,以获取更多的数据或触发事件。

· Selenium可以使用XPath、CSS选择器等定位元素,以提取所需的数据。

· Selenium可以处理多语言和编码格式的数据,如中文、日文、UTF-8等,只需要设置相应的参数。

案例

假设我们要爬取一个网站上的一个动态表格,该表格显示了不同国家和地区的人口数据

· 表格是动态生成的,每隔一段时间就会更新数据。

· 表格有分页功能,每页显示10行数据,共有5页。

· 表格有多语言选项,可以切换显示英文或中文。

· 表格有编码格式选项,可以切换显示UTF-8或GBK。

我们的目标是爬取该表格中所有的数据,并将其保存为CSV文件,同时保留多语言和编码格式的信息。

为了实现这个目标,我们需要以下步骤:

· 导入所需的库和模块,如selenium、csv、time等。

· 创建一个webdriver对象,指定使用firefox浏览器,并设置代理服务器和验证信息。

· 打开目标网址,并等待页面加载完成。

· 定位表格元素,并获取表头和表体的数据。

· 循环点击分页按钮,并获取每一页的数据。

· 切换语言选项,并重复步骤4和5。

· 切换编码格式选项,并重复步骤4和5。

· 将所有数据保存为CSV文件,并关闭浏览器。

代码

下面是根据上述步骤实现的代码:

 # 导入所需的库和模块
  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 csv
  import time
  # 创建一个webdriver对象,指定使用firefox浏览器,并设置代理服务器和验证信息
  # 亿牛云 爬虫代理加强版 
  proxyHost = "www.16yun.cn"
  proxyPort = "3111"
  proxyUser = "16YUN"
  proxyPass = "16IP"
  profile = webdriver.FirefoxProfile()
  profile.set_preference("network.proxy.type", 1)
  profile.set_preference("network.proxy.http", proxyHost)
  profile.set_preference("network.proxy.http_port", int(proxyPort))
  profile.set_preference("network.proxy.ssl", proxyHost)
  profile.set_preference("network.proxy.ssl_port", int(proxyPort))
  profile.set_preference("network.proxy.no_proxies_on", "localhost, 127.0.0.1")
  profile.update_preferences()
  driver = webdriver.Firefox(firefox_profile=profile)
  # 打开目标网址,并等待页面加载完成
  url = "https://example.com/population-table"
  driver.get(url)
  wait = WebDriverWait(driver, 10)
  wait.until(EC.presence_of_element_located((By.ID, "table")))
  # 定义一个函数,用于获取表格中的数据
  def get_table_data():
      # 定位表格元素,并获取表头和表体的数据
      table = driver.find_element_by_id("table")
      header = table.find_element_by_tag_name("thead")
      header_data = [item.text for item in header.find_elements_by_tag_name("th")]
      body = table.find_element_by_tag_name("tbody")
      body_data = []
      rows = body.find_elements_by_tag_name("tr")
      for row in rows:
          cols = row.find_elements_by_tag_name("td")
          cols_data = [item.text for item in cols]
          body_data.append(cols_data)
      # 返回表头和表体的数据
      return header_data, body_data
  # 定义一个列表,用于存储所有的数据
  all_data = []
  # 循环点击分页按钮,并获取每一页的数据
  pages = driver.find_elements_by_class_name("page-item")
  for page in pages:
      page.click()
      time.sleep(1)
      header_data, body_data = get_table_data()
      all_data.extend(body_data)
  # 切换语言选项,并重复步骤4和5
  language = driver.find_element_by_id("language")
  language.click()
  time.sleep(1)
  pages = driver.find_elements_by_class_name("page-item")
  for page in pages:
      page.click()
      time.sleep(1)
      header_data, body_data = get_table_data()
      all_data.extend(body_data)
  # 切换编码格式选项,并重复步骤4和5
  encoding = driver.find_element_by_id("encoding")
  encoding.click()
  time.sleep(1)
  pages = driver.find_elements_by_class_name("page-item")
  for page in pages:
      page.click()
      time.sleep(1)
      header_data, body_data = get_table_data()
      all_data.extend(body_data)
  # 将所有数据保存为CSV文件,并关闭浏览器
  with open("population.csv", "w", newline="", encoding="utf-8") as f:
      writer = csv.writer(f)
      writer.writerow(header_data)
      writer.writerows(all_data)
  driver.quit()

代码说明

第1行到第8行,导入所需的库和模块,如selenium、csv、time等。

第10行到第24行,创建一个webdriver对象,指定使用firefox浏览器,并设置代理服务器和验证信息,这是为了防止被目标网站屏蔽或限制访问。

第26行到第29行,打开目标网址,并等待页面加载完成,这是为了确保表格元素已经出现在页面上。

第31行到第44行,定义一个函数,用于获取表格中的数据,该函数接受无参数,返回两个列表,分别是表头和表体的数据。函数内部使用XPath定位表格元素,并使用列表推导式提取每个单元格的文本内容。

第46行,定义一个列表,用于存储所有的数据,该列表将包含多语言和编码格式的数据。

第48行到第53行,循环点击分页按钮,并获取每一页的数据,这是为了爬取表格中所有的数据。使用find_elements_by_class_name方法定位分页按钮,并使用click方法模拟点击。每次点击后,使用time.sleep方法等待1秒,以确保页面更新完成。然后调用get_table_data函数获取当前页面的数据,并使用extend方法将其添加到all_data列表中。

第55行到第61行,切换语言选项,并重复步骤4和5,这是为了爬取表格中不同语言的数据。使用find_element_by_id方法定位语言选项,并使用click方法模拟点击。每次点击后,使用time.sleep方法等待1秒,以确保页面更新完成。然后重复步骤4和5的操作。

第63行到第69行,切换编码格式选项,并重复步骤4和5,这是为了爬取表格中不同编码格式的数据。使用find_element_by_id方法定位编码格式选项,并使用click方法模拟点击。

结语

本文介绍了如何使用Selenium Python爬取一个动态表格中的多语言和编码格式的数据,并将其保存为CSV文件。通过使用Selenium,我们可以处理JavaScript渲染的网页,支持多种浏览器,模拟用户的交互行为,定位元素,提取数据,处理多语言和编码格式等。Selenium是一个强大而灵活的工具,可以用于各种Web爬虫的场景。希望本文对你有所帮助和启发。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取 

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

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

相关文章

Jmeter 如何才能做好接口测试?

现在对测试人员的要求越来越高,不仅仅要做好功能测试,对接口测试的需求也越来越多! 所以也越来越多的同学问,怎样才能做好接口测试? 要真正的做好接口测试,并且弄懂如何测试接口,需要从如下几…

JZ36 二叉搜索树与双向链表

问题描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。 问题要求: 1.要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指 针需要指向前驱,树中节点…

“MyBatis进阶:分页与特殊字符处理“

目录 引言1. MyBatis的分页1.1 分页原理1.2 使用插件实现分页 2. MyBatis中特殊字符处理2.1 特殊字符的问题2.2 使用转义字符 总结 引言 在使用MyBatis进行数据库操作时,我们经常会遇到一些高级的需求,例如分页查询和特殊字符处理。本文将深入探讨如何在…

面试题(二)

目录 一.集合 (1) LinkedHashMap(JDK 1.8) (2) ArrayList (3) HashMap (4) ConcurrentHashMap 二. IO流 (1) 分类 (2) 应用 三.多线程 (1) 线程状态 (2) 死锁 (3) 应用 (4) 要点 (5) 线程池 返回 ThreadPoolExecutor 类分析 线程池原理分析 四. 数据库 (1) …

聚水潭无需API开发连接伙伴云,实现新增订单信息自动同步到表单汇总

聚水潭用户使用场景: 电商行业通常使用聚水潭作为企业的ERP系统。然而,每当聚水潭产生新订单时,企业人员常常需要将订单信息手动复制并录入到伙伴云存储、汇总,包括订单单号、状态、金额等20多项信息。这种人工手动复制和录入的方…

接口文档管理解决方案调研及Torna+Smart-doc的使用

文章目录 一、现状二、需求三、调研Swagger官方地址介绍 Knife4j官方地址介绍 Apifox官方地址介绍 Smart-doc Torna官方地址介绍 EasyYapi Yapi官方地址介绍 四、对比(一)Swagger1、部署方式2、优点3、缺点4、分享方式 (二)Knif…

心电芯片ADS1291的国产替代芯片LH001-91

2023年,在全球芯片市场的紧张局势下,国外芯片的价格和货量也随着时局的影响而变化,价格相对来说明会变得高昂。在此种大背景下,模拟芯片与GPU芯片都曾是最为紧缺的种类,并且价格也是高昂且不稳定,有时下了订…

档案库房温湿度调节的一些方法【经验】

1.前言背景 档案的寿命与档案库房的温湿度密切相关。不适宜的温湿度不仅可单独地作用于档案,而且可加速其他因素对档案的破坏。为了使档案库房的温湿度等符合档案的要求,需采取一定的措施,即对档案库房的温湿度进行控制与调节。 档案库房的…

月活近千万,连续 365 天无故障:货拉拉怎么做稳定性指标度量?

一分钟精华速览 每一位被故障折磨的稳定性负责人,都或多或少面临自证的困境:如何证明今年的稳定性工作是出色的?在无法完全避免故障发生的前提下,如何证明稳定性保障工作的价值?在团队和工具尚不完备时,如…

17.2.4 【Linux】通过systemctl分析各服务之间的相依性

使用list-dependencies时,所列出的default.target其实是muli-user.target的内容。multi-user.target 其实还会用到 basic.target getty.target remote-fs.target 三大项目, 而 basic.target 又用到了 sockets.target sysinit.target timers.target。 r…

使用Termux在安卓手机上搭建Hexo博客网站,并发布到公网访问

文章目录 1. 安装 Hexo2. 安装cpolar内网穿透3. 公网远程访问4. 固定公网地址 Hexo 是一个用 Nodejs 编写的快速、简洁且高效的博客框架。Hexo 使用 Markdown 解析文章,在几秒内,即可利用靓丽的主题生成静态网页。 下面介绍在Termux中安装个人hexo博客并…

Python requests实现图片上传接口自动化测试

最近帮别人写个小需求,需要本地自动化截图,然后图片自动化上传到又拍云,实现自动截图非常简单,在这里就不详细介绍了,主要和大家写下,如何通过Pythonrequests实现上传本地图片到又拍云服务器。 话不多说&a…

电商小白必看:如何快速批量查询快递物流信息?

随着电商行业的不断发展,快递订单的数量也在持续增加。对于物流公司和商家来说,查询快递订单的速度和效率是非常重要的。而如果每次只能查询一个快递订单,无疑是一种低效的方式。那么有没有一种方法可以一次性批量查询数万个快递订单号呢&…

若依前后端分离版本项目总结笔记

若依前后端分离学习笔试 1.路由问题 注意这个是前端找到你的路由的路径。 2.表格开关按钮快速实现 <el-table-column label"状态" align"center" key"status"><template slot-scope"scope"><el-switchv-model"s…

笔记汇总2(中断、GDB、编程实例)

前言 本文主要是一些学习笔记的汇总&#xff0c;主要参考公众号&#xff1a;嵌入式与Linux那些事&#xff0c;GDB多线程调试&#xff0c;自实现unique_ptr,share_ptr&#xff0c;宏&#xff0c;线程池仅供自己学习使用。 中断与异常有何区别? 中断是指外部硬件产生的一个电信…

【Linux】socket编程(二)

目录 前言 TCP通信流程 TCP通信的代码实现 tcp_server.hpp编写 tcp_server.cc服务端的编写 tcp_client.cc客户端的编写 整体代码 前言 上一章我们主要讲解了UDP之间的通信&#xff0c;本章我们将来讲述如何使用TCP来进行网络间通信&#xff0c;主要是使用socket API进…

whisper 语音识别项目部署

1.安装anaconda软件 在如下网盘免费获取软件&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1zOZCQOeiDhx6ebHh5zNasA 提取码&#xff1a;hfnd 2.使用conda命令创建python3.8环境 conda create -n whisper python3.83.进入whisper虚拟环境 conda activate whisper4.…

MyBatis的核心技术掌握---分页功能,详细易懂(下)

目录 一.前言 二.MyBatis 的分页 三.MyBatis 的特殊字符处理 一.前言 继上篇MyBatis 的文章&#xff0c;我们继续来学习MyBatis吧&#xff01;&#xff01;&#xff01; 上篇的博客链接&#xff1a; http://t.csdn.cn/5iUEDhttp://t.csdn.cn/5iUED 接下来进…

什么是梯度下降

什么是梯度下降 根据已有数据的分布来预测可能的新数据&#xff0c;这是回归 希望有一条线将数据分割成不同类别&#xff0c;这是分类 无论回归还是分类&#xff0c;我们的目的都是让搭建好的模型尽可能的模拟已有的数据 除了模型的结构&#xff0c;决定模型能否模拟成功的关键…

电商项目part05 分布式ID服务实战

背景 日常开发中&#xff0c;需要对系统中的各种数据使用 ID 唯一表示&#xff0c;比如用户 ID 对应且仅对应一个人&#xff0c;商品 ID 对应且仅对应一件商品&#xff0c;订单 ID 对应且仅对应 一个订单。现实生活中也有各种 ID&#xff0c;比如身份证 ID 对应且仅对应一个人…