【selenium】

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()

 

 

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

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

相关文章

C++ Qt框架开发 | 基于Qt框架开发实时成绩显示排序系统(2)折线图显示

对上一篇的工作C学习笔记 | 基于Qt框架开发实时成绩显示排序系统1-CSDN博客继续优化,增加一个显示运动员每组成绩的折线图。 1)在Qt Creator的项目文件(.pro文件)中添加对Qt Charts模块的支持: QT charts 2&#xf…

用HTML5 + JavaScript绘制花、树

用HTML5 JavaScript绘制花、树 <canvas>是一个可以使用脚本 (通常为JavaScript) 来绘制图形的 HTML 元素。 <canvas> 标签/元素只是图形容器&#xff0c;必须使用脚本来绘制图形。 HTML5 canvas 图形标签基础https://blog.csdn.net/cnds123/article/details/112…

opencv 图像色彩空间转化

今天看了b站贾志刚的课&#xff0c;觉得不错&#xff0c;特地做学习笔记来和小伙伴分享 贾志刚的这个好像是2.0版本,30小时的,语言更加精炼,适合初级入门学习 第一节是常规安装 看他的步骤装就行了,记得配置完点应用再点确定,我第一次就是 没点然后就失败了,又得重配置一次…

服务网格(Service Mesh)流行工具

在这篇博客中&#xff0c;我们将介绍微服务的最佳服务网格工具列表&#xff0c;这些工具提供安全性、金丝雀部署、遥测、负载均衡等。 用于部署和操作微服务的服务网格工具的数量不断增加。在这篇文章中&#xff0c;我们将探讨您应该用来构建自己的服务网格架构的顶级服务网格…

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

本期我们来遵循其他单片机的学习路线开始去用板子上的按键控制点亮LED。那么第一步还是先知道K210里面的硬件电路是怎么连接的&#xff0c;需要查看第二节的文档&#xff0c;看看开发板原理图到底是按键是跟哪个IO连在一起。然后再建立输入按键和GPIO的映射就可以开始变成了。 …

PHP特性知识点总结

description: 专门出的关于php的特性比较,后面好像也有java的特性。 大家直接去我的gitbook或者github看就能看到图片,这里就懒得把他弄到csdn上了。 这里放github和gitbook的链接,大家跳转就可以。gitbook链接用国内的网就能访问。 gitbook: http://22kaka.fun github:htt…

STM32 + ESP8266,连接阿里云 上报/订阅数据

&#xff08;文章正在编辑中&#xff0c;一点点地截图操作过程&#xff0c;估计要拖拉两三天&#xff09; 一、烧录MQTT固件 ESP8266出厂时&#xff0c;默认是AT固件。连接阿里云&#xff0c;需要使用MQTT固件。 1、独立EPS8266模块的烧录方法 2、魔女开发板&#xff0c;板载…

HTTP协议-请求Request

前言&#xff1a; 序列&#xff1a;HTTP - 002 1.请求格式 1.1标椎格式 HTTP请求是字符串的格式传输&#xff0c;具体包含以下四部分&#xff1a; 首行&#xff1a;[方法][url][版本号]&#xff0c;分别使用空格分隔&#xff1b;请求头&#xff08;Header&#xff09;&#…

apk反编译修改教程系列---简单修改apk默认横竖屏显示 手机端与电脑端同步演示【十一】

往期教程&#xff1a; apk反编译修改教程系列-----修改apk应用名称 任意修改名称 签名【一】 apk反编译修改教程系列-----任意修改apk版本号 版本名 防止自动更新【二】 apk反编译修改教程系列-----修改apk中的图片 任意更换apk桌面图片【三】 apk反编译修改教程系列---简单…

《UE5_C++多人TPS完整教程》学习笔记8 ——《P9 访问 Steam(Acessing Steam)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P9 访问 Steam&#xff08;Acessing Steam&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;也是译者&…

[JavaWeb玩耍日记]Maven的安装与使用

目录 一.作用 二.安装 三.使用 2.对项目使用compile命令进行编译,看看新的文件会在哪里产生&#xff1f; 3.需要认识的命令 4.Maven对项目执行不同命令的生命周期特点&#xff1f; 5.如何导入工程外的Maven&#xff1f; 6.如何直观地查看Maven导入了哪些工程或哪些jar包…

Stream流学习笔记

Stream流 创建流中间操作1、filter2、map3、distinct4、sorted5、limit6、skip7、flatMap 终结操作1、forEach2、count3、max&min4、collect5、查找与匹配 创建流 单例集合&#xff1a;集合对象.stream() List<Integer> list new ArrayList<>(); Stream<…

前端JavaScript篇之Promise解决了什么问题、Promise.all和Promise.race的区别的使用场景

目录 Promise解决了什么问题Promise.all和Promise.race的区别的使用场景 Promise解决了什么问题 Promise 解决了 JavaScript 中回调地狱的问题。在传统的回调函数中&#xff0c;如果需要依次执行多个异步操作&#xff0c;就需要使用嵌套的回调函数&#xff0c;这样会导致代码难…

如何学习VBA_3.2.14:VBA中字符串的处理和判断函数

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的劳动效率&#xff0c;而且可以提高数据处理的准确度。我推出的VBA系列教程共九套和一部VBA汉英手册&#xff0c;现在已经全部完成&#xff0c;希望大家利用、学习。 如果…

EasyCaptcha,开源图形验证码新标杆!

引言&#xff1a; 随着互联网的普及&#xff0c;验证码已成为网站和应用程序中不可或缺的安全组件。它能够有效地防止自动化攻击、垃圾邮件和机器人活动。在众多验证码解决方案中&#xff0c;Easy-captcha以其简单易用和高度可定制的特点受到了开发者的青睐。本文将指导读者如…

leetcode:买卖股票最佳时机二

思路&#xff1a; 使用贪心算法&#xff1a;局部最优是将买卖过程中产生的正数进行相加&#xff0c;进而使得最后结果最大&#xff08;全局最优&#xff09;。 price [7,1,5,10,3,6,4] -6,4,5,-7,3,-2 正数相加就得到了最大 代码实现&#xff1a; 1.循环中下标从1开始 …

unity2017 遇到visual studio 2017(社区版) 30日试用期到了

安装unity2017 遇到visual studio 2017 30日试用期到了&#xff0c;网上百度搜了好多方法都没有成功。 最后用了这个方法&#xff1a; 1)启动vs2017&#xff0c;在弹出要登录的窗口之前&#xff0c;迅速的点击工具-》选项-》账户&#xff0c;勾选在添加账户或对账户重新进行身…

【技巧】Allegro实用技巧之模块复用

需求分析&#xff1a;使用Allegro软件进行PCB Layout设计时&#xff0c;当电路图中有很多路相同的模块&#xff0c;使用模块复用的的操作方法&#xff0c;可以显著提高工作效率&#xff0c;同时也可以使PCB布局在整体上显得美观。下面来讲述这个方法。 具体方法及说明&#xf…

计算机组成原理 1 概论

主要内容 介绍运算器、控制器、存储器结构、工作原理、设计方法及互连构成整机的技术。 主要内容&#xff1a; ◼ 数值表示与运算方法 ◼ 运算器的功能、组成和基本运行原理 ◼ 存储器及层次存储系统 ◼ 指令系统 ◼ CPU功能、组成和运行原理 ◼ 流水线 ◼ 系统总线 ◼ 输入输出…