我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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由于在获取页面的过程中会发送很多请求,所以效率非常低,所以在很多时候需要酌情使用。

总结

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

一篇文章带你了解webscraper爬虫插件

最近看到很多同学都在研究爬虫,然后我想到了一款尘封已久的插件,很早之前在我刚接触爬虫的时候用过,不过自从上了python爬虫过后,慢慢就搁置了,今天花时间撸一篇教程,给同学们安利这款插件,如果刚开始学爬虫,它一定是你通往人生巅峰的不二人选哦
2023-06-01

一篇文章带你入门Appium自动化测试

Appium工具自动化测试 前言一、appium支持三种类型的应用二、设计原理三、Appium的实际应用三、搭建测试环境1.安装JDK2.安装Android SDK3.安装对应的Python Client4.安装appium-de
一篇文章带你入门Appium自动化测试
2023-12-23

一篇文章带你了解Python递归函数

递归是一种常见的编程技巧,在Python中也可以通过递归函数来实现。递归函数是指在函数的定义中调用函数本身的情况。通过递归函数,我们可以解决一些需要重复执行相同操作的问题。首先,让我们来看一个简单的例子,计算一个数的阶乘。阶乘是指从1到该数
2023-09-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录