selenium
概述
selenium本身是一个自动化测试工具。它可以让python代码调用浏览器。并获取到浏览器中加载的各种资源。我们可以利用selenium提供的各项技能。帮助我们完成数据的抓取。
安装
pip install selenium
它与其他库不同的地方是他要启动你电脑上的浏览器, 这就需要一个驱动程序来辅助。
这里推荐使用chrome浏览器
chrome驱动地址: http://chromedriver.storage.googleapis.com/index.html
最新链接: https://googlechromelabs.github.io/chrome-for-testing/
将下载好的浏览器驱动(需要和chrome版本一致)放在python解释器所在文件夹
Windows: py -0p 查看Python路径
import time
from selenium.webdriver import Chrome # 导入谷歌浏览器的类
# 创建浏览器对象
web = Chrome() # 如果你的浏览器驱动放在了解释器文件夹
web.get("http://www.baidu.com") # 输入网址
print(web.title) # 打印 title
time.sleep(100)
selenium的导包: from selenium import webdriver
selenium创建driver对象: webdriver.Chrome()
selenium请求数据: driver.get(“http://www.baidu.com/”)
selenium查看数据: driver.page_source
关闭浏览器: driver.quit()
根据id定位元素: driver.find_element_by_id(“kw”)/driver.find_element(By.ID, “kw”)
操作点击事件: click()
给输入框赋值: send_keys()
无头浏览器
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
opt = Options()
opt.add_argument("--headless")
opt.add_argument("--disable-gpu")
opt.add_argument("--window-size=4000,1600") # 设置窗口大小
web = Chrome(options=opt)
selenium 处理cookie
通过driver.get_cookies() 能够获得所有的cookie
- 获取cookie
dictCookies = driver.get_cookies()
- 设置cookie
driver.add_cookie(dictCookies)
- 删除cookie
# 删除一条cookie
driver.delete_cookie("CookieName")
# 删除所有的cookie
driver.delete_all_cookies()
页面等待
- 为什么需要等待 如果网站采用了动态html技术, 那么页面上的部分元素出现时间便不能确定, 这个时候就可以设置一个等待时间, 强制等待时间, 等待结束之后进行元素定位, 如果还是无法定位到则报错
- 页面等待的三种方法 - 强迫等待
import timetime.sleep(n) # 阻塞等待设定的秒数之后再继续往下执行
- 显式等待(自动化web测试使用, 爬虫基本不用)from selenium.webdriver.common.keys import Keysfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECWebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located((By.ID, "myDynamicElement")))# 显示等待制定某个条件, 然后设置最长等待时间10s, 在10s内每隔0.5s使用指定条件去定位元素, 如果定位到元素则直接结束等待, 如果在10s结束之后仍未定位到元素则报错
- 隐式等待 隐式等待设置之后代码中的所有元素定位都会做隐式等待driver.implicitly_wait(10) # 在指定的10s内每隔一段时间尝试定位元素, 如果10s结束还未定位出来则报错
注意:
Selenium显示等待和隐式等待的区别
- selenium的显示等待 原理: 显示等待, 就是明确要等到某个元素的出现或者是某个元素的可点击等条件, 等不到, 就一直等, 除非在规定的时间之内都没找到, 就会跳出Exception (简而言之, 就是直到元素出现才去操作, 如果超时这则报异常)
- selenium的隐式等待 原理: 隐式等待, 就是创建driver时, 为浏览器对象创建一个等待时间, 这个方法是得不到某个元素就等待一段时间, 直到拿到某个元素位置。 注意: 在使用隐式等待的时候, 实际上浏览器会在你自己设定的时间内部不断的刷新界面去寻找我们需要的元素
switch 方法切换到操作
一个浏览器肯定会有很多窗口, 所以我们肯定要有方法来实现窗口的切换。切换窗口的方法如下:
也可以使用 window_handles 方法来获取每一个窗口的操作对象。例如:
# 1. 获取当前所有的窗口
current_windows = driver.window_handles
# 2. 根据窗口索引进行切换
driver.switch_to.window(current_windows[1])
driver.switch_to.window(web.window_handles[-1]) # 跳转到最后一个窗口
driver.switch_to.window(current_windows[0]) # 回到第一个窗口
iframe 是html中常用的一种技术, 即一个页面里嵌套了另一个网页, selenium 默认是访问不了frame中的内容的, 对应的解决思路是
driver.switch_to.frame(name/el/id) # 传入的参数可以使 iframe 对应的 id 值, 也可以使用元素定位之后的元素对象
当你触发了某个事件之后, 页面出现了弹窗提示, 处理这个提示或者获取提示信息方法如下:
alert = driver.switch_to_alert()
页面前进和后退
driver.forward() # 前进
driver.back() # 后退
driver.refresh() # 刷新
driver.close() # 关闭当前窗口
设置浏览器最大窗口
driver.maxsize_window() # 最大化浏览器窗口
selenium的优缺点
- 优点 - selenium能够执行页面上的js, 对于js渲染的数据和模拟登录处理起来非常容易- 使用难度简单- 爬取速度慢, 爬取频率更像人的行为, 天生能够应对一些反爬措施
- 缺点 - 由于selenium操作浏览器, 因此会将发送所有的请求, 因此占用网络带宽- 由于操作浏览器, 因此占用的内存非常大(相比较之前的爬虫)- 速度慢, 对于效率要求高的话不建议用
小结:
- 获取cookie: get_cookies()
- 删除cookie: delete_all_cookies()
- 切换窗口: switch_to.window()
- 切换iframe: switch_to.frame()
案例 - 模拟页面滚动条滑动和页面点击
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By
import time
import random
driver = Chrome()
driver.get('https://news.163.com')
time.sleep(2)
def down_to_bottom(step_length):
while True:
scrollTop = driver.execute_script('return document.documentElement.scrollTop || document.body.scrollTop;')
clientHeight = driver.execute_script('return document.documentElement.clientHeight || document.body.clientHeight;')
scrollHeight = driver.execute_script('return document.documentElement.scrollHeight || document.body.scrollHeight;')
print('scrollTop = ', scrollTop)
print('clientHeight = ', clientHeight)
print('scrollHeight = ', scrollHeight)
if abs(scrollTop + clientHeight - scrollHeight) < 1 :
print('已滑动到最底部')
break
driver.execute_script("window.scrollBy(0, {})".format(step_length))
time.sleep(random.random() + 0.5)
if __name__ == "__main__":
down_to_bottom(1000)
more = driver.find_element(By.XPATH, '/html/body/div[1]/div[3]/div[2]/div[3]/div[2]/div[5]/div/a[3]')
for i in range(5):
driver.execute_script('arguments[0].click();',more)
time.sleep(random.random() + 0.5)
print(f"第{i}次点击加载更多")
版权归原作者 linux-hzh 所有, 如有侵权,请联系我们删除。