获取动态渲染页面(一):selenium

  • Post author:
  • Post category:其他


在上节在反爬虫策略中,如果如果数据接口有很多加密参数,例如淘宝的数据接口,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())



版权声明:本文为szyyzt原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。