selenium 如何获取 session 指定的数据

代码核心在于这几个部分:

  其一:使用元素定位来获取页面上指定需要抓取的关键字;

  其二:将页面上定位得到的数据永久存储到本地文件中。

  具体来梳理一下从访问URL开始到爬取数据整个流程下来的各个节点我们都做了哪些工作。

  我们来看看spider()方法里面具体做了哪些事情:

  spider() 方法实现

  1、创建浏览器对象

# 创建浏览器对象
  drver = webdriver.Chrome()

 

通过 webdriver.Chrome() 创建浏览器对象后,会自动启动并打开Chrome浏览器。在 Chrome() 方法中未传入任何参数,即使用默认参数 executable_path="chromedriver" ,executable_path表示的是Chrome浏览器驱动的位置,该参数默认浏览器驱动的位置是在Python安装目录下。如果你的浏览器驱动位置与默认位置不同,则 executable_path 参数需要传入驱动的实际位置。

2、访问URL地址

 # 浏览器访问地址
  drver.get(url)

 打开浏览器后driver调用get(url) 方法在地址栏中访问该网址。

3、隐式等待、最大化浏览器窗口

# 隐式等待,确保动态内容节点被完全加载出来——时间感受不到
  drver.implicitly_wait(3)
  # 最大化浏览器窗口,主要是防止内容被遮挡
  drver.maximize_window()

先使用 implicitly_wait() 方法隐式等待浏览器将页面完全加载出来,再使用maximize_window()将浏览器窗口最大化,防止页面元素未加载出来或被遮挡而查找失败。

4、定位搜索框

 # 通过id=key定位到搜索框
  input_search = drver.find_element_by_id('key')
  # 在输入框中输入“口罩”
  input_search.send_keys(keyword)
  # 模拟键盘回车Enter操作进行搜索
  input_search.send_keys(Keys.ENTER)
  # 强制等待3秒
  sleep(3)

driver 先调用 find_element_by_id('key') 通过ID定位到该搜索框,再调用 sent_keys() 传入参数搜索关键字 keyword ,然后在sent_keys() 中传入 Keys.ENTER 模拟键盘回车键,最后再调用 sleep(3) 强制等待搜索内容加载出来。至此, 定位搜索框->搜索框输入关键字->回车搜索 ,整个搜索流程就完成了。

5、调用 get_good() 方法抓取商品数据

# 抓取商品数据
  get_good(drver)

 将抓取商品数据的具体操作步骤封装成 get_good() 方法并传入driver参数调用。

6、退出浏览器

# 退出关闭浏览器
  drver.quit()

 抓取完商品数据后就可以直接将浏览器关闭,释放资源了。这就是整个爬取的过程,而抓取数据的过程再接着继续分析。

  get_good() 方法实现

  完整代码

  # -*- coding: utf-8 -*-
  # @Time : 2021/10/26 17:35
  # @Author : Jane
  # @Software: PyCharm
  # 导入库
  from time import sleep
  from selenium import webdriver
  from selenium.webdriver.common.keys import Keys # 键盘按键操作
  from os import path
  def spider(url, keyword):
      # 创建浏览器对象
      drver = webdriver.Chrome()
      # 浏览器访问地址
      drver.get(url)
      # 隐式等待,确保动态内容节点被完全加载出来——时间感受不到
      drver.implicitly_wait(3)
      # 最大化浏览器窗口,主要是防止内容被遮挡
      drver.maximize_window()
      # 通过id=key定位到搜索框
      input_search = drver.find_element_by_id('key')
      # 在输入框中输入“口罩”
      input_search.send_keys(keyword)
      # 模拟键盘回车Enter操作进行搜索
      input_search.send_keys(Keys.ENTER)
      # 强制等待3秒
      sleep(3)
      # 抓取商品数据
      get_good(drver)
      # 退出关闭浏览器
      drver.quit()
  # 抓取商品数据
  def get_good(driver):
      # 获取当前第一页所有商品的li标签
      goods = driver.find_elements_by_class_name('gl-item')
      for good in goods:
          # 获取商品链接
          link = good.find_element_by_tag_name('a').get_attribute('href')
          # 获取商品标题名称
          title = good.find_element_by_css_selector('.p-name em').text.replace('\n', '')
          # 获取商品价格
          price = good.find_element_by_css_selector('.p-price strong').text.replace('\n', '')
          # 获取商品评价数量
          commit = good.find_element_by_css_selector('.p-commit a').text
          # 格式化商品信息
          msg = '''
              商品:%s
              链接:%s
              价格:%s
              评论:%s
          '''%(title, link, price, commit)
          # 保存商品数据到txt文件中
          saveTXT(msg)
  # 保存商品数据到txt文件中
  def saveTXT(msg):
      # 获取当前文件路径
      paths = path.dirname(__file__)
      # 将当前文件路径与文件名拼接起来作为商品数据的存储路径
      file = path.join(paths, 'good_data.txt')
      # 以追加写入的方式将商品数据保存到文件中
      with open(file, 'a+', encoding='utf-8') as wf:
          wf.write(msg)
  # 判断文件程序入口
  if __name__ == '__main__':
  # 京东商城网址
      url = 'https://www.jd.com/'
      # 搜索关键字“女士编包”
      keyword = '女士包包'
      # 爬取数据
      spider(url, keyword)

 将数据存储到CSV文件中

 # -*- coding: utf-8 -*-
  # @Time : 2021/10/26 17:35
  # @Author : Jane
  # @Software: PyCharm
  # 导入库
  from time import sleep
  from selenium import webdriver
  from selenium.webdriver.common.keys import Keys # 键盘按键操作
  from os import path
  import csv
  def spider(url, keyword):
      # 创建浏览器对象
      drver = webdriver.Chrome()
      # 浏览器访问地址
      drver.get(url)
      # 隐式等待,确保动态内容节点被完全加载出来——时间感受不到
      drver.implicitly_wait(3)
      # 最大化浏览器窗口,主要是防止内容被遮挡
      drver.maximize_window()
      # 通过id=key定位到搜索框
      input_search = drver.find_element_by_id('key')
      # 在输入框中输入“口罩”
      input_search.send_keys(keyword)
      # 模拟键盘回车Enter操作进行搜索
      input_search.send_keys(Keys.ENTER)
      # 强制等待3秒
      sleep(3)
      # 抓取商品数据
      get_good(drver)
      # 退出关闭浏览器
      drver.quit()
  # 抓取商品数据
  def get_good(driver):
      # 获取当前第一页所有商品的li标签
      goods = driver.find_elements_by_class_name('gl-item')
      data = []
      for good in goods:
          # 获取商品链接
          link = good.find_element_by_tag_name('a').get_attribute('href')
          # 获取商品标题名称
          title = good.find_element_by_css_selector('.p-name em').text.replace('\n', '')
          # 获取商品价格
          price = good.find_element_by_css_selector('.p-price strong').text.replace('\n', '')
          # 获取商品评价数量
          commit = good.find_element_by_css_selector('.p-commit a').text
          # 将商品数据存入字典
          good_data = {
              '商品标题':title,
              '商品价格':price,
              '商品链接':link,
              '评论量':commit
          }
          data.append(good_data)
      saveCSV(data)
  # 保存商品数据到CSV文件中
  def saveCSV(data):
      # 表头
      header = ['商品标题', '商品价格', '商品链接', '评论量']
      # 获取当前文件路径
      paths = path.dirname(__file__)
      # 将当前文件路径与文件名拼接起来作为商品数据的存储路径
      file = path.join(paths, 'good_data.csv')
      # 以追加写入的方式将商品数据保存到文件中
      with open(file, 'a+', encoding='utf-8', newline='') as wf:
          f_csv = csv.DictWriter(wf, header)
          f_csv.writeheader()
          f_csv.writerows(data)
  # 判断文件程序入口
  if __name__ == '__main__':
      # 京东商城网址
      url = 'https://www.jd.com/'
      # 搜索关键字“女士编包”
      keyword = '女士包包'
      # 爬取数据
      spider(url, keyword)

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

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

 

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

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

相关文章

C语言——详解字符函数和字符串函数(二)

Hi,铁子们好呀!之前博主给大家简单地介绍了部分字符和字符串函数,那么这次,博主将会把这些字符串函数给大家依次讲完! 今天讲的具体内容如下: 文章目录 6.strcmp函数的使用及模拟实现6.1 strcmp函数介绍和基本使用6.1.1 strcmp函…

Vulnhub靶机练习笔记-Os-hackNos-1

vulnhub靶机下载 https://www.vulnhub.com/entry/hacknos-os-hacknos,401/ 靶场环境: NAT模式 kali:192.168.242.131 靶机:192.168.242.142 渗透 nmap探测靶机 开放了80和22端口 dirsearch对80端口进行目录扫描,发现drupal…

nacos derby.log无法的读取+derby数据库启动失败分析解决

排查思路分析 日志报错: derby.log文件权限不够(root权限),无法读取,我用普通用户启动。 使用命令chown xx:xx derby.log修改属主和属组为普通用户后,又报出其他错误。 数据库启动不了,无…

图片怎么批量改格式png改jpg?一键批量搞定方法

在创建幻灯片或演示文稿时,使用jpg格式可以减小文件大小,方便分享和传输。转换png格式的图片为jpg,可以确保文件大小的合理控制,同时保持图像的可视质量,当遇到需要批量处理的时候,许多小伙伴都不太懂图片怎…

鸿蒙OS开发学习:【尺寸适配实现】

概述 在鸿蒙开发中,尺寸适配是一个重要的概念,它可以帮助我们在不同屏幕尺寸的设备上正确显示和布局我们的应用程序。本文将介绍如何在鸿蒙开发中实现尺寸适配的方法。 流程图 详细步骤 1. 定义适配方案 在鸿蒙开发中,我们可以通过定义适…

基于springboot+vue实现的的成人教育教务系统

作者主页:Java码库 主营内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】:Java 【框架】:spring…

Windows Nginx 启动

先解压 nginx安装包,进入到安装目录下(配置环境变量没有用) 解压后的目录结构如上。 #启动服务 默认是80端口, #如果端口被占用,是启动不了的,会生成error log在log目录下 start nginx#停止nginx 服务 nginx -s stop#重新加载配置…

C语言进阶课程学习记录-第29课 - 指针和数组分析(下)

C语言进阶课程学习记录-第29课 - 指针和数组分析(下) 数组名与指针实验-数组形式转换实验-数组名与指针的差异实验-转化后数组名加一的比较实验-数组名作为函数形参小结 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程,图片全部来源于课…

数字社会下的智慧公厕:构筑智慧城市的重要组成部分

智慧城市已经成为现代城市发展的趋势,而其中的数字化转型更是推动未来社会治理体系和治理能力现代化的必然要求。在智慧城市建设中,智慧公厕作为一种新形态的信息化公共厕所,扮演着重要角色。本文智慧公厕源头实力厂家广州中期科技有限公司&a…

线圈大小的测量和圈数的绕制办法

测量一根线圈的大小,让线圈多出来一公分多一点!!! 我在这简称样圈 然后在模具上进行绕制。 把样圈放在模具上,松紧度要刚好,确定好模具 具体位置 线记在 中间铁心上 开始绕制 这叫做一圈 绕好相应的圈数后…

如何通过代码混淆绕过苹果机审,解决APP被拒问题

目录 iOS代码混淆 功能分析 实现流程 类名修改 方法名修改 生成垃圾代码 替换png等静态资源MD5 info.plist文件添加垃圾字段 功能分析 实现流程 类名修改 方法名修改 生成垃圾代码 替换png等静态资源MD5 info.plist文件添加垃圾字段 混淆前后对比 iOS代码混淆 …

自定义树形筛选选择组件

先上效果图 思路:刚开始最上面我用了el-input,选择框里面内容用了el-inputel-tree使用,但后面发现最上面那个可以输入,那岂不是可以不需要下拉就可以使用,岂不是违背了写这个组件的初衷,所以后面改成div自定…

【ZZULIOJ】1053: 正弦函数(Java)

目录 题目描述 输入 输出 样例输入 Copy 样例输出 Copy code 题目描述 输入x,计算上面公式的前10项和。 输入 输入一个实数x。 输出 输出一个实数,即数列的前10项和,结果保留3位小数。 样例输入 Copy 1 样例输出 Copy 0.841 c…

求三角形面积(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> # include <math.h>int main() {//初始化变量值&#xff1b;double a, b, c, s, area;//赋值&#xff1b;a 3.67;b 5.43;c 6.21;//运算求s&#xff1b…

快速掌握SpringBoot多环境开发

多环境开发 在一个项目当中可能同一套代码需要用于多种环境进行不同的用途例如&#xff1a;生产环境&#xff0c;开发环境&#xff0c;测试环境&#xff0c;需要通过配置进行不同环境的开发切换&#xff1a; spring:profiles:active: shengchan # 通过属性active进行选择 …

二阶巴特沃兹滤波器的数字推导

二阶巴特沃兹滤波器的数字推导 原型双线性变换no warpper双线性变换warpper或者 参考 原型 H ( s ) Ω c 2 s 2 2 ∗ Ω ∗ s Ω c 2 H(s)\frac{\Omega_c^2}{s^2\sqrt{2}*\Omega * s\Omega_c^2} H(s)s22 ​∗Ω∗sΩc2​Ωc2​​ 双线性变换no warpper Ω c ω c T \Omega…

Elastic:加速生成式人工智能体验

作者&#xff1a;Matt Riley 搜索驱动的人工智能和开发人员工具专为速度和规模而打造。 在大型语言模型&#xff08;LLM&#xff09;和生成式 AI 的每日突破中&#xff0c;开发者站在了这场运动的最前沿&#xff0c;影响着它的方向和可能性。在这篇博客中&#xff0c;我将分享…

STL容器之unordered_map类

文章目录 STL容器之unordered_map类1、unordered_map1.1、unordered_map介绍1.2、unordered_map的使用1.2.1、unordered_map的常见构造1.2.2、unordered_map的迭代器1.2.3、unordered_map的容量1.2.4、unordered_map的增删查1.2.5、unordered_map的桶操作 2、unordered_multima…

白盒测试-条件覆盖

​ 条件覆盖是指运行代码进行测试时&#xff0c;程序中所有判断语句中的条件取值为真值为假的情况都被覆盖到&#xff0c;即每个判断语句的所有条件取真值和假值的情况都至少被经历过一次。 ​ 条件覆盖率的计算方法为&#xff1a;测试时覆盖到的条件语句真、假情况的总数 / 程…

redis开源协议变更了?我们还能用吗?

Redis是一款广泛使用的开源键值存储数据库&#xff0c;其开源协议的变更引起了社区和行业的广泛关注。根据搜索结果&#xff0c;Redis Labs宣布Redis将采用双重源代码可用许可证&#xff08;RSALv2&#xff09;和服务器端公共许可证&#xff08;SSPLv1&#xff09;&#xff0c;…