【selenium】

news2025/3/10 18:56:01

selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的。Selenium可以直接调用浏览器,它支持所有主流的浏览器。其本质是通过驱动浏览器,完成模拟浏览器操作,比如挑战,输入,点击等。

下载与打开

下载链接:CNPM Binaries Mirror

找到与自己的谷歌浏览器版本最接近的。

然后点击下载里面win32.zip即可

05b8cd85179248da9c1f2f33f944662a.png下载的压缩包解压完成后的内容放到python的安装路径。

python安装路径:可以运行一个空的py文件,第一行的第一个路径就是你的python解释器安装路径

cmd命令提示符中:pip install selenium==3.141.0

卸载:pip uninstall 模块名

from selenium import webdriver
# 导入其中的webdriver来驱动浏览器
url = "https://www.baidu.com/"
# 启动谷歌浏览器
driver = webdriver.Chrome()
# 在地址栏输入网址
driver.get(url)

可以打开网页了。

不过可能会报错。根据报错内容查看是哪里出现了问题:

  • 问题一:下载的selenium与urllib3不兼容
    • 解决方式:cmd中输入pip install selenium==3.141.0pip install urllib3==1.26.2
  • 问题二:谷歌浏览器与下载的chromedriver驱动版本不一致
    • 解决方式:右上角三个点--帮助--关于--找到自己浏览器的版本,再对应下载驱动

浏览器对象

get(url=url):地址栏--输入url地址并确认

page_source:HTML结构源码

maxmize_window:浏览器窗口最大化

quit():关闭浏览器窗口

from selenium import webdriver
# 导入其中的webdriver来驱动浏览器
url = "https://www.baidu.com/"
# 启动谷歌浏览器
driver = webdriver.Chrome()
# 在地址栏输入网址
driver.get(url)
driver.maximize_window()    # 将浏览器窗口最大化
print(driver.page_source)    # 打印请求头
driver.quit()      # 关掉浏览器

Selenium定位元素

from selenium.webdriver.common.by import By

  • find_element(By.ID, '根据标签id属性进行定位')
  • find_element(By.NAME, '根据标签name属性进行定位')
  • find_element(By.CLASS_NAME, '根据标签class属性进行定位')
  • find_element(By.XPATH, '根据xpath语法进行定位')
  • find_element(By.CSS_SELECTOR, '根据css语法进行定位')
  • find_element(By.LINK_TEXT, '根据标签文本内容进行定位')
from selenium import webdriver
from selenium.webdriver.common.by import By

url = "https://www.baidu.com/"
driver = webdriver.Chrome()
driver.get(url)
driver.maximize_window()

driver.find_element(By.ID, "kw").send_keys("CSDN")    # 在搜索框上输入CSDN
driver.find_element(By.ID, 'su').click()     # 点击搜索

无界面模式

from selenium import webdriver

options = webdriver.ChromeOptions()

# 添加无界面参数

options.add_argument('--headless')

browser = webdriver.Chrome(options=options)

import time

from selenium import webdriver
from selenium.webdriver.common.by import By

url = "https://www.jd.com/?cu=true&utm_source=baidu-pinzhuan&utm_medium=cpc&utm_campaign=t_288551095_baidupinzhuan&utm_term=0f3d30c8dba7459bb52f2eb5eba8ac7d_0_4f2b917133dd438ab114acdc46cd0f2c"

options = webdriver.ChromeOptions()
# 添加无界面参数
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)

driver.get(url)
driver.execute_script(
    "window.scrollTo(500, document.body.scrollHeight)"
)
time.sleep(2)
li_list = driver.find_elements(By.XPATH, '//div[@id="J_feeds"]/ul/li')

i = 0
for li in li_list:
    print(li.text)
    print('*'*30)
    i += 1
print(i)     # *

 打开新窗口和切换页面

通过excute_script()来执行js脚本的形式来打开新窗口。

window.excute_script("window.open('https://www.douban.com')")

打开新窗口后driver当前的页面依然是之前的。

如果想获取新窗口的源代码,就必须先切换过去 :

window.switch_to.window(driver.window_handles[1])

from selenium import webdriver
url = 'https://www.baidu.com/'
driver = webdriver.Chrome()
driver.get(url)
driver.maximize_window()

js = 'open("https://www.douban.com/")'
driver.execute_script(js)

print(driver.page_source)     # 获取到的是百度页面的信息
driver.quit()

切换:

from selenium import webdriver
url = 'https://www.baidu.com/'
driver = webdriver.Chrome()
driver.get(url)
driver.maximize_window()

js = 'open("https://www.douban.com/")'
driver.execute_script(js)

driver.switch_to_window(js)
# print(driver.window_handles)
print(driver.page_source)
driver.quit()
import time
from selenium import webdriver
from selenium.webdriver.common.by import By

class JdSpider():
    def __init__(self):
        self.url = 'https://search.jd.com/Search?keyword=%E6%95%B0%E7%A0%81&enc=utf-8&wq=%E6%95%B0%E7%A0%81&pvid=34b0fcf7ed434840a74c057bc97be346'
        self.driver = webdriver.Chrome()

    def get_url(self):
        self.driver.get(self.url)
        self.driver.execute_script(
            "window.scrollTo(0, document.body.scrollHeight)"
        )
        time.sleep(2)
        li_list = self.driver.find_elements(By.XPATH, '//div[@id="J_goodsList"]/ul/li')
        detail_urls = []
        for li in li_list:
            a = li.find_element(By.XPATH, './/a')
            detail_urls.append(a.get_attribute('href'))

        for detail_url in detail_urls:
            js = f'open("{detail_url}")'
            self.driver.execute_script(js)
            self.driver.switch_to_window(self.driver.window_handles[1])
            time.sleep(2)
            self.get_detail()
            self.driver.close()
            self.driver.switch_to_window(self.driver.window_handles[0])

    def get_detail(self):
        print('获取详情')
        name = self.driver.find_element(By.CSS_SELECTOR, 'body > div:nth-child(10) > div > div.itemInfo-wrap > div.sku-name').text
        print(name)

if __name__ == '__main__':
    spider = JdSpider()
    spider.get_url()       # *

selenium-iframe

网页中嵌套了网页,先切换到iframe,再执行其他操作

切换到要处理的iframe

browaer.switch_to.frame(frame节点对象)

from selenium import webdriver
from selenium.webdriver.common.by import By
import infos

url = 'https://douban.com/'

driver = webdriver.Chrome()
driver.get(url)

iframe = driver.find_element(By.XPATH, '//div[@class="login"]/iframe')
# print(iframe)

driver.switch_to.frame(iframe)    # 切进来
# 点击密码登录
driver.find_element(By.XPATH, '/html/body/div[1]/div[1]/ul[1]/li[2]').click()
# 输入账号密码
driver.find_element(By.XPATH, '//*[@id="username"]').send_keys(infos.username)
driver.find_element(By.XPATH, '//*[@id="password"]').send_keys(infos.username)
# 点击登录
driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div[1]/div[5]/a').click()

验证码处理

数字验证码:

img = driver.find_element(By.XPATH, '复制验证码所在代码段的XPATH(右击--copy)')

img.screenshot("1.png")     # 将图片截取下来

【网站:www.ttshitu.com---登录--开发文档--python--可以找到相应代码】

def base64_api(uname, pwd, img, typeid):
    with open(img, 'rb') as f:
        base64_data = base64.b64encode(f.read())
        b64 = base64_data.decode()
    data = {"username": uname, "password": pwd, "typeid": typeid, "image": b64}
    result = json.loads(requests.post("http://api.ttshitu.com/predict", json=data).text)
    if result['success']:
        return result["data"]["result"]
    else:
        return result["message"]
img_path = "1.jpg"
result = base64_api(uname='你的账号', pwd='你的密码', img=img_path, typeid=3)
print(result)     # 记得导包

滑动验证码: 

button = driver.find_element(By.CSS_SELECTOR, '复制验证码所在代码的CSS路径')

action = ActionChains(driver)
action.click_and_hold(button).perform()    # 点击且不松开

action.move_by_offset(int(result) - 30, 0)     # 滑块与左边框距离30
action.release().perform()

selenium翻页操作

取到第一页数据:

from selenium import webdriver
from selenium.webdriver.common.by import By

url = 'https://www.maoyan.com/board/4?offset=0'

driver = webdriver.Chrome()
driver.get(url)

driver.maximize_window()

dds = driver.find_elements(By.XPATH, '//*[@id="app"]/div/div/div[1]/dl/dd')

for dd in dds:
    print(dd.text.split('\n'))
    print('-'*30)

翻页爬取:

from selenium import webdriver
from selenium.webdriver.common.by import By

url = 'https://www.maoyan.com/board/4?offset=0'

option = webdriver.ChromeOptions()
option.add_argument('--headless')    # 加上这两句就不会弹出页面了(无头模式),,当然也可以不添加

driver = webdriver.Chrome()
driver.get(url)

driver.maximize_window()

dds = driver.find_elements(By.XPATH, '//*[@id="app"]/div/div/div[1]/dl/dd')


def get_data():
    """一页的数据"""
    dds = driver.find_elements(By.XPATH, '//*[@id="app"]/div/div/div[1]/dl/dd')

    for dd in dds:
        print(dd.text.split('\n'))
        print('-' * 30)

while True:
    get_data()
    try:
        driver.find_element(By.LINK_TEXT, '下一页').click()    # 点击下一页的文本
    except Exception as e:    # 做异常处理,数据爬取100个后就没有下一页,会报错的
        print(e)
        print('数据爬取完成')    # 没有下一页代表完成
        driver.quit()
        break

 操作cookie

获取cookie:driver.get_cookies()

根据cookie的key获取value:value=driver.get_cookie(key)

删除所有的cookie:driver.delete_all_cookies()

删除某个cookie:driver.delete_cookie(key)

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
import infos

url = 'https://douban.com/'

driver = webdriver.Chrome()
driver.get(url)

iframe = driver.find_element(By.XPATH, '//div[@class="login"]/iframe')
# print(iframe)

driver.switch_to.frame(iframe)    # 切进来
# 点击密码登录
driver.find_element(By.XPATH, '/html/body/div[1]/div[1]/ul[1]/li[2]').click()
# 输入账号密码
driver.find_element(By.XPATH, '//*[@id="username"]').send_keys(infos.username)
driver.find_element(By.XPATH, '//*[@id="password"]').send_keys(infos.password)
# 点击登录
driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div[1]/div[5]/a').click()

time.sleep(20)
cookies = driver.get_cookies()

cookies_dict = {}
for cookie in cookies:
    name = cookie['name']
    value = cookie['value']
    cookies_dict[name] = value

url = 'https://douban.com/'

import requests

headers = {
    'User-Agent': '# 将User-Agent复制过来' 
}
print(requests.get(url, cookies=cookies_dict, headers=headers).text)    # 获取到登陆后的数据

隐式等待和显式等待 

隐式等待:指定一个时间,在这个时间内会一直处于等待状态。使用:driver.implicitly_wait

显式等待:指定在某个时间内,如果某个条件满足了,就不会在等待。使用:from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 隐式等待:后续的标签定位都会建立在5秒之内
# 后续的某个标签在5秒内加载出来就进行爬取,否则继续下一页
driver.implicitly_wait(5)

# 显式等待:针对某一个标签定位
WebDriverWait(driver, 10).until(
    EC.presence_of_all_elements_located((By.LINK_TEXT, "地图"))
).click()

 

 

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

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

相关文章

以谷歌浏览器为例 讲述 JavaScript 断点调试操作用法

今天来说个比较实用的东西 用浏览器开发者工具 对 javaScript代码进行调试 我们先创建一个index.html 编写代码如下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content&…

谷粒商城【成神路】-【6】——商品维护

目录 &#x1f9c2;1.发布商品 &#x1f953;2.获取分类关联品牌 &#x1f32d;3.获取分类下所有分组和关联属性 &#x1f37f;4.商品保存功能 &#x1f9c8;5.sup检索 &#x1f95e;6.sku检索 1.发布商品 获取用户系统等级~&#xff0c;前面生成了后端代码&#xff…

产品交付双轮驱动思维模型下的思考的研发工具

一、产品交付双轮驱动思维模型 之前读过这样双轮驱动思维模型&#xff0c;其思维模型如下图所示&#xff0c;双轮驱动思维模型是一个产品价值交付模型&#xff0c;总的理念是以“真北业务价值”为导向&#xff0c;以“产品快速交付”为动力&#xff0c;将“业务价值”与“产品…

01.数据结构篇-链表

1.找出两个链表的交点 160. Intersection of Two Linked Lists (Easy) Leetcode / 力扣 例如以下示例中 A 和 B 两个链表相交于 c1&#xff1a; A: a1 → a2↘c1 → c2 → c3↗ B: b1 → b2 → b3 但是不会出现以下相交的情况&#xff0c;因为每个节点只有一个…

HCIA-HarmonyOS设备开发认证V2.0-3.2.轻量系统内核基础-软件定时器

目录 一、软件定时器基本概念二、软件定时器运行机制三、软件定时器状态四、软件定时器模式五、软件定时器开发流程六、软件定时器使用说明七、软件定时器接口八、代码分析&#xff08;待续...&#xff09;坚持就有收获 一、软件定时器基本概念 软件定时器&#xff0c;是基于系…

【python量化交易】qteasy使用教程02 - 获取和管理金融数据

qteasy教程2 - 获取并管理金融数据 qteasy教程2 - 获取并管理金融数据开始前的准备工作获取基础数据以及价格数据下载交易日历和基础数据查看股票和指数的基础数据下载沪市股票数据从本地获取股价数据生成K线图 数据类型的查找回顾总结 qteasy教程2 - 获取并管理金融数据 qtea…

知识图谱 多模态学习 2024 最新综述

知识图谱遇见多模态学习&#xff1a;综述 论文题目&#xff1a;Knowledge Graphs Meet Multi-Modal Learning: A Comprehensive Survey 论文链接&#xff1a;http://arxiv.org/abs/2402.05391 项目地址&#xff1a;https://github.com/zjukg/KG-MM-Survey 备注&#xff1a;55…

C||1.水仙花数是指一个n位数,每一位数字的n次幂的和正好等于这个数本身。2.有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数。

1.水仙花数是指一个n位数&#xff0c;每一位数字的n次幂的和正好等于这个数本身。 比如&#xff1a;153 13 53 33。 要求打印出所有三位数的水仙花数。 #include <stdio.h> #include <math.h> int main() {int i,x,y,z;for(i100;i<1000;i){xi/100%10;yi/10%…

python-自动化篇-办公-批量新建文件夹并保存日志信息

文章目录 说明代码效果 说明 因为业务需要&#xff0c;每天都需要按当天的日期创建很多新文件夹。把这种重复又繁重的操作交给Python来做&#xff0c;一直是我的目标。先说下要求&#xff1a; 默认在桌面新建文件夹。文件夹命名方式&#xff0c;“月.日-1”&#xff0c;比如7…

同一个春晚 ,同一个淘宝

配图来自Canva可画 在全国一片喜庆的氛围中&#xff0c;龙年春晚如约播出&#xff0c;又一次为淘宝商家打开“财富之门”。 春晚作为春节不可或缺的一部分&#xff0c;它在传承传统文化的同时&#xff0c;也在引领当代网络潮流。龙年春晚开始前&#xff0c;不少网友“押题”&…

Stable Diffusion教程——stable diffusion基础原理详解与安装秋叶整合包进行出图测试

前言 在2022年&#xff0c;人工智能创作内容&#xff08;AIGC&#xff09;成为了AI领域的热门话题之一。在ChatGPT问世之前&#xff0c;AI绘画以其独特的创意和便捷的创作工具迅速走红&#xff0c;引起了广泛关注。随着一系列以Stable Diffusion、Midjourney、NovelAI等为代表…

车载诊断协议DoIP系列 —— OSI模型DoIP参考

车载诊断协议DoIP系列 —— OSI模型DoIP参考 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,喝完再…

【玩转408数据结构】线性表——线性表的顺序表示(顺序表)

知识回顾 通过前文&#xff0c;我们了解到线性表是具有相同数据类型的有限个数据元素序列&#xff1b;并且&#xff0c;线性表只是一种逻辑结构&#xff0c;其不同存储形式所展现出的也略有不同&#xff0c;那么今天我们来了解一下线性表的顺序存储——顺序表。 顺序表的定义 …

2024春晚纸牌魔术原理----环形链表的约瑟夫问题

一.题目及剖析 https://www.nowcoder.com/practice/41c399fdb6004b31a6cbb047c641ed8a?tabnote 这道题涉及到数学原理,有一般公式,但我们先不用公式,看看如何用链表模拟出这一过程 二.思路引入 思路很简单,就试创建一个单向循环链表,然后模拟报数,删去对应的节点 三.代码引…

Stable Diffusion 模型下载:DreamShaper XL(梦想塑造者 XL)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十 下载地址 模型介绍 DreamShaper 是一个分格多样的大模型&#xff0c;可以生成写实、原画、2.5D 等…

前端工程化面试题 | 07.精选前端工程化高频面试题

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

springboot183基于java的公寓报修管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

AES加密后的密码可以破解吗

AES&#xff08;高级加密标准&#xff09;是一种广泛使用的对称加密算法&#xff0c;设计用来抵御各种已知的攻击方法。AES使用固定块大小的加密块和密钥长度&#xff0c;通常是128、192或256位。它被认为是非常安全的&#xff0c;到目前为止&#xff0c;没有已知的可行方法能够…

视觉开发板—K210自学笔记(六)

视觉开发板—K210 本期我们继续来遵循其他控制器的学习路线&#xff0c;在学习完GPIO的基本操作后&#xff0c;我们来学一个非常重要的UART串口通信。为什么说这个重要呢&#xff0c;通常来说我们在做一个稍微复杂的项目的时候K210作为主控的核心可能还有所欠缺&#xff0c;另…

基于微信小程序的校园失物招领小程序

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…