python 爬虫之selenium可视化爬虫

python 爬虫之selenium可视化爬虫文章目录前文回顾快速入门元素定位页面操作等待方式扩展程序加载前文回顾一文带你了解Python爬虫(一)——基本原理介绍一文带你了解Python爬虫(二)——四种常见基础爬虫方法介绍之所以把selenium爬虫称之为可视化爬虫主要是相较于前面所提到的几种网页解析的爬虫方式selenium爬虫主要是模拟人的点击操作selenium驱动浏览器并进行操作的过程是可以观察到的就类似于你在看着别人在帮你操纵你的电脑,类似于别人远程使用你的电脑当然了,selenium也有无界面模式快速入门sel

大家好,又见面了,我是你们的朋友全栈君。

前文回顾

一文带你了解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 webdriver
print(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()

元素定位

要想对页面进行操作,首先要做的是选中页面元素,
比较常见的八种元素定位方式,如下表

定位一个元素 定位多个元素 定位方式描述
find_element_by_id find_elements_by_id 通过元素 id进行定位
find_element_by_name find_elements_by_name 通过元素 名称进行定位
find_element_by_xpath find_elements_by_xpath 通过xpath路径进行定位
find_element_by_link_text find_elements_by_link_text 通过完整超链接文本进行定位
find_element_by_partial_link_text find_elements_by_partial_link_text 通过部分超链接文本进行定位
find_element_by_tag_name find_elements_by_tag_name 通过标记名称进行定位
find_element_by_class_name find_elements_by_class_name 通过类名称进行定位
find_element_by_css_selector find_elements_by_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 webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
drive = 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是否包含预期字符串
presence_of_element_located 判断某个元素是否被加到了dom树里,
并不代表该元素一定可见
presence_of_all_element_located 判断是否至少有1个元素存在于dom树里
visibility_of_element_located 判断某个元素是否可见
visibility_of 判断某个元素是否可见
invisibility_of_element_located 判断某个元素是否不存在于dom树里或不可见
text_to_be_present_in_element 判断元素中的text是否包含了预期的字符串
text_to_be_present_in_element_value 判断元素中的value属性是否包含了预期字符
frame_to_be_available_and_switch_to_it 判断该frame是否可以切换进去,如果可以,
返回True并切换进去,否则返回False
element_to_be_clickable 判断某个元素是否可见并且是enable的
staleness_of 等待某个元素从dom树中移除
element_to_be_selected 判断某个元素是否被选中了,一般用于下拉列表
element_located_to_be_selected 判断某个元素是否被选中了,一般用于下拉列表
element_selection_state_to_be 判断某个元素的选中状态是否符合预期
element_located_selection_state_to_be 判断某个元素的选中状态是否符合预期
alert_is_present 判断页面上是否存在alert框

2.隐式等待

隐式等待是在尝试定位某个元素时,如果没能立刻发现,就等待固定时长
类似于socket超时,默认设置是0秒,即相当于最长等待时长

在浏览器界面直观感受是:
等待直到网页加载完成(地址栏这个地方不是× 变成如下)时继续执行,
网页加载超过设置等待时长才报错
在这里插入图片描述
使用方法

from selenium import webdriver
drive = 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)

写在最后的拉票环节
最近参加了CSDN官方组织的“GEEK+”原创·博主大赛
历经重重筛选,终于上榜TOP 50
原创不易,帮忙投个免费的票
支持一下:点击投票
谢谢大家!!!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/141946.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月9日 下午8:40
下一篇 2022年5月9日 下午8:40


相关推荐

  • 腾讯混元OCR大模型,本地部署,实测

    腾讯混元OCR大模型,本地部署,实测

    2026年3月12日
    2
  • idea有效激活码2021年4月【在线注册码/序列号/破解码】

    idea有效激活码2021年4月【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    77
  • 判断是否为数组的 JavaScript 方法总结

    判断是否为数组的 JavaScript 方法总结前言我们在日常开发中 常常有判断某值类型需求 今天我们总结一下常见的几种用来判断是否为数组的 JavaScript 方法 Array isArrayArray isArray 是 ES5 新增的方法 用于确定传递的值是否是一个数组 如果是数组 则返回 true 否则返回 false letarr console log Array isArray arr true 下面的函数调用都返回 true Array isArray Array isArray 1

    2026年3月16日
    1
  • bool函数使用「建议收藏」

    bool函数使用「建议收藏」bool函数的使用

    2022年6月13日
    30
  • PyCharm安装配置及干净卸载

    PyCharm安装配置及干净卸载系统 Win10 版本 PyCharm 前言一 下载 1 官网下载 2 打开安装包二 PyCharm 卸载 1 软件卸载 2 删除环境变量 3 删除注册表 强烈不推荐 前言 PyCharm 是由 JetBrains 公司开发的一款功能强大的 Python 编辑器一 下载 1 官网下载 Jetbrains 官网 https www jetbrains com 官网下载 https www jetbrains com pycharm download section windows 选择合适的系统版本下载

    2026年3月27日
    2
  • vite.config.js常用配置

    vite.config.js常用配置vite 是一个基于 Vue3 单文件组件的非打包开发服务器 它做到了本地快速开发启动 快速的冷启动 不需要等待打包操作 即时的热模块更新 替换性能和模块数量的解耦让更新飞起 真正的按需编译 不再等待整个应用编译完成 这是一个巨大的改变 vite 项目中使用的不是 vue config js 而是 vite config jsvite config js 配置 constpath require path vite config js orvite config ts

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号