selenium的学习和使用
1.Selenium+Chrome的配置
from selenium import webdriver from selenium.webdriver.chrome.options import Options # 实例化对象 option = Options() # 配置无界面谷歌浏览器 # option.add_argument('--headless') # 启动开发者模式(关闭chrome控制) option.add_experimental_option("excludeSwitches", ["enable-automation"]) option.add_experimental_option("useAutomationExtension", 'False') # 调用谷歌浏览器 driver = webdriver.Chrome(r'E:\chromedriver\chromedriver.exe', options=option) # 发起请求 driver.get('https://www.baidu.com') #最大窗口化 # 注意:爬虫最好将窗口最大化后再进行抓取 # 原因:如果获取的数据如果在窗口中没有,可能会获取不到 driver.maximize_window()
注意:
1. selenium运行速度非常慢,如果不是特别需要,尽量不使用selenium
2. 使用selenium之后,尽可能不要使用selenium的提取数据的方法
3. selenium主要用于页面的请求
2.Selenium+PhantomJS(无界面浏览器)的组合使用
# 安装:pip install selenium # selenium的使用步骤: # 1. 导入webdriver import time from selenium import webdriver from selenium.webdriver.common.keys import Keys # 2. 调用浏览器 driver = webdriver.PhantomJS(executable_path=r'D:\phantomjs-2.1.1-windows\bin\phantomjs.exe') # 3. 访问网址 driver.get(url='https://www.baidu.com/') # 4. 方法及属性 # 4.1 title 获取网页标题 # print(driver.title) # 4.2 current_url 获取当前请求的URL # print(driver.current_url) # 4.3 page_source 获取页面内容 # print(driver.page_source) # 4.4 get_cookies() 获取cookie # print(driver.get_cookies()) # 4.5 查找元素 # 4.5.1 根据id查找元素 # find_element_by_id('id值') # kw = driver.find_element_by_id('kw') # print(kw) # <selenium.webdriver.remote.webelement.WebElement (session="2362c650-d4bf-11eb-9f3d-0d52f2b7d981", element=":wdc:1624520297180")> # 4.5.2 根据class查找元素 # find_element_by_class_name('类名') 查找第一个符合类名的元素 # find_elements_by_class_name('类名') 返回列表,查找所有符合类名的元素 # s_ipt = driver.find_elements_by_class_name('s_ipt') # print(s_ipt) # [<selenium.webdriver.remote.webelement.WebElement (session="805f3fa0-d4bf-11eb-946f-7fab7674449d", element=":wdc:1624520453128")>] # s_ipt = driver.find_element_by_class_name('s_ipt') # print(s_ipt) # 4.5.3 根据xpath来查找元素 # find_element_by_xpath('xpath的路径') # find_elements_by_xpath('xpath的路径') # res = driver.find_element_by_xpath('//input[@id="kw"]') # print(res) # 4.6 text 获取标签之间的内容 # content = driver.find_element_by_id('s-top-left').text # content = driver.find_element_by_xpath('//div[@id="s-top-left"]').text # print(content) # 4.7 get_attribute('属性名') # print(driver.find_element_by_id('kw').get_attribute('class')) # 4.8 截图 # save_screenshot() # driver.save_screenshot('baidu.png') # 4.9 send_keys('输入的内容') # 步骤: # 1.先获取文本框 # 2.再输入内容 # driver.find_element_by_xpath('//input[@id="kw"]').send_keys('金所炫') # driver.save_screenshot('输入.png') # 4.10 click() 点击 # driver.find_element_by_id('su').click() # time.sleep(2) # driver.save_screenshot('点击.png') # 4.11 支持快捷键 driver.find_element_by_id('kw').send_keys('金所炫') driver.save_screenshot('全选之前.png') driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'a') driver.save_screenshot('全选.png') driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'x') driver.save_screenshot('剪切.png')
3.selenium反爬处理
浏览器能够识别当前操作是人为,还是selenium操作 ,如果window.navigator.webdriver=True时说明控制浏览器的是selenium,因此如何解决这个问题是反爬必要的一步。个人推荐方法2,它是封装好的可以绕过webdriver检测的js代码。js下载地址:https://files.cnblogs.com/files/Liu928011/stealth.min.js
from selenium import webdriver driver = webdriver.Chrome(executable_path=r'D:\chrome\chromedriver.exe')
# 方法1、处理selenium中webdriver特征值 # driver.execute_cdp_cmd( # 'Page.addScriptToEvaluateOnNewDocument', # { # 'source':'Object.defineProperty(navigator,"webdriver",{get:()=>undefined})' # } # ) # 方法2、读取js文件内容 with open('stealth.min.js','r',encoding='utf-8') as fp: content = fp.read() driver.execute_cdp_cmd( 'Page.addScriptToEvaluateOnNewDocument', { 'source':content } ) driver.get('https://www.baidu.com')
4.selenium应用过程中遇到的问题
1.IE浏览器中的SSL认证问题
# IE如果出现私密连接的提示,解决办法添加下面代码 driver.execute_script("javascript:document.getElementById('overridelink').click()")
2.如果driver.find_element_by_id('id名').click(),无效,解决办法,改用js单击
driver.execute_script("document.getElementById('id名').click()")
天青色等烟雨而我在等你!