脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - selenium动态数据获取的方法实现

selenium动态数据获取的方法实现

2022-07-10 18:24颜语凌 Python

本文主要介绍了selenium动态数据获取的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Selenium 是一个自动化测试工具,利用它可以驱动浏览器执行特定的动作,如点击、下拉等操作,同时还可以获取浏览器当前呈现的页面的源代码,做到可见即可获取。对于一些 JavaScript 动态渲染的页面来说,此种抓取方式非常有效。接下来,就让我们来感受一下它的强大之处吧。  

webdriver的安装 

selenium安装

 首先,我们使用selenium进行测试,所以我们得安装selenium库。

pip install selenium

 驱动安装

webdriver 是浏览器对应的驱动,我们使用的的浏览器有三种谷歌Chrome、微软Microsoft Edge、还有一个火狐Firefox,但是我们经常使用谷歌Chrome浏览器进行测试。现在我们就以Chrome浏览器为例下载它对应的chromedriver 。

 官网:http://chromedriver.storage.googleapis.com/index.html

注意:

我们下载chromedriver 驱动时,我们要查明浏览器的版本,要对应相应的版本号进行下载,否则会报错。禁止Google浏览器更新服务,可以上网查教程。

基本使用 

查找节点 

Selenium 可以驱动浏览器完成各种操作,比如填充表单、模拟点击等。比如,我们想要完成向某个输入框输入文字的操作,总需要知道这个输入框在哪里吧?而 Selenium 提供了一系列查找节点的方法,我们可以用这些方法来获取想要的节点,以便下一步执行一些动作或者提取信息。  

获取节点的方法:

?
1
2
3
4
5
6
7
8
find_element_by_id
find_element_by_name
find_element_by_xpath
find_element_by_link_text                专门用来定位超链接文本(标签)  全匹配
find_element_by_partial_link_text           模糊匹配
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector 

 给个示例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from selenium import webdriver
 
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
input = browser.find_element_by_id('kw')
input.send_keys('Python')
browser.find_element_by_id('su').click()
# 提取页面
print(browser.page_source.encode('utf-8'))
# 提取cookie
print(browser.get_cookies())
# 提取当前请求地址
print(browser.current_url)
browser.close()

运行代码后发现,会自动弹出一个 Chrome 浏览器。浏览器首先会跳转到百度,然后在搜索框中输入 Python,接着跳转到搜索结果页  

注:当我们的chromedriver驱动没有放置到Chrome浏览器路径时,我们可以使用以下来申明浏览器对象。

?
1
browser = webdriver.Chrome(executable_path="chromedriver安装路径")

方法总结:

  • brower.get(url):跳转当前url链接。
  • browser.find_element_by_id('id属性值'):定位到id属性值。
  • send_keys('输入关键字'):定位到输入框后输入。
  • find_element_by_id('id属性值').click():定位到id属性值后点击。
  • browser.page_source.encode('utf-8'):获取当前页面的源码。
  • browser.get_cookies():提取cookies。
  • browser.current_url:获取当前页面的url。
  • brower.close():关闭浏览器。

执行 JavaScript

对于某些操作,Selenium API 并没有提供。比如,下拉进度条,它可以直接模拟运行 JavaScript,此时使用 execute_script() 方法即可实现,代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
# document.body.scrollHeight 获取页面高度
 
from selenium import webdriver
 
browser = webdriver.Chrome()
browser.get('https://36kr.com/')
# 下拉边框  一次性下拉
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
 
# 慢慢的下拉
for i in range(1,9):
    time.sleep(random.randint(100, 300) / 1000)
    browser.execute_script('window.scrollTo(0,{})'.format(i * 700))

这里就利用 execute_script() 方法将进度条下拉到最底部。为了模拟人为活动,我们调节了下拉的缓冲时间。

我们使用浏览器的控制台输入以下代码也能运行。

?
1
window.scrollTo(0, document.body.scrollHeight)

图例:

selenium动态数据获取的方法实现

切换 Frame

我们知道网页中有一种节点叫作 iframe,也就是子 Frame,相当于页面的子页面,它的结构和外部网页的结构完全一致。Selenium 打开页面后,它默认是在父级 Frame 里面操作,而此时如果页面中还有子 Frame,它是不能获取到子 Frame 里面的节点的。这时就需要使用 switch_to.frame() 方法来切换 Frame。示例如下:  

?
1
2
3
4
5
browser.get('https://www.douban.com/')
login_iframe = browser.find_element_by_xpath('//div[@class="login"]/iframe')
browser.switch_to.frame(login_iframe)
browser.find_element_by_class_name('account-tab-account').click()
browser.find_element_by_id('username').send_keys('123123123')

首先我们要定位到iframe,然后用switch_to.frame() 方法来切换 Frame,这时我们就可以定位到子 Frame进行有关操作了。

前进后退

平常使用浏览器时都有前进和后退功能,Selenium 也可以完成这个操作,它使用 back() 方法后退,使用 forward() 方法前进。示例如下: 

?
1
2
3
4
5
6
7
8
9
10
11
import time
from selenium import webdriver
 
browser = webdriver.Chrome()
browser.get('https://www.baidu.com/')
browser.get('https://www.taobao.com/')
browser.get('https://www.python.org/')
browser.back()
time.sleep(1)
browser.forward()
browser.close()

这里我们连续访问 3 个页面,然后调用 back() 方法回到第二个页面,接下来再调用 forward() 方法又可以前进到第三个页面。  

选项卡管理

在访问网页的时候,会开启一个个选项卡。在 Selenium 中,我们也可以对选项卡进行操作。示例如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
import time
from selenium import webdriver
 
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.execute_script('window.open()')
print(browser.window_handles)
browser.switch_to_window(browser.window_handles[1])
browser.get('https://www.taobao.com')
time.sleep(1)
browser.switch_to_window(browser.window_handles[0])
browser.get('https://python.org')

这里我们先跳转到百度再打开一个空白选项卡打印选项卡编号,再跳转到第二个选项卡也就是这个空白选项卡打开淘宝,休息一秒,再跳转到第一个选项卡打开python官网。

配置操作

 selenium有很多配置,下面我举几个常见的。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
options = webdriver.ChromeOptions()
 
# 无头模式
option.add_argument("-headless")
 
#设置代理
options.add_argument('proxy-server=' +'192.168.0.28:808')
 
#将浏览器最大化显示
browser.maximize_window()
 
# 设置宽高
browser.set_window_size(480, 800)
# 通过js新打开一个窗口
driver.execute_script('window.open("https://www.baidu.com");')
 
browser = webdriver.Chrome(chrome_options=options)

绕过检测

绕过检测对于一些网站的自动化反爬很管用。 

?
1
2
3
4
5
# 设置屏蔽
options = webdriver.ChromeOptions()
options.add_argument('--disable-blink-features=AutomationControlled')
browsers = webdriver.Chrome(chrome_options=options)
browsers.get('https://bot.sannysoft.com/')

这里我们使用下面这个网站进行自动化检测

网站:https://bot.sannysoft.com/

我们没设置绕过检测

selenium动态数据获取的方法实现

我们设置了绕过检测后

selenium动态数据获取的方法实现

到此这篇关于selenium动态数据获取的方法实现的文章就介绍到这了,更多相关selenium动态数据获取内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_54667422/article/details/125576093

延伸 · 阅读

精彩推荐
  • Pythonpython中三种高阶函数(map,reduce,filter)详解

    python中三种高阶函数(map,reduce,filter)详解

    在Python中,函数其实也是一种数据类型,今天重点给大家介绍python中三种高阶函数(map,reduce,filter)的相关知识,感兴趣的朋友一起看看吧...

    网名余先生7762022-02-15
  • PythonPandas 对Dataframe结构排序的实现方法

    Pandas 对Dataframe结构排序的实现方法

    下面小编就为大家分享一篇Pandas 对Dataframe结构排序的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    chixujohnny12212021-01-29
  • Pythonpython批量下载网站马拉松照片的完整步骤

    python批量下载网站马拉松照片的完整步骤

    这篇文章主要给大家介绍了关于利用python批量下载网站马拉松照片的完整步骤,文中通过示例代码介绍的非常详细,对大家的学习或工作具有一定的参考学...

    苏玉波11952021-04-25
  • PythonPython的Flask框架中使用Flask-SQLAlchemy管理数据库的教程

    Python的Flask框架中使用Flask-SQLAlchemy管理数据库的教程

    在Python中我们可以使用SQLAlchemy框架进行数据库操作,那么对应的在Flask框架中我们可以使用SQLAlchemy,下面我们就来看一下Python的Flask框架中使用Flask-SQLAlchemy管...

    ipython2362020-08-27
  • PythonPython内置函数delattr的具体用法

    Python内置函数delattr的具体用法

    本篇文章主要介绍了Python内置函数delattr的具体用法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    LZ_Luzhuo4712020-12-09
  • PythonPython 多线程的实例详解

    Python 多线程的实例详解

    这篇文章主要介绍了 Python 多线程的实例详解的相关资料,希望通过本文大家能掌握多线程的知识,需要的朋友可以参考下...

    攻城狮--晴明5332020-12-06
  • Python详解Python调试神器之PySnooper

    详解Python调试神器之PySnooper

    在程序开发过程中,代码的运行往往会和我们预期的结果有所差别。于是,我们需要清楚代码运行过程中到底发生了什么?代码哪些模块运行了,哪些模块...

    Python学习与数据挖掘4602022-02-27
  • Pythondjango haystack实现全文检索的示例代码

    django haystack实现全文检索的示例代码

    这篇文章主要介绍了django haystack实现全文检索的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋...

    m0_472027876762020-06-24