selenium 如何获取 session 指定的数据

发表于:2024-4-10 09:34

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:佚名    来源:51CTO博客

  代码核心在于这几个部分:
  其一:使用元素定位来获取页面上指定需要抓取的关键字;
  其二:将页面上定位得到的数据永久存储到本地文件中。
  具体来梳理一下从访问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()将浏览器窗口最大化,防止页面元素未加载出来或被遮挡而查找失败。
  3、定位搜索框
  # 通过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) 强制等待搜索内容加载出来。至此, 定位搜索框->搜索框输入关键字->回车搜索 ,整个搜索流程就完成了。
  4、调用 get_good() 方法抓取商品数据
  # 抓取商品数据
  get_good(drver)
  将抓取商品数据的具体操作步骤封装成 get_good() 方法并传入driver参数调用。
  5、退出浏览器
  # 退出关闭浏览器
  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)
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号