活动地址:CSDN21天学习挑战赛
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。
一、浅入selenium
1、简单介绍selenium
selenium是一个用于测试web程序的框架,该框架测试直接在浏览器中运行,就像真实用户操作的一样。selenium在爬虫领域同样也是一把利器,可以解决绝大部分网站的反爬问题。selenium可以根据我们的指令让浏览器自动加载页面,获取需要的数据,甚至可以进行页面截屏等操作,或者判断网站上某些动作是否发生。
2、下载安装selenium模块
在命令行或者pycharm终端输入下面命令:
pip install selenium
3、安装浏览器驱动WebDriver
selenium库有一个叫WebDriver的API,WebDriver很像加载网站的浏览器,但是它也可以像BeautifulSoup或者其他selector对象一样用来查找页面元素,与页面上的元素进行交互(发送文本、点击等操作),以及执行其他动作。 Chrome浏览器驱动下载地址: http://chromedriver.storage.googleapis.com/index.html Firefox浏览器驱动下载地址: https://github.com/mozilla/geckodriver/releases/ Edge浏览器驱动下载地址: https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/#downloads PhantomJS安装
注意:需要下对应浏览器版本的驱动,版本在浏览器的设置里面查看
二、基本操作
1、打开浏览器
from selenium import webdriver # 浏览器的初始化 browser = webdriver.Edge() # 发送请求 browser.get('https://www.baidu.com/') # 打印页面的标题 print(browser.title) # 退出模拟浏览器 browser.quit() # 一定要退出!不退出会有残留进程
2、无界面模式
Headless 模式是 Chrome 浏览器的无界面形态,可以在不打开浏览器的前提下,使用所有 Chrome 支持的特性运行我们的程序
from selenium import webdriver # 1. 实例化配置对象 chrome_options = webdriver.ChromeOptions() # 2. 配置对象添加开启无界面命令 chrome_options.add_argument('--headless') # 3. 配置对象添加禁用gpu命令 chrome_options.add_argument('--disable-gpu') # 4. 实例化带有配置对象的browser 对象 browser = webdriver.Chrome(chrome_options=chrome_options) browser.get('https://www.baidu.com/') # 查看请求的数据 print(browser.page_source) # 查看渲染后的数据,就可以Xpath进行解析获取数据了 print(browser.get_cookies()) # 查看请求页面后的cookies值 print(browser.current_url) # 查看请求url # 关闭页面 browser.close() # 关闭浏览器 browser.quit()
3、元素定位
from selenium import webdriver browser = webdriver.Edge('C:\\Users\\86178\\AppData\\Local\\Programs\\Python\\Python38\\msedgedriver.exe') url = 'https://www.baidu.com/' browser.get(url) html_str = browser.page_source print(html_str)
运行结果:
①根据id属性值获取元素列表
from selenium.webdriver.common.by import By # 获取第一个元素 a = browser.find_element(by=By.ID, value="s_is_result_css") # 引号里面是id属性值 # 获取多个元素 b = browser.find_elements(by=By.ID, value="s_is_result_css") print(a, b)
运行结果:
②根据class获取元素列表
# 获取第一个元素 browser.find_element(by=By.CLASS_NAME, value="element") # 引号里面是class值 # 获取多个元素 browser.find_elements(by=By.CLASS_NAME, value="element")
③根据xpath获取元素列表
# 返回标签为li,id为element的所有元素 browser.find_element(by=By.XPATH, value="//li[@id='element']") browser.find_elements(by=By.XPATH, value="//li[@id='element']")
④根据标签的文本获取元素列表(精确定位)
# 获取一个元素 browser.find_element(by=By.LINK_TEXT, value="Foo") # 获取多个元素 browser.find_elements(by=By.LINK_TEXT, value="Foo")
⑤根据标签包含的文本获取元素列表(模糊定位)
# 获取一个元素 browser.find_element(by=By.PARTIAL_LINK_TEXT, value="Fo") # 获取多个元素 browser.find_elements(by=By.PARTIAL_LINK_TEXT, value="Fo")
⑥根据标签名获取元素列表
# 获取一个元素 browser.find_element(by=By.TAG_NAME, value="li") # 获取多个元素 browser.find_elements(by=By.TAG_NAME, value="li")
4、元素操作
①获取文本(通过定位获取的标签对象的text属性获取文本内容):element.text
ret = browser.find_element_by_class_name('element') print(ret[0].text)
②获取属性值(通过定位获取的标签对象的get_attribute函数,传入属性名,来获取属性的值)
ret = browser.find_element_by_tag_name('a') print(ret[0].get_attribute('href'))
5、网页的前进与后退
# 前进 browser.forward() # 后退 browser.back()
6、执行js
selenium可以让浏览器执行我们规定的js代码:browser.execute_script(js)
from selenium import webdriver browser = webdriver.Chrome() url = 'https://www.baidu.com/' browser.get(url) js = 'window.scrol1To(O,document.body.scrollHeight)' # js语句 browser.execute_script(js) # 执行js的方法 browser.quit()
7、页面等待
现在的网页越来越多采用了 Ajax 技术,这样程序便不能确定何时某个元素完全加载出来了。如果实际页面等待时间过长导致某个dom元素还没出来,但是你的代码直接使用了这个WebElement,那么就会抛出NullPointer的异常。 为了避免这种元素定位困难而且会提高产生 ElementNotVisibleException 的概率。所以 Selenium 提供了两种等待方式,一种是隐式等待,一种是显式等待。 隐式等待是等待特定的时间,显式等待是指定某一条件直到这个条件成立时继续执行。
①隐式等待
隐式等待针对的是元素定位,隐式等待设置了一个时间,在一段时间内判断元素是否定位成功,如果完成了,就进行下一步。在设置的时间内没有定位成功,则会报超时加载。
from selenium import webdriver driver = webdriver.Chrome() driver.implicitly_wait(10) # 隐式等待10秒 driver.get('https://www.baidu.com/') myDynamicElement = driver.find_element_by_id("input")
②显示等待
显式确定等待指定某个元素,然后设置最长等待时间。如果在这个时间还没有找到元素,那么便会抛出异常了。
from selenium import webdriver from selenium.webdriver.common.by import By # WebDriverWait 库,负责循环等待 from selenium.webdriver.support.ui import WebDriverWait # expected_conditions 类,负责条件出发 from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.get('https://www.baidu.com/') try: # 页面一直循环,直到 id="input" 出现 element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "input")) ) finally: driver.quit()
三、进阶操作
1、代理ip
selenium控制浏览器是可以使用代理ip的,这样可以减小被封ip的可能性。
from selenium import webdriver import time # 1. 实例化配置对象 options = webdriver.ChromeOptions() # 2. 配置对象添加使用代理ip的命令 options.add_argument('--proxy-server=http://ip地址') # 代理IP:端口号 # 3. 实例化带有配置对象的driver对象 driver = webdriver.Chrome(chrome_options=options) driver.get("https://www.baidu.com") # 获取页面内容 print(driver.page_source) # 延迟3秒后关闭当前窗口,如果是最后一个窗口则退出 time.sleep(3) driver.close()
2、修改请求头
selenium可以修改请求头,伪装不同的浏览器
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' # 1. 实例化配置对象 options = webdriver.ChromeOptions() # 2. 配置对象修改请求头 options.add_argument('--user-agent=' + agent) # 3. 实例化带有配置对象的driver对象 driver = webdriver.Chrome(chrome_options=options) driver.get("https://www.baidu.com") # 获取页面内容 print(driver.page_source) # 延迟3秒后关闭当前窗口,如果是最后一个窗口则退出 time.sleep(3) driver.close()
3、隐藏浏览器指纹特征
selenium操作浏览器,有几十个特征可以被网站检测到,轻松识别你是爬虫。
解决浏览器指纹特征的关键就是一个stealth.min.js文件,通过执行这个js文件可以隐藏浏览器指纹。
stealth.min.js文件下载地址:阿里云盘分享
添加请求头+执行stealth.min.js文件进行隐藏浏览器指纹:
from selenium import webdriver chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-gpu') # 添加请求头伪装浏览器 chrome_options.add_argument( 'user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36') driver = webdriver.Chrome(chrome_options=chrome_options) with open('stealth.min.js') as f: js = f.read() driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { "source": js }) driver.get('https://bot.sannysoft.com/') driver.save_screenshot('2.png')
以上便是小y的学习笔记,小y希望和大家共同进步!
欢迎点赞+收藏+关注!
版权归原作者 小 y 同 学 所有, 如有侵权,请联系我们删除。