Python学习之路-爬虫提高:selenium

news/2024/7/19 10:19:42 标签: python, 学习, 爬虫

Python学习之路-爬虫提高:selenium

什么是selenium

Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器),可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏

PhantomJS的介绍

PhantomJS 是一个基于Webkit的“无界面”(headless)浏览器,它会把网站加载到内存并执行页面上的 JavaScript

  • 下载地址:http://phantomjs.org/download.html

Chromedriver的介绍

Chromedriver 也是一个能够被selenium驱动的浏览器,但是和PhantomJS的区别在于它是有界面的

  • 下载地址:https://npm.taobao.org/mirrors/chromedriver

driver的安装

最简单的安装方式是:解压后把bin目录下的可执行文件移动到环境变量下,比如/usr/bin 或者是/usr/local/bin下面

注意:Chromedriver和电脑上的chrome版本有对应关系,建议使用最新的Chromedriver版本并且更新chrome浏览器到最新版

selenium的入门使用

  • 知识点:

    • 掌握如何发送请求,加载网页
    • 掌握如何进行简单的元素定位
    • 掌握如何从获取浏览器中的数据
  • 加载网页: selenium通过控制浏览器,所以对应的获取的数据都是elements中的内容

    python">  from selenium import webdriver 
      driver = webdriver.PhantomJS(“c:/pantomjs.exe”)
      driver.get("http://www.baidu.com/")
      driver.save_screenshot("长城.png")
    
  • 定位和操作:

    python">  driver.find_element_by_id(“kw”).send_keys(“长城”)
      driver.find_element_by_id("su").click()
    
  • 查看请求信息:

    python">  driver.page_source
      driver.get_cookies()
      driver.current_url
    
  • 退出

    python">  driver.close() #退出当前页面
      driver.quit()  #退出浏览器
    

selenium的定位操作

  • 知识点:

    • 掌握定位元素的方法
    • 掌握获取元素中数据的方法
  • 定位元素语法:

    python">  find_element_by_id (返回一个元素)
      find_elements_by_xpath (返回一个包含元素的列表)
      find_elements_by_link_text (根据连接文本获取元素列表)
      find_elements_by_partial_link_text (根据连接包含的文本获取元素列表)
      find_elements_by_tag_name (根据标签名获取元素列表)
      find_elements_by_class_name (根据类名获取元素列表)
    

    注意: find_elementfind_elements的区别 by_link_textby_partial_link_tex的区别:全部文本和包含某个文本

  • 使用:

    以豆瓣首页为例:https://www.douban.com/

    python">  from selenium import webdriver
    
      driver =webdriver.Chrome()
    
      driver.get("https://www.douban.com/")
    
      ret1 = driver.find_element_by_id("anony-nav")
      print(ret1)
      # 输出为:<selenium.webdriver.remote.webelement.WebElement (session="ea6f94544ac3a56585b2638d352e97f3", element="0.5335773935305805-1")>
    
      ret2 = driver.find_elements_by_id("anony-nav")
      print(ret2)
      #输出为:[<selenium.webdriver.remote.webelement.WebElement (session="ea6f94544ac3a56585b2638d352e97f3", element="0.5335773935305805-1")>]
    
      ret3 = driver.find_elements_by_xpath("//*[@id='anony-nav']/h1/a")
      print(len(ret3))
       #输出为:1
    
      ret4 = driver.find_elements_by_tag_name("h1")
      print(len(ret4))
       #输出为:1
    
      ret5 = driver.find_elements_by_link_text("下载豆瓣 App")
      print(len(ret5))
       #输出为:1
    
      ret6 = driver.find_elements_by_partial_link_text("豆瓣")
      print(len(ret6))
       #输出为:28
    
      driver.close()
    
  • 获取数据语法

    • find_element仅仅能够获取元素,不能顾直接获取其中的数据,find_element_by_xapth也是这样
    • 获取文本:element.text
    • 获取属性值:element.get_attribute("href")
  • 使用示例:

    python">from selenium import webdriver
    
    driver =webdriver.Chrome()
    
    driver.get("https://www.douban.com/")
    
    ret4 = driver.find_elements_by_tag_name("h1")
    print(ret4[0].text)
    #输出:豆瓣
    
    ret5 = driver.find_elements_by_link_text("下载豆瓣 App")
    print(ret5[0].get_attribute("href"))
    #输出:https://www.douban.com/doubanapp/app?channel=nimingye
    
    driver.close()
    

selenium 处理cookie

通过driver.get_cookies()能够获取所有的cookie

python"># 把cookie转化为字典
{cookie[‘name’]: cookie[‘value’] for cookie in driver.get_cookies()}

#删除一条cookie
driver.delete_cookie("CookieName")
# 删除所有的cookie
driver.delete_all_cookies()

页面等待

  • 为什么需要等待

    如果网站采用了动态html技术,那么页面上的部分元素出现时间便不能确定,这个时候就可以设置一个等待时间,强制要求在时间内出现,否则报错

  • 页面等待的方法 time.sleep(10)

使用selenium切换frame

frame是html中常用的一种技术,即一个页面中嵌套了另一个网页,selenium默认是访问不了frame中的内容的,对应的解决思路是 driver.switch_to.frame()

动手:模拟登陆qq邮箱

在使用selenium登录qq邮箱的过程中,我们会发现,无法在邮箱的登录input标签中输入内容,通过观察源码可以发现,form表单在一个frame中,所以需要切换到frame中

selenium的优缺点

  • selenium能够执行页面上的js,对于js渲染的数据和模拟登陆处理起来非常容易
  • selenium由于在获取页面的过程中会发送很多请求,所以效率非常低,所以在很多时候需要酌情使用

http://www.niftyadmin.cn/n/5375638.html

相关文章

LeetCode、901. 股票价格跨度【中等,单调栈】

文章目录 前言LeetCode、901. 股票价格跨度【中等&#xff0c;单调栈】题目链接及分类思路思路1&#xff1a;暴力思路2&#xff1a;单调栈写法优化&#xff1a;单调栈简化写法(数组替代栈集合) 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、…

助力工业生产质检,基于轻量级yolov8-seg开发构建工业场景下滚珠丝杠传动表面缺陷分割检测系统

AI赋能工业生产是一个强有力的方式&#xff0c;在我们之前的系列博文中也有很多相应的开发实践&#xff0c;感兴趣的胡都可以自行移步阅读&#xff0c;本文的核心思想就是想要基于轻量级的实例分割模型来开发构建工业场景下的滚珠丝杠传动表面缺陷分割检测系统&#xff0c;首先…

ClickHouse--04--数据库引擎、Log 系列表引擎、 Special 系列表引擎

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.数据库引擎1.1 Ordinary 默认数据库引擎1.2 MySQL 数据库引擎MySQL 引擎语法字段类型的映射 2.ClickHouse 表引擎3.Log 系列表引擎几种 Log 表引擎的共性是&#…

爬虫2—用爬虫爬取壁纸(想爬多少张爬多少张)

先看效果图&#xff1a; 我这个是爬了三页的壁纸60张。 上代码了。 import requests import re import os from bs4 import BeautifulSoupcount0 img_path "./壁纸图片/"#指定保存地址 if not os.path.exists(img_path):os.mkdir(img_path) headers{ "User-Ag…

autojs通过正则表达式获取带有数字的text内容

视频连接 视频连接 参考 参考 var ctextMatches(/\d/).findOne()console.log("当前金币"c.text()) // 获取当前金币UiSelector.textMatches(reg) reg {string} | {Regex} 要满足的正则表达式。 为当前选择器附加控件"text需要满足正则表达式reg"的条件。 …

【leetcode热题100】不同的二叉搜索树

给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;5示例 2&#xff1a; 输入&#xff1a;n 1 输出&#xff1a;1 …

【医学大模型 知识增强】SMedBERT:结构化语义知识 + 医学大模型 = 显著提升大模型医学文本挖掘性能

SMedBERT&#xff1a;结构化语义知识 医学大模型 显著提升医学文本挖掘任务性能 名词解释结构化语义知识预训练语言模型医学文本挖掘任务 提出背景具体步骤提及-邻居混合注意力机制实体嵌入增强实体描述增强三元组句子增强 提及-邻居上下文建模域内词汇权重学习领域自监督任务…

MATLAB|【免费】高比例可再生能源电力系统的调峰成本量化与分摊模型

目录 主要内容 部分代码 结果一览 下载链接 主要内容 程序复现文献《高比例可再生能源电力系统的调峰成本量化与分摊模型》&#xff0c;从净负荷波动的角度出发&#xff0c;建立了调峰成本的量化与分摊模型&#xff0c;构造了无调峰需求的替代场景&#xff0c;将…