python爬虫系列7--动态网页爬取 selenium phantomjs chromedriver

2023-11-19

####selenium + phantomjs

+ Selenium

Selenium可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。Selenium自己不带浏览器,不支持浏览器的功能,它需要与第三方浏览器结合在一起才能使用。但是我们大多数时候需要让它内嵌在代码中运行,所以我们可以用一个叫PhantomJS的工具代替真实的浏览器(或者使用chromedriver等)。

pip install selenium 安装, pip show selenium 查看是否安装成功。

Selenium库里有个叫WebDriver的API。WebDriver有点儿像可以加载网站的浏览器,但是它可以像BeautifulSoup或者其他Selector对象一样用来查找页面元素,与页面上的元素进行交互(发送文本、点击等),以及执行其他动作来运行网络爬虫。


+ Splinter

使用Python开发的开源Web应用测试工具,它可以帮你实现自动浏览站点和与其进行交互,类似selenium。


+ Phantomjs

PhantomJS是一个基于Webkit的“无界面”(headless)浏览器,它会把网站加载到内存并执行页面上的JavaScript,因为不会展示图形界面,所以运行起来比完整的浏览器要高效。

如果我们把Selenium和PhantomJS结合在一起,就可以运行一个非常强大的网络爬虫了,这个爬虫可以处理JavaScript、Cookie、headers,以及任何我们真实用户需要做的事情。

下载链接:http://npm.taobao.org/dist/phantomjs/


+ 开发环境

selenium 3.4.3 + phantomjs 2.1.1


+phantomjs常用配置

from selenium import webdriver

# 引入配置对象DesiredCapabilities

from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

dcap = dict(DesiredCapabilities.PHANTOMJS)

#从USER_AGENTS列表中随机选一个浏览器头,伪装浏览器

dcap["phantomjs.page.settings.userAgent"] = (random.choice(USER_AGENTS))

# 不载入图片,爬页面速度会快很多

dcap["phantomjs.page.settings.loadImages"] = False

# 设置代理

service_args = ['--proxy=127.0.0.1:9999','--proxy-type=socks5']

#打开带配置信息的phantomJS浏览器

driver = webdriver.PhantomJS(phantomjs_driver_path, desired_capabilities=dcap,service_args=service_args)

# 隐式等待5秒,可以自己调节

driver.implicitly_wait(5)

# 设置10秒页面超时返回,类似于requests.get()的timeout选项,driver.get()没有timeout选项

# 以前遇到过driver.get(url)一直不返回,但也不报错的问题,这时程序会卡住,设置超时选项能解决这个问题。

driver.set_page_load_timeout(10)

# 设置10秒脚本超时时间

driver.set_script_timeout(10)



+ webdriver基本操作

与页面交互:

element = driver.find_element_by_id()

element = driver.find_element_by_name()

element = driver.find_element_by_xpath()

element = find_element_by_class_name()

element = find_element_by_tag_name()

element = find_element_by_link_text()

element = find_element_by_partial_link_text()

element = find_element_by_css_selector()



element.send_keys("some text")

element.clear()


填写表格:

WebDriver的支持类包括一个叫做 ``Select``的类,他提供有用的方法处理这些内容:

from selenium.webdriver.support.ui import Select

select = Select(driver.find_element_by_name('name'))

select.select_by_index(index)

select.select_by_visible_text("text")

select.select_by_value(value)

WebDriver 也提供一些有用的方法来取消选择已经选择的元素:


select = Select(driver.find_element_by_id('id'))

select.deselect_all()


element.submit()



拖放:

element = driver.find_element_by_name("source")

target = driver.find_element_by_name("target")


from selenium.webdriver import ActionChains

action_chains = ActionChains(driver)

action_chains.drag_and_drop(element, target).perform()


在不同的窗口和框架之间移动:

driver.switch_to_window("windowName")

driver.switch_to_frame("frameName")


弹出对话框处理:

alert = driver.switch_to_alert()

使用此对象,您现在可以接受、排除、读取其内容, 甚至可以在prompt对话框中输入


访问浏览器记录;

driver.forward()

driver.back()


操作Cookies:

get_cookie(): 获得所有cookie信息。

get_cookie(name):返回字典的key为name的cookie

add_cookie(cookie_dict):添加cookie。“cookie_dict”指字典对象,必须有name和value值。

delete_cookie(name,optionsString):删除cookie信息。“name”是要删除的cookie的名称。“optionsString”是该cookie的选项,目前支持的选项包括“路径”,“域”

delete_all_cookies():删除所有cookie信息。


等待页面加载完成:

现在的大多数的Web应用程序是使用Ajax技术。当一个页面被加载到浏览器时, 该页面内的元素可以在不同的时间点被加载。这使得定位元素变得困难, 如果元素不再页面之中,会抛出ElementNotVisibleException 异常。 使用 waits, 我们可以解决这个问题。waits提供了一些操作之间的时间间隔 - 主要是定位元素或针对该元素的任何其他操作。

显式等待是你在代码中定义等待一定条件发生后再进一步执行你的代码。 最糟糕的案例是使用time.sleep(),它将条件设置为等待一个确切的时间段。 这里有一些方便的方法让你只等待需要的时间。WebDriverWait结合ExpectedCondition 是实现的一种方式。class WebDriverWait(object):driver, timeout, poll_frequency。

如果某些元素不是立即可用的,隐式等待是告诉WebDriver去等待一定的时间后去查找元素。 默认等待时间是0秒,一旦设置该值,隐式等待是设置该WebDriver的实例的生命周期。

参考链接:https://blog.csdn.net/wycaoxin3/article/details/74017971


+ 网页基本操作示例

from selenium import webdriver

from selenium.webdriver.common.keys import Keys

import time



execute_path = r'D:\phantomjs\bin\phantomjs.exe'

url = 'http://www.baidu.com/'

driver = webdriver.PhantomJS(executable_path=execute_path)

driver.get(url)


print(driver.title)

#data = driver.find_element_by_id('wrapper').text

#print(data)


driver.find_element_by_id('kw').send_keys('美女')

driver.find_element_by_id('su').click()

time.sleep(2)

driver.save_screenshot('meinv.jpg')

print(driver.get_cookies())




+ phantomjs + selenium登录csdn

from selenium import webdriver

from time import sleep

from selenium.webdriver.common.desired_capabilities import DesiredCapabilities


url = 'http://jandan.net/ooxx'

executable_path=r'D:\phantomjs\bin\phantomjs.exe'

dcap = dict(DesiredCapabilities.PHANTOMJS)

dcap["phantomjs.page.settings.userAgent"] = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.170 Safari/537.36 OPR/53.0.2907.68"


service_args = ['--ignore-ssl-errors=true','--ssl-protocol=TLSv1'] #返回Screenshot: available via screen错误解决方法

driver = webdriver.PhantomJS(executable_path=executable_path,desired_capabilities=dcap,service_args=service_args)

driver.set_page_load_timeout(10)

driver.set_script_timeout(10)

driver.get(url)

#sleep(9)

print(driver.page_source)


+ 模拟登陆路由器返回设备列表

from selenium import webdriver

from time import sleep

from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

from bs4 import BeautifulSoup


url = 'http://192.168.2.1/login.asp'

executable_path=r'D:\phantomjs\bin\phantomjs.exe'

dcap = dict(DesiredCapabilities.PHANTOMJS)

dcap["phantomjs.page.settings.userAgent"] = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.170 Safari/537.36 OPR/53.0.2907.68"


service_args = ['--ignore-ssl-errors=true','--ssl-protocol=TLSv1'] #返回Screenshot: available via screen错误解决方法

driver = webdriver.PhantomJS(executable_path=executable_path,desired_capabilities=dcap,service_args=service_args)

driver.set_page_load_timeout(10)

driver.set_script_timeout(10)

driver.get(url)

driver.find_element_by_name('password').send_keys('xxx')

sleep(1)

driver.find_element_by_name('login').click()

sleep(3)

driver.find_element_by_id('list22').click()

sleep(3)

bsObj = BeautifulSoup(driver.page_source)

#print(bsObj.prettify())

table = bsObj.find('table',{'id':'online_table'})

thead = table.find('thead')

td_thead = thead.find_all('td')

for td in td_thead:

print(td.get_text(),end=' ')

tbody = table.find('tbody')

tr = tbody.find_all('tr')

for i_tr in tr:

td = i_tr.find_all('td')

for i_td in td:

print(i_td.get_text(),end=' ')

print('\n')

#for sibling in bsObj.find('table',{'id':'online_table'}).descentants:

# print(sibling)

#print(driver.page_source)




####selenium + chromedriver

(1)selenium.common.exceptions.NoSuchElementException: Message: '{"errorMessage":"Unable to find element with name

定位元素仅会在当前所处的frame中寻找该元素,如果有多个frame时需要先切换到对应的frame下才能够找到该元素。重新查看需要定位的页面信息发现果真要寻找的元素在一个iframe下,需调用driver.switch_to_frame切换至该iframe下才能定位。

(2)driver.page_source可以查看当前的页面内容

(3)Selenium打开谷歌浏览器提示chromedriver.exe停止运行且浏览器显示请关闭开发者模式,提示关闭开发者模式,其实是chromedriver.exe与chrome 浏览器版本不一致导致的,下载完chromedriver之后可以手动运行查看它的真实版本,官网下载的版本与实际版本号不对应,可以到阿里的镜像源里下载。

(4)用phantomjs switch_to_frame加载页面失败,但是chromedriver是成功的,目前还没找到原因。

(5)最新的selenium已不再支持phantomjs,亲测版本3.4.3是支持的。



+ selenium + chromedriver 登录126邮箱

from selenium import webdriver

from time import sleep

driver=webdriver.Chrome()

driver.get("https://mail.126.com/")

sleep(2)

#frame/iframe 表单嵌套

#xpath=driver.find_element_by_id("x-URS-iframe")

driver.switch_to_frame('x-URS-iframe')

# 也可以用这句,作用一样 driver.switch_to_frame(xpath)

sleep(2)

driver.find_element_by_name("email").clear()

driver.find_element_by_name("email").send_keys("xxx")

sleep(2)

driver.find_element_by_name("password").clear()

driver.find_element_by_name("password").send_keys("yyy")

sleep(2)

driver.find_element_by_id("dologin").click()

sleep(2)

driver.find_element_by_link_text('登录').click()

#driver.quit()



+ chromedriver路由登录返回设备列表

from selenium import webdriver

from time import sleep

from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

from bs4 import BeautifulSoup


url = 'http://192.168.2.1/login.asp'

'''executable_path=r'D:\phantomjs\bin\phantomjs.exe'

dcap = dict(DesiredCapabilities.PHANTOMJS)

dcap["phantomjs.page.settings.userAgent"] = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.170 Safari/537.36 OPR/53.0.2907.68"


service_args = ['--ignore-ssl-errors=true','--ssl-protocol=TLSv1'] #返回Screenshot: available via screen错误解决方法

'''

driver = webdriver.Chrome()

#driver.set_page_load_timeout(10)

#driver.set_script_timeout(10)

driver.get(url)

driver.find_element_by_name('password').send_keys('xxx')

sleep(1)

driver.find_element_by_name('login').click()

sleep(3)

driver.find_element_by_id('list22').click()

sleep(3)

bsObj = BeautifulSoup(driver.page_source)

#print(bsObj.prettify())

table = bsObj.find('table',{'id':'online_table'})

thead = table.find('thead')

td_thead = thead.find_all('td')

for td in td_thead:

print(td.get_text(),end=' ')

tbody = table.find('tbody')

tr = tbody.find_all('tr')

for i_tr in tr:

td = i_tr.find_all('td')

for i_td in td:

print(i_td.get_text(),end=' ')

print('\n')

driver.quit()



#####phantomjs vs chromedriver

(1)selenium3.x不再支持phantomjs,所以后续用chromedriver比较好;

(2)phantomjs无需打开浏览器加载,速度快,占用内存小;

(3)phantomjs加载时间不确定,经常会出现“Screenshot: available via screen”错误,chromedriver不会出现此错误;

(4)两者的程序一样,只需要在初始化webdriver的地方小小修改一下,就可以两者都适用,差别在与有头和无头;

(5)在速度没有要求的前提下优先适用chromedriver。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python爬虫系列7--动态网页爬取 selenium phantomjs chromedriver 的相关文章

随机推荐

  • STM8的ADC的五种工作模式

    STM8的ADC的五种工作模式 STM8的ADC是10位的逐次比较型模拟数字转换器 多达16个多功能的输入通道 拥有5种转换模式 转换结束可产生中断 STM8 ADC的初始化顺序如下 1 AD输入通道对应的IO设置为上拉输入 2 配置AD参
  • JVM学习笔记(二)------Java代码编译和执行的整个过程

    http blog csdn net cutesource article details 5904542 Java代码编译是由Java源码编译器来完成 流程图如下所示 Java字节码的执行是由JVM执行引擎来完成 流程图如下所示 Java
  • JAVA实现二叉树的前、中、后序遍历(递归与非递归)

    最近在面试中遇到过问到二叉树后序遍历非递归实现的方法 之前以为会递归的解决就OK 看来还是太心存侥幸 在下一次面试之前 特地整理一下这个问题 首先二叉树的结构定义 java代码如下 public class Node private int
  • 花式获取ssl证书有效期

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pem是什么 二 读取pem证书有效期 1 命令读取 2 C C 读取 3 具体分析 总结 前言 在网络通信过程中 为了数据在传输过程中保持私密 就要用到
  • 数据结构与算法学习指南,可能是最适合新手的了!

    文章目录 先来聊聊学习数据结构与算法 数据结构与算法 听起来就难得不要不要的 数据结构与算法 到底该怎么学 通用性建议 如何学习编程知识 1 你需要的不是一个参考 2 不要钻牛角尖 3 一定要多交流 4 你得多动手 不是让你找人打架 那么针
  • 【java poi】向已存在的excel中追加数据

    1 Maven依赖
  • Mkdocs 存在任意文件读取漏洞

    文章目录 Mkdocs 存在任意文件读取漏洞 1 Mkdocs简介 2 漏洞描述 3 影响版本 4 fofa 查询语句 5 漏洞复现 6 POC EXP 7 整改意见 8 往期回顾 Mkdocs 存在任意文件读取漏洞 1 Mkdocs简介
  • java面向对象程序设计第三版耿祥义pdf_java基础知识干货——封装

    很多java初学者 在学到Java面向对象方面的知识点的时候 会觉得这块的知识点真的蛮绕的 一个知识点一个知识点的往外冒 对于初学者来说区分构造器和方法就花费了一整天的时间 现在小编带大家重新过一遍知识点 先背下来一个理念 面向对象程序设计
  • String格式问题:将String格式请求方法时,String格式突然转化为对象的问题

    String格式问题 将String格式请求方法时 String格式突然转化为对象的问题 如上图所示 在使用队列调用方法时传递的参数为 xxxxxx 但是在方法中接收到的参数为 id msg xxxxxx name java lang St
  • 【投资界学堂】创业者如何远程管理异地团队

    转自 http pe pedaily cn 201106 20110627214254 all shtml p1 摘要投资界6月27日消息 美国商业网站Under30CEO近日刊载文章 如何成功的远程管理团队 文章选摘了青年创业理事会提供的
  • MQTT通信在JS中的实现

    MQTT协议 Message Queuing Telemetry Transport 消息队列遥测传输是由 IBM 发布的一种基于发布 订阅范式的 轻量级 消息协议 工作于TCP IP协议族之上 它是一种低开销 低带宽占用的即时通讯协议 可
  • 系统架构设计说明书

    目录 修订历史 文档审批信息 1 简介 1 1 目的 1 2 面向读者 1 3 文档组织 1 4 设计限定 1 5 术语说明 1 6 参考文献 2 项目建设目标和预期成果 2 1 建设目标 2 2 主要预期成果 3 系统非功能需求分析 3
  • 网络安全人才缺口超百万,如今的就业情况怎样?

    2022年9月7日 国家网络安全宣传周准时开始 本次网络安全宣传周和以前一样 主要目的都是为了普及网络安全知识 提高网络安全的防护技能 提升对电信网络诈骗的防范意识 在今年的主题论坛上 工信部发布并解读了 2022年网络安全产业人才发展报告
  • 【Vue】笔记四:浅析Vue三种开发模式:MVC、MVP、MVVM

    首先明确一点 开发模式 设计模式 开发模式 一个开发项目的方式或标准 RMVC 比较常见的三种开发模式 MVC MVP MVVM 1 MVC 个人感觉重点在View MVC全名是Model View Controller 是模型 model
  • 析构函数的注意问题以及用new开出来的空间用free释放会怎样

    大学学了越来越多的算法技术 但却不能忽略本源 编程语言是一切的基础 回过头来看依旧存在许多知识漏洞 返濮方能归真 前几天翻看别人的面经 发现了一个很有意思的问题 用new开出来的空间用free释放会怎样 借此机会 复习一下析构函数 并写了一
  • 接口测试理论

    了解接口测试https www cnblogs com houzhizhe p 6825457 html 什么是接口测试 测试人员通常所说的 接口测试 是针对系统各组件之间接口的一种测试 它属于功能测试 接口能测出普通界面操作难以发现的问题
  • 两个页面之间通过url地址栏进行传值

    第一个页面中有两个图片 当点击的时候能在第二个页面中获得它的属性值 通过location assign在第一个页面进行传值 location href在第二个页面进行接受值 一开始不会传值问题 但对于不知道怎么传值的人来说刚开始摸索 觉得好
  • useEffect详情用法

    1 为什么要使用useEffect 想必大家都是用过vue吧 在vue框架所写的项目中 我们通过在与后端进行数据交互的过程中 通常都是会在生命周期中进行数据的请求 然后将数据返回给页面进行渲染 在React中我们也是这样 但是在函数式组件中
  • Ubuntu18.04下SLEUTH 城市扩张模型编译与使用

    SLEUTH是CA模型的一种实现 由美国加州大学克拉克教授开发 可以模拟城市空间增长与土地利用变化 SLEUTH在Cygwin环境下可以运行 但是我尝试了很久都没有成功 于是我就尝试在Ubuntu系统下运行 编译与使用都非常简单 第一步 下
  • python爬虫系列7--动态网页爬取 selenium phantomjs chromedriver

    selenium phantomjs Selenium Selenium可以根据我们的指令 让浏览器自动加载页面 获取需要的数据 甚至页面截屏 或者判断网站上某些动作是否发生 Selenium自己不带浏览器 不支持浏览器的功能 它需要与第三