高级爬虫: 使用 Selenium 浏览器

2023-05-16

 安装Selenium和chromedriver:

因为 Selenium 需要操控你的浏览器, 所以安装起来比传统的 Python 模块要多几步. 先在 terminal 或者 cmd 用 pip 安装 selenium.

# python 2+
pip install selenium

# python 3+
pip3 install selenium

要操控浏览器, 你就要有浏览器的 driver. Selenium 针对几个主流的浏览器都有 driver. 针对 Linux 和 MacOS.下载完成后,放到不需要权限的纯英文目录下就可以了。

也有所放在Windows 的环境变量中(PATH)两者使用方法有差别

Chrome:https://sites.google.com/a/chromium.org/chromedriver/downloads
Edge:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
Firefox:https://github.com/mozilla/geckodriver/releases
Safari:https://webkit.org/blog/6900/webdriver-support-in-safari-10/

python使用selenium

没有放在path路径下需要

from selenium import webdriver
# chromedriver的绝对路径
driver_path = r'F:\su\soft\chromedriver_win32\chromedriver.exe'
# 初始化一个driver,并且指定chromedriver的路径
driver = webdriver.Chrome(executable_path=driver_path)

配置完环境可以

设置环境变量

 


#Simple assignment
from selenium.webdriver import Chrome

driver = Chrome()

#Or use the context manager
from selenium.webdriver import Chrome

with Chrome() as driver:
    #your code inside this indent
  


path中加入chromedriver的路径,也可以放到python目录下,一般我们的python已经配置过环境了

这样就可以使用了

关闭页面:

  1. driver.close():关闭当前页面。
  2. driver.quit():退出整个浏览器。

定位元素:

  1. find_element_by_id:根据id来查找某个元素。等价于:
     submitTag = driver.find_element_by_id('su')
     submitTag1 = driver.find_element(By.ID,'su')
    
  2. find_element_by_class_name:根据类名查找元素。 等价于:
     submitTag = driver.find_element_by_class_name('su')
     submitTag1 = driver.find_element(By.CLASS_NAME,'su')
    
  3. find_element_by_name:根据name属性的值来查找元素。等价于:
     submitTag = driver.find_element_by_name('email')
     submitTag1 = driver.find_element(By.NAME,'email')
    
  4. find_element_by_tag_name:根据标签名来查找元素。等价于:
     submitTag = driver.find_element_by_tag_name('div')
     submitTag1 = driver.find_element(By.TAG_NAME,'div')
    
  5. find_element_by_xpath:根据xpath语法来获取元素。等价于:
     submitTag = driver.find_element_by_xpath('//div')
     submitTag1 = driver.find_element(By.XPATH,'//div')
    
  6. find_element_by_css_selector:根据css选择器选择元素。等价于:

     submitTag = driver.find_element_by_css_selector('//div')
     submitTag1 = driver.find_element(By.CSS_SELECTOR,'//div')
    

    要注意,find_element是获取第一个满足条件的元素。find_elements是获取所有满足条件的元素。

操作表单元素:

  1. 操作输入框:分为两步。第一步:找到这个元素。第二步:使用send_keys(value),将数据填充进去。示例代码如下:

     inputTag = driver.find_element_by_id('kw')
     inputTag.send_keys('python')
    

    使用clear方法可以清除输入框中的内容。示例代码如下:

     inputTag.clear()
    
  2. 操作checkbox:因为要选中checkbox标签,在网页中是通过鼠标点击的。因此想要选中checkbox标签,那么先选中这个标签,然后执行click事件。示例代码如下:

     rememberTag = driver.find_element_by_name("rememberMe")
     rememberTag.click()
    
  3. 选择select:select元素不能直接点击。因为点击后还需要选中元素。这时候selenium就专门为select标签提供了一个类selenium.webdriver.support.ui.Select。将获取到的元素当成参数传到这个类中,创建这个对象。以后就可以使用这个对象进行选择了。示例代码如下:

     from selenium.webdriver.support.ui import Select
     # 选中这个标签,然后使用Select创建对象
     selectTag = Select(driver.find_element_by_name("jumpMenu"))
     # 根据索引选择
     selectTag.select_by_index(1)
     # 根据值选择
     selectTag.select_by_value("http://www.95yueba.com")
     # 根据可视的文本选择
     selectTag.select_by_visible_text("95秀客户端")
     # 取消选中所有选项
     selectTag.deselect_all()
    
  4. 操作按钮:操作按钮有很多种方式。比如单击、右击、双击等。这里讲一个最常用的。就是点击。直接调用click函数就可以了。示例代码如下:

     inputTag = driver.find_element_by_id('su')
     inputTag.click()
    

行为链:

有时候在页面中的操作可能要有很多步,那么这时候可以使用鼠标行为链类ActionChains来完成。比如现在要将鼠标移动到某个元素上并执行点击事件。那么示例代码如下:

from selenium.webdriver import Chrome
from selenium.webdriver.common.action_chains import ActionChains
driver = Chrome()
driver.get("https://www.douban.com/")
inputTag = driver.find_element_by_id('kw')
submitTag = driver.find_element_by_id('su')

actions = ActionChains(driver)
actions.move_to_element(inputTag)
actions.send_keys_to_element(inputTag,'python')
actions.move_to_element(submitTag)
actions.click(submitTag)
actions.perform()

还有更多的鼠标相关的操作。

  • click_and_hold(element):点击但不松开鼠标。
  • context_click(element):右键点击。
  • double_click(element):双击。 更多方法请参考:http://selenium-python.readthedocs.io/api.html

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)
    

页面等待:

现在的网页越来越多采用了 Ajax 技术,这样程序便不能确定何时某个元素完全加载出来了。如果实际页面等待时间过长导致某个dom元素还没出来,但是你的代码直接使用了这个WebElement,那么就会抛出NullPointer的异常。为了解决这个问题。所以 Selenium 提供了两种等待方式:一种是隐式等待、一种是显式等待。

  1. 隐式等待:调用driver.implicitly_wait。那么在获取不可用的元素之前,会先等待10秒中的时间。示例代码如下:

    driver = webdriver.Chrome(executable_path=driver_path)
    driver.implicitly_wait(10)
    # 请求网页
    driver.get("https://www.douban.com/")
    
  2. 显示等待:显示等待是表明某个条件成立后才执行获取元素的操作。也可以在等待的时候指定一个最大的时间,如果超过这个时间那么就抛出一个异常。显示等待应该使用selenium.webdriver.support.excepted_conditions期望的条件和selenium.webdriver.support.ui.WebDriverWait来配合完成。示例代码如下:

     from selenium import webdriver
     from selenium.webdriver.common.by import By
     from selenium.webdriver.support.ui import WebDriverWait
     from selenium.webdriver.support import expected_conditions as EC
    
     driver = webdriver.Firefox()
     driver.get("http://somedomain/url_that_delays_loading")
     try:
         element = WebDriverWait(driver, 10).until(
             EC.presence_of_element_located((By.ID, "myDynamicElement"))
         )
     finally:
         driver.quit()
    
  3. 一些其他的等待条件:

    • presence_of_element_located:某个元素已经加载完毕了。
    • presence_of_all_emement_located:网页中所有满足条件的元素都加载完毕了。
    • element_to_be_cliable:某个元素是可以点击了。

      更多条件请参考:http://selenium-python.readthedocs.io/waits.html

切换页面:

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

# 打开一个新的页面
driver.execute_script("window.open('https://baike.baidu.com/')")
# 切换到这个新的页面中
driver.switch_to_window(driver.window_handles[1])
print (driver.current_url)
print (driver.page_source)

#虽然在窗口中切换到了新的页面。但是driver中还没有切换。
#如果想要在代码中切换到新的页面,并且做一些爬虫。
#那么应该使用driver.switch_to_window来切换到指定的窗口·从driver.window_handles中取出具体第几个窗口
#driver.window_handler提一个列表,里面装的都是窗口句柄。手他会按照打开页面的顺序来存储窗口的句柄。

设置代理ip:

有时候频繁爬取一些网页。服务器发现你是爬虫后会封掉你的ip地址。这时候我们可以更改代理ip。更改代理ip,不同的浏览器有不同的实现方式。这里以Chrome浏览器为例来讲解:

from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://110.73.2.248:8123")
driver_path = r"D:\ProgramApp\chromedriver\chromedriver.exe"
driver = webdriver.Chrome(executable_path=driver_path,chrome_options=options)

driver.get('http://httpbin.org/ip')

WebElement元素:

from selenium.webdriver.remote.webelement import WebElement类是每个获取出来的元素的所属类。
有一些常用的属性:

  1. get_attribute:这个标签的某个属性的值。
  2. screentshot:获取当前页面的截图。这个方法只能在driver上使用。
    driver的对象类,也是继承自WebElement
    更多请阅读相关源代码。

参考资料:https://selenium-python.readthedocs.io/installation.html#introduction

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

高级爬虫: 使用 Selenium 浏览器 的相关文章

随机推荐

  • 刷题之sum-closest

    给定一个包括 n 个整数的数组 nums 和 一个目标值 target 找出 nums 中的三个整数 xff0c 使得它们的和与 target 最接近 返回这三个数的和 假定每组输入只存在唯一答案 示例 xff1a 输入 xff1a num
  • 使用requests和xpath爬取电影天堂

    import requests from lxml import etree from openpyxl import Workbook URL 61 39 https dytt8 net html gndy dyzz list 23 1
  • day4数组之 删除排序数组中的重复项

    26删除排序数组中的重复项 给定一个排序数组 xff0c 你需要在 原地 删除重复出现的元素 xff0c 使得每个元素只出现一次 xff0c 返回移除后数组的新长度 不要使用额外的数组空间 xff0c 你必须在 原地 修改输入数组 并在使用
  • 爬虫之BeautifulSoup4库详解

    BeautifulSoup4库 和 lxml 一样 xff0c Beautiful Soup 也是一个HTML XML的解析器 xff0c 主要的功能也是如何解析和提取 HTML XML 数据 lxml 只会局部遍历 xff0c 而Beau
  • 在 VirtualBox 中安装 Debian 虚拟机

    在 VirtualBox 中安装 Debian 虚拟机 手把手一步一步带你在VirtualBox中安装Debian虚拟机 xff1b 打开VirtualBox软件点击新建 xff1a 配置信息 xff08 示例 xff09 xff1a 名称
  • 爬虫中国天气网数据并可视化

    中国天气网爬虫数据可视化 爬虫功能网页分析 以华北地区为例分析网页源代码 1 以谷歌浏览器为例分析2 提取特征标签3 分析源代码利用requests库获取目标网页源代码利用BeautifulSoup库提取天气信息港澳台地区代码分析分析数据数
  • day5刷题之 删除排序数组中的重复项 II

    80 删除排序数组中的重复项 II 难度中等361 给定一个增序排列数组 nums xff0c 你需要在 原地 删除重复出现的元素 xff0c 使得每个元素最多出现两次 xff0c 返回移除后数组的新长度 不要使用额外的数组空间 xff0c
  • day7刷题之二分搜索2

    33 搜索旋转排序数组 难度中等1187收藏分享切换为英文接收动态反馈 升序排列的整数数组 nums 在预先未知的某个点上进行了旋转 xff08 例如 xff0c 0 1 2 4 5 6 7 经旋转后可能变为 4 5 6 7 0 1 2 x
  • day6刷题之二分搜索1

    二分查找代码 class Solution public int searchInsert int nums int target int left 61 0 right 61 nums length 1 注意循环条件 while left
  • 正则表达式补充篇

    1 re match和re search match 和search 的区别 xff1a match xff08 xff09 函数只检测RE是不是在string的开始位置匹配 xff0c search 会扫描整个string查找匹配matc
  • 爬虫实战之爬取古诗文网站 (详细)

    爬取古诗文网站 重点是练习正则表达式的使用 链接变化 url base 61 39 https www gushiwen cn default aspx 39 for i in range 1 2 print 39 正在爬取第 页 xff1
  • 利用Python爬取糗事百科段子信息

    有个博客很详细https blog csdn net weixin 42488570 article details 80794087 要求 xff1a 用户ID xff0c 用户等级 xff0c 用户性别 xff0c 发表段子文字信息 x
  • 爬虫之数据存储(json,csv,mysql)等

    JSON支持数据格式 xff1a 对象 xff08 字典 xff09 使用花括号 数组 xff08 列表 xff09 使用方括号 整形 浮点型 布尔类型还有null类型 字符串类型 xff08 字符串必须要用双引号 xff0c 不能用单引号
  • MongoDB的安装及配置服务及使用

    安装配置 https blog csdn net heshushun article details 77776706 1 先在安装目录data文件下创建一个新文件夹log xff08 用来存放日志文件 xff09 2 在Mongodb安装
  • python多线程学习

    Python3 线程中常用的两个模块为 xff1a thread xff08 已经废弃 xff09 threading 推荐使用 线程模块 Python3 通过两个标准库 thread 和 threading 提供对线程的支持 thread
  • 爬虫实战之多线程下载表情包

    一般下载 import requests from lxml import etree import os import re from urllib request import urlretrieve headers 61 39 Use
  • 卷积padding,kernel_initializer

    TensorFlow和 keras layers convolutional Conv1D和tf layers Conv1D函数 keras layers convolutional Conv1D filters kernel size s
  • python刷题之链表常见操作

    链表常用操作 也可以把列表当做队列用 xff0c 只是在队列里第一加入的元素 xff0c 第一个取出来 xff1b 但是拿列表用作这样的目的效率不高 在列表的最后添加或者弹出元素速度快 xff0c 然而在列表里插入或者从头部弹出速度却不快
  • 刷题之链表

    链表相关 19 删除链表的倒数第 N 个结点 难度中等1261收藏分享切换为英文接收动态反馈 给你一个链表 xff0c 删除链表的倒数第 n 个结点 xff0c 并且返回链表的头结点 进阶 xff1a 你能尝试使用一趟扫描实现吗 xff1f
  • 高级爬虫: 使用 Selenium 浏览器

    安装Selenium和chromedriver xff1a 因为 Selenium 需要操控你的浏览器 所以安装起来比传统的 Python 模块要多几步 先在 terminal 或者 cmd 用 pip 安装 selenium python