一篇文章带你了解Python之Selenium自动化爬虫

目录
  • Python之Selenium自动化爬虫
    • 0.介绍
    • 1.安装
    • 2.下载浏览器驱动
    • 3.实例
    • 4.开启无头模式
    • 5.保存页面截图
    • 6.模拟输入和点击
      • a.根据文本值查找节点
      • b.获取当前节点的文本
      • c.打印当前网页的一些信息
      • d.关闭浏览器
      • e.模拟鼠标滚动
    • 7.ChromeOptions
    • 8.验证滑块移动
    • 9.打开多窗口和页面切换
    • 10.Cookie操作
    • 11.模拟登录
    • 12.使用代理
    • 14.更换UA
    • 15.鼠标悬停
    • 16.优缺点
  • 总结

Python之Selenium自动化爬虫

0.介绍

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

1.安装

pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple

2.下载浏览器驱动

这里用的谷歌浏览器

http://npm.taobao.org/mirrors/chromedriver/

查看自己的浏览器版本下载对应的驱动。

把解压后的驱动放在自己的python.exe 目录下。

3.实例

我之前写过3个实例

https://www.jb51.net/article/236004.htm

4.开启无头模式

是否开启无头模式(即是否需要界面)

from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
option = Options()  # 实例化option对象
option.add_argument("--headless")  # 给option对象添加无头参数
option.headless = True #这种方式也可以
if __name__ == '__main__':
    web = Chrome(executable_path='D:\PyProject\spider\venv\Scripts\chromedriver.exe',options=option) # 指定驱动位置,否则从python解释器目录下查找.
    web.get("https://baidu.com")
    print(web.title)

5.保存页面截图

from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
option = Options()  # 实例化option对象
option.add_argument("--headless")  # 给option对象添加无头参数
if __name__ == '__main__':
    web = Chrome()
    web.maximize_window()  # 浏览器窗口最大化
    web.get("https://baidu.com")
    print(web.title)
    web.save_screenshot('baidu.png')  # 保存当前网页的截图  保存到当前文件夹下
    web.close()  # 关闭当前网页

6.模拟输入和点击

from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
option = Options()  # 实例化option对象
option.add_argument("--headless")  # 给option对象添加无头参数
if __name__ == '__main__':
    web = Chrome()
    web.maximize_window()  # 浏览器窗口最大化
    web.get("https://baidu.com")
    el = web.find_element_by_id('kw')
    el.send_keys('Harris-H')
    btn = web.find_element_by_id('su')
    btn.click()
    # web.close()  # 关闭当前网页

貌似现在百度可以识别出selenium,还需要图片验证。

a.根据文本值查找节点

# 找到文本值为百度一下的节点
driver.find_element_by_link_text("百度一下")
# 根据链接包含的文本获取元素列表,模糊匹配
driver.find_elements_by_partial_link_text("度一下")

b.获取当前节点的文本

ele.text # 获取当前节点的文本
ele.get_attribute("data-click")  # 获取到属性对应的value

c.打印当前网页的一些信息

print(driver.page_source)  # 打印网页的源码
print(driver.get_cookies())  # 打印出网页的cookie
print(driver.current_url)  # 打印出当前网页的url

d.关闭浏览器

driver.close()  # 关闭当前网页
driver.quit()  # 直接关闭浏览器

e.模拟鼠标滚动

from selenium.webdriver import Chrome
import time
if __name__ == '__main__':
    driver = Chrome()
    driver.get(
        "https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=78000241_12_hao_pg&wd=selenium%20js%E6%BB%91%E5%8A%A8&fenlei=256&rsv_pq=8215ec3a00127601&rsv_t=a763fm%2F7SHtPeSVYKeWnxKwKBisdp%2FBe8pVsIapxTsrlUnas7%2F7Hoo6FnDp6WsslfyiRc3iKxP2s&rqlang=cn&rsv_enter=1&rsv_dl=tb&rsv_sug3=31&rsv_sug1=17&rsv_sug7=100&rsv_sug2=0&rsv_btype=i&inputT=9266&rsv_sug4=9770")
    #  1.滚动到网页底部
    js = "document.documentElement.scrollTop=1000"
    # 执行js
    driver.execute_script(js)
    time.sleep(2)
    # 滚动到顶部
    js = "document.documentElement.scrollTop=0"
    driver.execute_script(js)  # 执行js
    time.sleep(2)
    driver.close()

7.ChromeOptions

options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://110.52.235.176:9999") # 添加代理
options.add_argument("--headless") # 无头模式
options.add_argument("--lang=en-US") # 网页显示英语
prefs = {"profile.managed_default_content_settings.images": 2, 'permissions.default.stylesheet': 2} # 禁止渲染
options.add_experimental_option("prefs", prefs)
driver = webdriver.Chrome(executable_path="D:\ProgramApp\chromedriver\chromedriver73.exe",chrome_options=options)
driver.get("http://httpbin.org/ip")

8.验证滑块移动

"""
目标:滑动验证码
1.定位按钮
2.按住滑块
3.滑动按钮
"""
import time
from selenium import webdriver
if __name__ == '__main__':
    chrome_obj = webdriver.Chrome()
    chrome_obj.get('https://www.helloweba.net/demo/2017/unlock/')
    # 1.定位滑动按钮
    click_obj = chrome_obj.find_element_by_xpath('//div[@class="bar1 bar"]/div[@class="slide-to-unlock-handle"]')
    # 2.按住
    # 创建一个动作链对象,参数就是浏览器对象
    action_obj = webdriver.ActionChains(chrome_obj)
    # 点击并且按住,参数就是定位的按钮
    action_obj.click_and_hold(click_obj)
    # 得到它的宽高
    size_ = click_obj.size
    width_ = 298 - size_['width']  # 滑框的宽度 减去 滑块的 宽度 就是 向x轴移动的距离(向右)
    print(width_)
    # 3.定位滑动坐标
    action_obj.move_by_offset(298-width_, 0).perform()
    # 4.松开滑动
    action_obj.release()
    time.sleep(6)
    chrome_obj.quit()

9.打开多窗口和页面切换

有时候窗口中有很多子tab页面。这时候肯定是需要进行切换的。selenium提供了一个叫做switch_to_window来进行切换,具体切换到哪个页面,可以从driver.window_handles中找到

from selenium import webdriver
if __name__ == '__main__':
    driver = webdriver.Chrome()
    driver.get("https://www.baidu.com/")
    driver.implicitly_wait(2)
    driver.execute_script("window.open('https://www.douban.com/')")
    driver.switch_to.window(driver.window_handles[1])
    print(driver.page_source)

第二个实例

if __name__ == '__main__':
    from selenium import webdriver
    import time
    driver = webdriver.Chrome()
    start_url = 'https://www.baidu.com'
    start_url_1 = 'https://www.csdn.net'
    driver.get(start_url)
    time.sleep(5)
    """通过执行js代码,打开浏览器窗口,访问地址"""
    js = 'window.open("{}")'.format(start_url_1)
    driver.execute_script(js)
    time.sleep(5)
    """获取浏览器所有窗口:注意点:窗口的切换是通过下标控制的"""
    win = driver.window_handles
    # 执行切换
    driver.switch_to.window(win[0])
    time.sleep(2)
    driver.switch_to.window(win[1])
    time.sleep(2)
    driver.switch_to.window(win[0])
    time.sleep(2)
    driver.switch_to.window(win[1])
    # 浏览器窗口的关闭
    driver.close()
    # 退出浏览器
    driver.quit()

有时候网页会内嵌另一个html。一般称为iframe

from selenium import webdriver
driver = webdriver.Chrome()
start_url = 'https://mail.163.com/'
driver.get(start_url)
"""定位不成功,在有的情况是因为有页面的嵌套导致的
在一个html源码中有多个html页面,示例:一个html嵌套一个html
以上:又称之为iframe的嵌套
"""
# 定位嵌套位置iframe
el_iframe = driver.find_elements_by_tag_name('iframe')
# 执行iframe的切换
driver.switch_to.frame(el_iframe[0])
# 标签定位
driver.find_element_by_name('email').send_keys('邮箱账号')
driver.find_element_by_name('password').send_keys('你的邮箱密码')
driver.find_element_by_id('dologin').click()

10.Cookie操作

# 1.获取所有的cookie:
for cookie in driver.get_cookies():
    print(cookie)
# 2.根据cookie的key获取value:
value = driver.get_cookie(key)
# 3.删除所有的cookie:
driver.delete_all_cookies()
# 4.删除某个cookie:
driver.delete_cookie(key)
# 添加cookie:
driver.add_cookie({"name":"password","value":"111111"})

11.模拟登录

这里模拟登录我们学校教务处。

from selenium.webdriver import Chrome
if __name__ == '__main__':
    web = Chrome()
    web.get('http://bkjx.wust.edu.cn/')
    username = web.find_element_by_id('userAccount')
    username.send_keys('xxxxxxx') # 这里填自己的学号
    password = web.find_element_by_id('userPassword')
    password.send_keys('xxxxxxx') # 这里填自己的密码
    btn = web.find_element_by_xpath('//*[@id="ul1"]/li[4]/button')
    btn.click()
    # do something

因为没有滑块啥的验证,所以就很简单qwq。然后后面进行自己的操作即可。

12.使用代理

from selenium import webdriver
import time
options = webdriver.ChromeOptions()
options.add_argument('--proxy-server=http://ip地址')  # 代理IP:端口号
# ${chromedriver_path}: chromedriver驱动存放路径
driver = webdriver.Chrome(options=options)
driver.get("https://dev.kdlapi.com/testproxy")
# 获取页面内容
print(driver.page_source)
# 延迟3秒后关闭当前窗口,如果是最后一个窗口则退出
time.sleep(3)
driver.close()

14.更换UA

from selenium import webdriver
import time
agent = 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1'
options = webdriver.ChromeOptions()
options.add_argument('--user-agent=' + agent)
# ${chromedriver_path}: chromedriver驱动存放路径
driver = webdriver.Chrome(options=options)
driver.get("https://www.baidu.com")
# 获取页面内容
print(driver.page_source)
# 延迟3秒后关闭当前窗口,如果是最后一个窗口则退出
time.sleep(3)

15.鼠标悬停

if __name__ == '__main__':
    from selenium import webdriver
    from selenium.webdriver.common.action_chains import ActionChains
    driver = webdriver.Chrome()
    import time
    start_url = 'https://lceda.cn/'
    driver.get(start_url)
    # 定位到需要悬停的标签
    move = driver.find_element_by_xpath('//*[@id="headerNav"]/li[1]/a/span')
    # //*[@id="headerNav"]/li[1]/a/span
    # 悬停之后需要点击的标签
    a = driver.find_element_by_xpath('/html/body/div[1]/div[2]/div[1]/div[1]/div[3]/div[1]/a[2]')
    # //*[@id="headerNav"]/li[1]/div/a[2]
    # /html/body/div[1]/div[2]/div[1]/div[1]/div[1]/div/div/div[1]/ul/li[1]/div/a[2]
    # 悬停点击执行
    # 创建事件对象
    actions = ActionChains(driver)
    time.sleep(1)
    # 记录操作
    actions.move_to_element(move)
    time.sleep(1.5)
    # 悬停的点击
    actions.click(a)
    time.sleep(1)
    # 开始执行事件
    actions.perform()

16.优缺点

selenium能够执行页面上的js,对于js渲染的数据和模拟登陆处理起来非常容易。

selenium由于在获取页面的过程中会发送很多请求,所以效率非常低,所以在很多时候需要酌情使用。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • Python爬虫实战之用selenium爬取某旅游网站

    一.selenium实战 这里我们只会用到很少的selenium语法,我这里就不补充别的用法了,以实战为目的 二.打开艺龙网 可以直接点击这里进入:艺龙网 这里是主页 三.精确目标 我们的目标是,鹤壁市,所以我们应该先点击搜索框,然后把北京删掉,替换成鹤壁市,那么怎么通过selenium实现呢? 打开pycharm,新建一个叫做艺龙网的py文件,先导包: from selenium import webdriver import time # 导包 driver = webdriver.Chro

  • python爬虫selenium模块详解

    selenium模块 selenium基本概念 selenium优势 便捷的获取网站中动态加载的数据 便捷实现模拟登陆 selenium使用流程: 1.环境安装:pip install selenium 2.下载一个浏览器的驱动程序(谷歌浏览器) 3.实例化一个浏览器对象 基本使用 代码 from selenium import webdriver from lxml import etree from time import sleep if __name__ == '__main__': b

  • Python-Selenium自动化爬虫

    目录 1.安装 2.下载浏览器驱动 3.实例 3.1下载对应版本的浏览器驱动 3.2测试code,打开一个网页,并获取网页的标题 3.3一个小样例 3.4自动输入并跳转 4.开启无头模式 5.保存页面截图 6.模拟输入和点击 6.1根据文本值查找节点 6.2获取当前节点的文本 6.3打印当前网页的一些信息 6.4关闭浏览器driver.close()  # 关闭当前网页 6.5模拟鼠标滚动 7.ChromeOptions 8.验证滑块移动 9.打开多窗口和页面切换 10.Cookie操作 11.

  • python爬虫之利用selenium+opencv识别滑动验证并模拟登陆知乎功能

    滑动验证距离 分别获取验证码背景图和滑块图两张照片,然后利用opencv库,通过高斯模糊和Canny算法进行处理,然后通过matchTemplate方法进行两张图的匹配,获得滑动距离.需要注意的是,知乎验证码在进行操作的时候,需要在原有基础上再向右偏移10px距离 def get_distance(self, bg_img_path='./bg.png', slider_img_path='./slider.png'): """获取滑块移动距离""&quo

  • Python爬虫基础初探selenium

    Python爬虫.数据分析.网站开发等案例教程视频免费在线观看 https://space.bilibili.com/523606542 Selenium Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,就像玩游戏用的按键精灵,可以按指定的命令自动操作. Selenium测试工具直接操控浏览器中,就像真正的用户在操作一样.Selenium可以根据的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生等. selenium的用途 (

  • 一篇文章带你了解Python之Selenium自动化爬虫

    目录 Python之Selenium自动化爬虫 0.介绍 1.安装 2.下载浏览器驱动 3.实例 4.开启无头模式 5.保存页面截图 6.模拟输入和点击 a.根据文本值查找节点 b.获取当前节点的文本 c.打印当前网页的一些信息 d.关闭浏览器 e.模拟鼠标滚动 7.ChromeOptions 8.验证滑块移动 9.打开多窗口和页面切换 10.Cookie操作 11.模拟登录 12.使用代理 14.更换UA 15.鼠标悬停 16.优缺点 总结 Python之Selenium自动化爬虫 0.介绍

  • 一篇文章带你了解python异常基础

    目录 1. 程序中的问题 1.1 低级语法错误 1.2 中介错误:代码存在隐性错误 1.3 高级错误:软件面对不确定性的异常错误 2. 捕捉异常 2.1 基本异常捕捉语句 2.2 带finally子句的异常处理 2.3 try-except-else 结构 2.4 try-except-else-finally 结构 2.5 捕捉特定异常信息 3. 抛出异常 总结 1. 程序中的问题 1.1 低级语法错误 低级错误纯属语法错误,代码主要在编写.调试阶段就报错. >>> if True S

  • 一篇文章带你了解python标准库--time模块

    目录 1. 调用语法: 2. time概述 3. 时间获取 4. 时间格式化(将时间以合理的方式展示出来) 5. 程序计时应用 6. 示例 总结 Time库是python中处理时间的标准库 1. 调用语法: import time time.<b>() 计算机时间的表达,提供获取系统时间并格式化输出功能 提供提供系统精确即使功能,用于程序性能分析 2. time概述 time库包括三类函数 时间获取: time() ctime() gmtime() 时间格式化: strftime() strp

  • 一篇文章带你了解python字典基础

    目录 1. 字典基础知识 字典的基本格式表示 字典的键.值设置要求 1)键的设置要求 2)值的设置要求 2. 字典元素增加 1.利用赋值给字典增加元素 2.利用setdefault()方法给字典增加元素 3. 字典值查找 1.字典名+[key]查找 2.利用get()方法查找 4. 字典值修改 1.利用赋值修改键对应的值 2.利用update()方法修改键对应的值 5. 字典元素删除 1.利用del函数删除 2.利用pop()方法删除 3.利用popitem()方法删除 6. 字典遍历操作 1.

  • 一篇文章带你了解python标准库--math模块

    目录 1. math模块中的常用函数 2. 案例 2.1 浮点数求整 2.2 对元组里的每个元素求和 2.3 求数的绝对值 总结 python语言的一大优势:为科学计算提供了大量的支持功能,math模块提供了很多数学计算函数. math模块定义了一些数学模块,这个模块属于编译系统自带,因此它可以被无条件调用,需要注意的是,这些函数无法应用于复数. 1. math模块中的常用函数 2. 案例 2.1 浮点数求整 1.用trunc(x)取整,x为浮点数 >>> import math >

  • 一篇文章带你了解Python中的装饰器

    目录 前言 Python 中的装饰器是什么 语法糖 使用 Python 装饰器修改函数行为 使用 Python 装饰器对函数进行计时 使用 Python 装饰器将有用信息记录到终端 Web app 中使用的装饰器 将参数传递给 Python 装饰器 使用多个 Python 装饰器 总结 前言 本文将带你学习装饰器在 Python 中的工作原理,如果在函数和类中使用装饰器,如何利用装饰器避免代码重复(DRY 原则,Don’t Repeat Yourself ). Python 中的装饰器是什么 装

  • 一篇文章带你了解python标准库--sys模块

    目录 sys部分常用函数 1.sys.path函数用于获取模块文件搜索路径的字符串列表,或临时指定新的搜索路径 2.sys.platform为操作系统标识符判断函数 3.getwindowsversion()函数返回描述当前正在运行Windows版本信息的元组 总结 sys模块提供了与python解释器紧密相关的一些变量和函数. sys部分常用函数 函数 说明 path 获取模块文件搜索路径的字符串,或临时指定新搜索路径 platform 操作系统标识符判断函数 getwindowsversio

  • 一篇文章带你了解python正则表达式的正确用法

    目录 正则表达式的介绍 re模块 匹配单个字符 1.匹配任意一个字符 2.匹配[ ]中列举的字符 3.\d匹配数字,即0-9 4.\D匹配非数字,即不是数字 5.\s匹配空白,即 空格,tab键 6.\S匹配非空白 7.\w匹配非特殊字符,即a-z.A-Z.0-9._.汉字 8.\W匹配特殊字符,即非字母.非数字.非汉字 总结 正则表达式的介绍 1)在实际开发过程中经常会有查找符合某些复杂规则的字符串的需要,比如:邮箱.手机号码等,这时候想匹配或者查找符合某些规则的字符串就可以使用正则表达式了.

  • 一篇文章带你了解python集合基础

    目录 1. 集合类型定义 (1)集合是多个元素的无序组合 2. 集合操作符 3. 集合处理方法 4. 集合类型应用场景 (1)包含关系比较 (2)数据去重:集合数据所有元素无重复 总结 1. 集合类型定义 (1)集合是多个元素的无序组合 集合类型与数学中的集合概念一致 集合元素之间无序,每个元素唯一,不存在相同元素 集合元素不可更改,不能是可变数据类型 集合使用{}表示,元素间用英文逗号分隔 建立集合类型用{}或set() 建立空集合类型,必须使用set() a = {'python',256,

  • 一篇文章带你了解python元组基础

    目录 1. 元组基本知识 1.元组的基本格式和用法 2. 元组操作实例 1.建立元组 2.查找元素:通过元组下标实现. 3.删除元组:对元组的删除时不允许的,可以通过del函数,实现对整个元组对象的删除. 4.统计元素 5.合并元组 6.转换元组 总结 1. 元组基本知识 元组:是不可变的序列,也是一种可以存储各种数据类型的集合,用小括号(())表示与那组的开始和结束,元素之间用半角逗号(,)分隔.不可变指不能对元组对象进行增加元素.变换元素位置.修改元素.删除元素操作.元组中每个元素提供对应的

随机推荐