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 的相关文章

  • 使用python查找txt文件中字母出现的次数

    我需要从 txt 文件中读取该字母并打印 txt 文件中出现的次数 到目前为止 我已经能够在一行中打印内容 但计数有问题 有人可以指导吗 infile open grades txt content infile read for char
  • 稀有对象的 python 类型注释,例如 psycopg2 对象

    我了解内置类型 但是我如何指定稀有对象 例如数据库连接对象 def get connection and cursor gt tuple psycopg2 extensions cursor psycopg2 extensions conn
  • 多处理中的动态池大小?

    有没有办法动态调整multiprocessing Pool尺寸 我正在编写一个简单的服务器进程 它会产生工作人员来处理新任务 使用multiprocessing Process对于这种情况可能更适合 因为工作人员的数量不应该是固定的 但我需
  • 是否可以从 Julia 调用 Python 函数并返回其结果?

    我正在使用 Python 从网络上抓取数据 我想使用这些数据在 Julia 中运行计算 是否可以在 Julia 中调用该函数并返回其结果 或者我最好直接导出到 CSV 并以这种方式加载数据 绝对地 看PyCall jl https gith
  • 使用 Boto3 以字符串形式打开 S3 对象

    我知道使用 Boto 2 可以使用以下命令将 S3 对象作为字符串打开 get contents as string http boto readthedocs org en latest ref file html highlight c
  • 无法在 selenium 和 requests 之间传递 cookie,以便使用后者进行抓取

    我用 python 结合 selenium 编写了一个脚本来登录网站 然后从driver to requests这样我就可以继续使用requests进行进一步的活动 I used item soup select one div class
  • 协程从未被等待

    我正在使用一个简单的上下文管理器 其中包含一个异步循环 class Runner def init self self loop asyncio get event loop def enter self return self def e
  • 如何使用scrapy检查网站是否支持http、htts和www前缀

    我正在使用 scrapy 来检查某些网站是否工作正常 当我使用http example com https example com or http www example com 当我创建 scrapy 请求时 它工作正常 例如 在我的pa
  • Python HMAC:类型错误:字符映射必须返回整数、None 或 unicode

    我在使用 HMAC 时遇到了一个小问题 运行这段代码时 signature hmac new key secret key msg string to sign digestmod sha1 我收到一个奇怪的错误 File usr loca
  • Python将文本文件解析为嵌套字典

    考虑以下数据结构 HEADER1 key value key value HEADER2 key value key value HEADER3 key value HEADER4 key value key value 原始数据中没有缩进
  • 使用 for 循环创建一系列元组

    我已经搜索过 但找不到答案 尽管我确信它已经存在了 我对 python 很陌生 但我以前用其他语言做过这种事情 我正在以行形式读取数据文件 我想将每行数据存储在它自己的元组中 以便在 for 循环之外访问 tup i inLine wher
  • Plotly:如何检查基本图形结构(版本 4)

    对于旧版本的plotly 例如在 Jupyterlab 中 您可以简单地运行figure像这样检查你的图形的基础知识 Ouput data marker color red size 10 symbol 104 mode markers l
  • pandas 相当于 np.where

    np where具有向量化 if else 的语义 类似于 Apache Spark 的when otherwise数据帧方法 我知道我可以使用np where on pandas Series but pandas通常定义自己的 API
  • 是否需要关闭没有引用它们的文件?

    作为一个完全的编程初学者 我试图理解打开和关闭文件的基本概念 我正在做的一项练习是创建一个脚本 允许我将内容从一个文件复制到另一个文件 in file open from file indata in file read out file
  • 检测是否从psycopg2游标获取?

    假设我执行以下命令 insert into hello username values me 我跑起来就像 cursor fetchall 我收到以下错误 psycopg2 ProgrammingError no results to fe
  • 无法通过 Python 子进程进行 SSH

    我需要通过堡垒 ssh 进入机器 因此 该命令相当长 ssh i
  • AWS Lambda 不读取环境变量

    我正在编写一个 python 脚本来查询 Qualys API 中的漏洞元数据 我在 AWS 中将其作为 lambda 函数执行 我已经在控制台中设置了环境变量 但是当我执行函数时 出现以下错误 module initialization
  • 如何给URL添加变量?

    我正在尝试从网站收集数据 我有一个 Excel 文件 其中包含该网站的所有不同扩展名 F i www example com example2 我有一个脚本可以成功从网站中提取 HTML 但现在我想为所有扩展自动执行此操作 然而 当我说 s
  • 将 Keras 集成到 SKLearn 管道?

    我有一个 sklearn 管道 对异构数据类型 布尔 分类 数字 文本 执行特征工程 并想尝试使用神经网络作为我的学习算法来拟合模型 我遇到了输入数据形状的一些问题 我想知道我想做的事情是否可能 或者我是否应该尝试不同的方法 我尝试了几种不
  • 如何(安全)将 Python 对象发送到我的 Flask API?

    我目前正在尝试构建一个 Flask Web API 它能够在 POST 请求中接收 python 对象 我使用 Python 3 7 1 创建请求 使用 Python 2 7 运行 API 该 API 设置为在我的本地计算机上运行 我试图发

随机推荐

  • 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自己不带浏览器 不支持浏览器的功能 它需要与第三