🧑个人主页:
👨🎓作者简介:小白一枚。
🐋希望大家多多支持😘一起进步!
✍如果文章对你有帮助的话,欢迎评论💬点赞👍 收藏📑➕关注🤞
目录
活动地址:CSDN21天学习挑战赛
1. Selenium概述
Selenium是一个用于测试Web应用程序的框架,该框架测试直接在浏览器中运行,就像真实用户操作一样。在爬虫领域selenium同样是一把利器,能够解决大部分的网页的反爬问题。Selenium可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。
selenium作为Python的第三方库,需要进行下载。
Selenium操作浏览器,需要在浏览器中安装驱动WebDriver。Selenium库中有个叫WebDriver的API,WebDriver有点像可以加载网页的浏览器,但是它可以像BeautifulSoup或者其他Selector对象一样用来查找页面元素,与页面上的元素进行交互(发送、点击等),以及执行其他操作。
浏览器 | 下载地址 |
---|---|
Chrome浏览器 | http://chromedriver.storage.googleapis.com/index.html |
Firefox浏览器 | http://chromedriver.storage.googleapis.com/index.html |
Edge浏览器 | https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/#downloads |
PhantomJS无界面浏览器,可以把网站加载到内存并执行页面上的JavaScript,因为不会展示图形界面,所以运行器来比完整的浏览器高效。
以Chrome浏览器为例下载浏览器驱动:
1)查看自己的浏览器版本
2)打开浏览器驱动下载网站,选择版本最接近的,并不一定有对应的版本,选择最相近的即可
3)选择自己对应的电脑版本。windos的没有win64,选win32即可
4)放到自己的Python安装路径下
由于我的电脑上安装了Anaconda,所以需要安装在Anaconda安装目录。
2. 基础操作
2.1 打开浏览器
from selenium import webdriver
#浏览器初始化
brower = webdriver.Chrome() #Chrome浏览器
# brower = webdriver.Firefox() #Firefox浏览器
# brower = webdriver.Edge() #Edge浏览器
# brower = webdriver.PhantomJS() #PhantomJS浏览器
#发送请求
brower.get('https://www.baidu.com')
#打印页面的标题
print(brower.title) #输出:百度一下,你就知道
#退出浏览器
brower.quit() #一定要退出,不退出会有残留进程
2.2 Chrome浏览器无界面模式
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对象
brower = webdriver.Chrome(chrome_options=chrome_options)
#发送请求
brower.get('https://www.baidu.com')
#查看请求的数据
print(brower.page_source) #查看渲染后的数据,就可以Xpath进行解析数据了
print(brower.get_cookies()) #查看请求网页后的cookies值
print(brower.current_url) #查看请求url
#关闭页面
brower.close()
#关闭浏览器
brower.quit()
2.3 元素定位
通过selenium的基本使用就可以简单操作浏览器了,接下来我们学习下定位元素的其他方法。
from selenium import webdriver
from selenium.webdriver.common.by import By
#1.实例化配置对象
chrome_options = webdriver.ChromeOptions()
#2.配置对象添加开启无界面命令
chrome_options.add_argument('--headless')
#3.实例化带有配置对象的browser对象
browser = webdriver.Chrome(chrome_options=chrome_options)
url = 'https://www.baidu.com'
#发送请求
browser.get(url)
#查看请求的数据
html_str = browser.page_source
print(html_str)
由于获取百度的数据较大,假如返回的 html_str 为以下内容:
<div class="panel">
<div class="panel-heading">
<h4>Hello</h4>
</div>
<div class="panel_body">
<ul class="list" id="list-1" name="element">
<li class="element">Foo</li>
<li class="element">Bar</li>
<li class="element">Jay</li>
</ul>
<ul class="list list-small" id="list-2">
<li class="element">Foo</li>
<a href="https://www.baidu.com">百度官网</a>
<li class="element">Bar</li>
</ul>
</div>
</div>
2.3.1 根据id属性值获取元素列表
#获取第一个元素
browser.find_element(by=By.ID, value='list-1')
#获取多个元素
browser.find_elements(by=By.ID, value='list-1')
注意:获取一个元素和多个元素的区别是后面加不加s 。
2.3.2 根据class获取元素列表
#获取第一个元素
browser.find_element(by=By.CLASS_NAME, value='element')
#获取多个元素
browser.find_elements(by=By.CLASS_NAME, value='element')
2.3.3 根据Xpath获取元素列表
#返回标签li,id为element的一个元素
browser.find_element(by=By.XPATH, value='//li[@id="element"]')
#返回标签li,id为element的所有元素
browser.find_elements(by=By.XPATH, value='//li[@id="element"]')
2.3.4 根据标签的文本获取元素列表(精确定位)
#获取一个元素
browser.find_element(by=By.LINK_TEXT, value='Foo')
#获取多个元素
browser.find_element(by=By.LINK_TEXT, value='Foo')
2.3.5 根据标签包含的文本获取元素列表(模糊定位)
#获取一个元素
browser.find_element(by=By.PARTIAL_LINK_TEXT, value='Fo')
#获取多个元素
browser.find_elements(by=By.PARTIAL_LINK_TEXT, value='Fo')
2.3.6 根据标签名获取元素列表
#获取一个元素
browser.find_element(by=By.TAG_NAME, value='li')
#获取多个元素
browser.find_element(by=By.TAG_NAME, value='li')
2.4元素操作
2.4.1 获取元素
通过定位获取的标签对象的text属性,获取文本内容:element.text
ret = browser.find_element_by_class_name('element')
print(ret[0].text)
2.4.2 获取属性值
通过定位获取标签的get_attribute值函数,传入属性名,来获取属性的值。
ret = browser.find_element_by_tag_name('a')
print(ret[0].get_attribute('href'))
2.5 前进和后退
#前进
browser.forward()
#后退
browser.back()
2.6 执行js
selenium可以让浏览器执行自己规定的js代码。
语法格式:browser.execute_script(js)
参数说明:
js:为js语句
举例应用:
from selenium import webdriver
browser = webdriver.Chrome()
url = 'https://www.baidu.com/'
browser.get(url)
js = 'window.scrollTo(0,document.body.scrollHeight)' #js语句
browser.execute_script(js) #执行js的方法
browser.quit()
2.7 页面等待
现在的网页越来越多地采用了Ajax技术,这样程序便不能确定某个元素何时能完全加载出来。如果实际页面等待实际过长导致某个dom元素还没出来,但是如果代码直接使用了这个WebElement,那么就会抛出NullPointer的异常。为了避免这种元素定位困难并且降低ElementNotVisibleException的概率,所以Selenium提供了两种等待方式,一种是隐式等待,另一种是显式等待。
隐式等待是等待特定的时间,显式等待是指定某一条件并直到这个条件成立时继续执行。
2.7.1 隐式等待
隐式等待针对的是元素定位,隐式等待设置了一个时间,在一段时间内判断元素是否定位成功,如果完成了,就进行下一步。在设置的时间内没有定位成功,则会报超时加载。
from selenium import webdriver
browser = webdriver.Chrome()
browser.implicitly_wait(10) #隐式等待10秒
browser.get('https://www.baidu.com/')
myDynamicElement = browser.find_element_by_id('input')
2.7.2 显式等待
显式确定等待某个指定元素,然后设置最长等待时间,如果在这个时间内没有找到元素,那么会抛出异常。
from selenium import webdriver
from selenium.webdriver.common.by import By
#WebdriverWait库,负责循环等待
from selenium.webdriver.support.ui import WebDriverWait
#expected_condition类,负责条件触发
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.Chrome()
browser.get('https://www.baidu.com/')
try:
#页面一直循环,直到id='input'出现
element = WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.ID, 'input')))
finally:
browser.quit()
3. 进阶操作
3.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.实例化带有配置对象的browser对象
browser = webdriver.Chrome(chrome_options=options)
browser.get('https://www.baidu.com')
#获取页面内容
print(browser.page_source)
#延时3秒后关闭当前窗口,如果是最后一个窗口则退出
time.sleep(3)
browser.close()
3.2 修改请求头
selenium可以修改请求头,伪装成不同的浏览器。
from selenium import webdriver
import time
agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36 SE 2.X MetaSr 1.0'
#1.实例化配置对象
options = webdriver.ChromeOptions()
#2.配置对象修改请求头,这里agent以搜狗浏览器为例
options.add_argument('--user-agent='+agent)
#3.实例化带有配置对象的browser对象
browser = webdriver.Chrome(chrome_options=options)
browser.get('https://www.baidu.com')
#获取页面内容
print(browser.page_source)
#延时3秒后关闭当前窗口,如果是最后一个窗口则退出
time.sleep(3)
browser.close()
3.3 隐藏浏览器指纹特征
selenium操作浏览器,有几十个特征可以被网站监测到,被识别出是爬虫操作。
正常情况下手动打开浏览器,输入网址:https://bot.sannysoft.com/