前期准备工作

下载python

对版本没有特别要求,建议是3.7以上版本。安装的时候注意勾选下方的Add Python 3.x to PATH

在这里插入图片描述

安装对应浏览器的webdriver

三种webdriver下载地址

注意:Chrome版本和chromedriver版本要匹配

配置环境

有两种方式:

  • 第一种:百度搜索如何将文件配置到环境变量中(不推荐)
  • 第二种:找到python的IDLE,右键选择打开文件所在目录,将下载好的driver粘贴到该目录下即可

浏览器对应的类名

我们通过查看webdriver的源码可以看到所支持的类型,不仅仅局限于我们提到的三种,包括Edge等等,我们推荐使用谷歌或者火狐。
火狐浏览器对应的类名是Firefox(),谷歌浏览器对应的类名是Chrome()
在这里插入图片描述


webdriver模板

from selenium import webdriver
from lxml import etree

# 创建webdriver
browser = webdriver.Chrome()  # 创建谷歌浏览器的webdriver,写成webdriver.Firefox()表示创建火狐浏览器的webdriver
url = "https://www.baidu.com"
# 开始请求
driver.get(url)
#得到页面源代码
response=driver.page_source   #字符串形式
html=etree.HTML(response)

#提取信息
title=html.xpath['']

#关闭浏览器
browser.quit()
#关闭chreomedriver进程
browser.close()

PhantomJS无头浏览器的使用

PhantomJS是一个不会显示界面的浏览器,已经停止更新,selenium也不推荐使用它,而是使用我们常用浏览器的无头模式

from selenium import webdriver
url = 'https://www.baidu.com/'
driver = webdriver.PhantomJS(executable_path=r"你的PhantomJS地址,配置到环境变量中可以不写")
driver.get(url)

启用浏览器无头模式

from selenium import webdriver

chrome_options=webdriver.ChromeOptions()
chrome_options.add_argument('--headless')#设置无页面模式

driver = webdriver.Chrome(options=chrome_options)  # 这样就好了

便携版Chrome的使用

有人不想在电脑里安装Chrome,我们可以下载便携版的Chrome,然后在创建driver的时候指定浏览器exe文件的地址即可。

注:便携版Chrome也要和driver配套嗷


chrome_options参数介绍

from selenium import webdriver

chrome_options=webdriver.ChromeOptions()
chrome_options.add_argument('--praxy-srever=http://171.12.313.34:9999')#设置代理ip
chrome_options.add_argument('--user-agent=')#设置user-agent,可以设置成手机端的
chrome_options.add_argument('--headless')#设置无页面模式
driver = webdriver.Chrome(options=chrome_options)

# 开始请求
url = "https://www.baidu.com"
driver .get(url)
#打印页面源代码
print(browser.page_source)
#关闭浏览器
driver .quit()
#关闭chreomedriver进程

页面三种等待方式

  • 强制等待。使用time.sleep()
  • 隐式等待。程序会一直等待整个页面加载完成才会执行下一步
  • 显示等待。设置最长等待时间,规定时间内等到了就不再继续等,超时会报错
import time
from selenium import webdriver

driver = webdriver.Chrome()

# 强制等待
def wait1():
    time.sleep(5)

#隐式等待
def wait2():
    #设置隐式等待,隐性等待对整个driver的周期都起作用,所以只要设置一次即可。放在get上面
    #有一个弊端:程序会一直等待整个页面加载完成,即你看到浏览器标签栏那个小圈不再转,才会执行下一步
    driver.implicitly_wait(10)
    driver.get('www.baidu.som')

# 显式等待,只要出现想要的那个元素就停止等待
def wait3():
    #显示等待。第3秒就找到了这个元素,那么也就不会多等剩下的7秒使时间,而是继续执行后续代码。
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    try:
        element = WebDriverWait(driver, 10,0.5).until(
            EC.presence_of_element_located((By.ID, "myDynamicElement"))
        )
        #10代表如果10秒还不出来就算超时,0.5代表检查间隔时间(步长),默认为0.5
    finally:
        driver.quit()
    '''
    一些其他的等待条件:
    presence_of_element_located:某个元素已经加载完毕了。
    presence_of_all_emement_located:网页中所有满足条件的元素都加载完毕了。
    element_to_be_cliable:某个元素是可以点击了
    '''



常用操作

模拟滑动

#模拟向下滑动,记得做循环
driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")#先下滑到底    0代表坐标
driver.execute_script("window.scrollTo(1000,document.body.scrollHeight)")#再上滑一下    1000代表坐标

'''
window.scrollBy(0,500)     向下滚动500个像素
window.scrollBy(0,-500)   向上滚动500个像素
window.scrollBy(500,0)     向右滚动500个像素
window.scrollBy(-500,0)   向左滚动500个像素
'''

选中元素

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

#输入查询的字,可以根据id、class_name、name、tag_name、xpath、css选择器来选择,具体看你想弄的地方有什么可选的
# 旧版写法
# inputTag = driver.find_element_by_class_name('tt-input__inner')

# 新版写法
inputTag  = driver.find_element(By.CLASS_NAME, 'tt-input__inner')

填入文本

#输入查询的字,可以根据id、class_name、name、tag_name、xpath、css选择器来选择,具体看你想弄的地方有什么可选的
inputTag = driver.find_element_by_class_name('tt-input__inner')
inputTag.send_keys('银行')  # 填入文本

点击选中的元素

inputTag = driver.find_element_by_xpath('tt-input-group__append')
inputTag.click()

页面截图

#页面截图
driver.save_screenshot('到此一游.png')

切换浏览器页面

#切换浏览器页面。因为虽然显示带开了新页面,但url信息并不会转移到新页面
windows=driver.window_handles#得到当前所有窗口
driver.switch_to.window(windows[1])#根据索引进行选择

访问frame标签

#访问frame标签。即html中嵌套了新的html,例如QQ空间
login_frame=driver.find_element_by_id('login_frame')#定位到framde的位置
driver.switch_to.frame(login_frame)#切换至frame中,然后就能对frame里面的东西进行操作了

获取cookie

#获取cookie
print(driver.get_cookies())#得到列表,不仅包含name,value还包含其他信息
cookie_dict={cookie['name']:cookie['value'] for cookie in driver.get_cookies()}#通常这样配合requests库使用cokie信息

屏蔽浏览器的selenium标记

from selenium import webdriver

driver = webdriver.Chrome()
url = 'https://www.wjx.cn/vm/exA8tke.aspx'
driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
    'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
})
driver.get(url)

注意:新版selenium获取元素方式为driver.find_element(By.ID, 'divNext')

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐