在上节在反爬虫策略中,如果如果数据接口有很多加密参数,例如淘宝的数据接口,qq音乐的数据接口就含有很多加密的参数,我们很难推算出其规律,也很难直接分析AJAX直接抓取。为了解决这些问题,我们可以直接使用浏览器模拟的方法来实现。这样就可以做到在浏览器看到的是什么,抓取的源码就是什么,也就是所见即所爬。这样我们就不用管网页的内部是如何利用js宣传的,也不用管AJAX通过API加载了什么。简言之直接进行了浏览器的解析,使得所有的东西都来到明面上。selenium就是一个很好的浏览器模拟工具。
一、浏览器要完成Driver配置
此配置只需三步,一是下载匹配浏览器版本的Chrome.driver.exe。二是将其放在chrome的根目录。三是在path路径中添加浏览器的路径。
二、基本使用
其核心为webdrive
1.声明浏览器
2.访问页面
from selenium import webdrive
browser=webdrive(Chrome)
browser.get(url)
print(browser.page_source)
browser.close()
这样就可以得到完整页面了。但是我们想要的肯定不止于此。selenium的功能还是很强大的。
三、selenium对于网页的查、取、操作
1.查找单个节点
查找节点和其他程序中的比较相近。提供了以下几个非常好用的查询方法:
browser.find_element_by_id(‘2’)
.find_element_by_name()
.find_elemen_by_class_name()
.find_elemen_by_tag_name()
.find_elemen_by_link_text()
.find_elemen_by_partical_link_text()
.find_element_by_xpath()
.find_element_by_css_selector()
总结来说就是支持id,name,class,link_text,partical_link_text,tag等直接获取的办法,也支持xpath和css_selector。返回的为查找的第一个对象。
2.查找多个节点
element变elements即可。不过返回的结果是一个列表。
3.利用节点和页面进行交互
selenium可以实现就像你在真正的浏览器上输入,点击一样的交互
send_keys 用于input
clear()用于清理
.click() 用于点击
4.实现动作链
通过实例化ActionChains类可以实现动作链。
actions=ActionChains(browser)
actions.ddrap_and_drop(source,target)
actions.perform()
只简单介绍,更多的动作链操作可以参考官方文档:https://selenium-python.readthedocs.io/api.html#model-selenium.webdriver.common.action_chains
5.执行JS
执行js极大的增加了和页面的交流,比如下拉进度条:
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
6.获取节点信息
.get_attribute() 获取属性值
.text 获取文本信息
.id 获取id值
.location 获取位置
.tag_name 获取标签的name值
.size 获取大小
7.切换frame
browser.swith_to.frame()
browser.swith_to.parent_frame
8.延时等待
get(url)会在网页框架加载结束后结束,这时页面还没有完全加载完毕。要设置使其等待一段时间,有隐式等待(browser.implicitly_wait(10))和显式等待。
显式等待要引入WebDriverWait这个类。然后调用类的until方法,传入的参数是等待条件expected_conditions.那么同时也要
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import webDriverWait
wait=webDriverWait(broswer,10) #类的实例化
button=wait.until(EC.element_to_be-clickable())