写点什么

python 爬虫之 selenium 可视化爬虫

用户头像
诡途
关注
发布于: 2021 年 03 月 22 日
python 爬虫之selenium可视化爬虫

@[TOC]

前文回顾

>一文带你了解Python爬虫(一)——基本原理介绍

>一文带你了解Python爬虫(二)——四种常见基础爬虫方法介绍


之所以把 selenium 爬虫称之为可视化爬虫


主要是相较于前面所提到的几种网页解析的爬虫方式


selenium 爬虫主要是模拟人的点击操作


selenium 驱动浏览器并进行操作的过程是可以观察到的


就类似于你在看着别人在帮你操纵你的电脑,类似于别人远程使用你的电脑


当然了,selenium 也有无界面模式


快速入门


selenium 基本介绍:


selenium 是一套完整的 web 应用程序测试系统,


包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)

和测试的并行处理(Selenium Grid)。


Selenium 的核心 Selenium Core 基于 JsUnit,

完全由 JavaScript 编写,因此可以用于任何支持 JavaScript 的浏览器上。

selenium 可以模拟真实浏览器,自动化测试工具,支持多种浏览器,


爬虫中主要用来解决 JavaScript 渲染问题。


用 python 写爬虫的时候,主要用的是 selenium 的 Webdriver,


#安装selenium库pip install selenium#安装对应浏览器驱动# 我们可以通过下面的方式先看看Selenium.Webdriver支持哪些浏览器from selenium import webdriverprint(help(webdriver))
复制代码


适用浏览器:PACKAGE CONTENTS    android (package)    blackberry (package)    chrome (package)    common (package)     edge (package)          firefox (package)    ie (package)         opera (package)         phantomjs (package)    remote (package)     safari (package)        support (package)    webkitgtk (package)#这里要说一下比较重要的PhantomJS,#PhantomJS是一个而基于WebKit的服务端JavaScript API,#支持Web而不需要浏览器支持,#其快速、原生支持各种Web标准:Dom处理,CSS选择器,JSON等等。#PhantomJS可以用用于页面自动化、网络监测、网页截屏,以及无界面测试
复制代码

>谷歌浏览器驱动下载地址

>注意对应版本号,chrome 地址栏输入 chrome://version/ 查看自己的 Chrome 版本

>我使用的是 anaconda 下载好后丢入 anaconda3\Scripts 文件夹下就可以了

>如果是其他 ide 如:pycharm、VScode 但加载的还是 anaconda 的集成 python,依然可以这么操作


简单测试

from selenium import webdriver# #声明浏览器对象browser1 = webdriver.Chrome()browser2 = webdriver.Firefox()# #访问页面browser1.get("http://www.baidu.com")print(browser1.page_source)#关闭当前窗口browser1.close()
复制代码


元素定位

要想对页面进行操作,首先要做的是选中页面元素,

比较常见的八种元素定位方式,如下表

| 定位一个元素 |定位多个元素 |定位方式描述 |

|:--|:--|:--|

|findelementby_id | find_elementsbyid | 通过元素 id 进行定位 |

|findelementby_name | find_elementsbyname | 通过元素 名称进行定位 |

|findelementby_xpath | find_elementsbyxpath | 通过 xpath 路径进行定位 |

|findelementby_link_text | findelementsby_link_text | 通过完整超链接文本进行定位 |

|findelementby_partial_linktext | findelementsbypartiallinktext | 通过部分超链接文本进行定位 |

|findelementby_tag_name | findelementsby_tag_name | 通过标记名称进行定位 |

|findelementby_class_name | findelementsby_class_name | 通过类名称进行定位 |

|findelementby_css_selector | findelementsby_css_selector | 通过 css 选择器进行定位 |


>更详细定位方式可以参考:《史上最全!Selenium元素定位的30种方式》

页面操作

1.表单填充


# 找到用户名输入用户名user = drive.find_element_by_name("LoginForm[username]")user.send_keys(username)# 找到密码输入密码pwd=drive.find_element_by_id("LoginForm_password")pwd.send_keys(password)# 点击登录按钮实现登录drive.find_element_by_class_name("login_btn").click()
复制代码


2.窗口句柄


简单讲,句柄就是浏览器上方每一个窗口栏的唯一标识


#获取当前窗口所有句柄handles = drive.window_handles#通过句柄 切换到第2个标签页drive.switch_to.window(handles[2])"""操作完成"""#关闭当前窗口driver.close() #通过句柄 切换到第1个标签页drive.switch_to.window(handles[0])time.sleep(random.uniform(2,3))
复制代码


3.url 加载和获取


#url加载drive.get(url)# 获取当前页面url并断言currentPageUrl = driver.current_url
复制代码

4.cookie 处理

  • get_cookies:获取 cookie 信息

  • add_cookie:添加 cookie 信息


drive.get("http://www.baidu.com")cookie = {'name':'foo','value':'bar'}drive.add_cookie(cookie)drive.get_cookies()
复制代码


等待方式

现在很多网站采用 Ajax 技术

无法确定网页元素什么时候能被完全加载

所以网页元素的选取比较困难

此时就需要设置等待(等待网页加载完成)


selenium 有两种等待方式:

  • 显式等待

  • 隐式等待


1.显式等待

显式等待是一种条件触发式等待

直到设置的某一条件达成时才会继续执行

可以设置超时时间,如果超过超时时间元素依然没被加载,就会抛出异常


from selenium import webdriverfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECdrive = webdriver.Chrome()url = 'http://www.baidu.com/'drive.get(url)
try: WebDriverWait(self.driver,10).until(EC.presence_of_element_located(By.ID,"LoginForm[username]")) #显示等待except: print('%s页面未找到元素'% loc)
复制代码


以上代码加载 'http://www.baidu.com/'页面

并定位 id 为"LoginForm[username]"的元素

设置超时时间 10 秒,webDriverWait 默认会 500ms 检测一下元素是否存在


selenium 提供了一些内置的用于显示等待的方法,

位于 expected_conditions 类中,详细见下表

|内置方法 | 功能|

|:--|:--|

| title_is | 判断当前页面的 title 是否等于预期内容 |

| title_contains | 判断当前页面的 title 是否包含预期字符串 |

|presenceofelement_located|判断某个元素是否被加到了 dom 树里,<br>并不代表该元素一定可见|

|presenceofall_element_located|判断是否至少有 1 个元素存在于 dom 树里|

|visibilityofelement_located|判断某个元素是否可见|

|visibility_of|判断某个元素是否可见|

|invisibilityofelement_located|判断某个元素是否不存在于 dom 树里或不可见|

|texttobe_present_in_element|判断元素中的 text 是否包含了预期的字符串|

|texttobe_present_inelementvalue|判断元素中的 value 属性是否包含了预期字符|

|frametobe_available_andswitchto_it|判断该 frame 是否可以切换进去,如果可以,<br>返回 True 并切换进去,否则返回 False|

|elementtobe_clickable|判断某个元素是否可见并且是 enable 的|

|staleness_of|等待某个元素从 dom 树中移除|

|elementtobe_selected|判断某个元素是否被选中了,一般用于下拉列表|

|elementlocatedto_be_selected|判断某个元素是否被选中了,一般用于下拉列表|

|elementselectionstatetobe|判断某个元素的选中状态是否符合预期|

|elementlocatedselectionstateto_be|判断某个元素的选中状态是否符合预期

|alertispresent|判断页面上是否存在 alert 框|


2.隐式等待


隐式等待是在尝试定位某个元素时,如果没能立刻发现,就等待固定时长

类似于 socket 超时,默认设置是 0 秒,即相当于最长等待时长


在浏览器界面直观感受是:

等待直到网页加载完成(地址栏这个地方不是× 变成如下)时继续执行,

网页加载超过设置等待时长才报错

使用方法


from selenium import webdriverdrive = webdriver.Chrome()url = 'http://www.baidu.com/'#设置最大等待时长 10秒drive.implicitly_wait(10)drive.get(url)user = drive.find_element_by_name("LoginForm[username]")
复制代码


3.线程休眠

time.sleep(time)是比较常用的线程休眠方式

为了避免风险,我个人比较喜欢随机休眠

time.sleep(random.uniform(4,5))

扩展程序加载

# 设置好应用扩展chrome_options.add_extension(extension_path)#添加下载路径#download.default_directory:设置下载路径    profile.default_content_settings.popups:设置为 0 禁止弹出窗口prefs = {'profile.default_content_settings.popups': 0, 'download.default_directory':tmp_path}chrome_options.add_experimental_option('prefs', prefs)
复制代码


发布于: 2021 年 03 月 22 日阅读数: 31
用户头像

诡途

关注

科技成就商业未来,数据看透问题本质 2020.11.04 加入

目前就职于电商数据分析师,日常工作以爬虫和DBA数据库管理为主,从最初的表哥到现在的大数据、数据挖掘、机器学习,一直不断成长! CSDN:https://blog.csdn.net/qq_35866846 微信公众号:诡途

评论

发布
暂无评论
python 爬虫之selenium可视化爬虫