python爬虫六:js2py以及selenium的使用

2023-11-19

1、js2py简介

http://www.porters.vip/verify/sign/ # 案例查看
Python中执行JS代码,通常两个库:js2py,pyexecjs
js2py是纯python实现的库,用于在python中运行js代码,本质上是将js代码翻译成python代码
js2py安装 pip install js2py

1.1快速入门

import js2py
print(js2py.eval_js('console.log("hello wrold")'))#括号内的为js语法可为语句可为函数
add = js2py.eval_js("function add(a,b){return a+b}")
print(add(1, 2))

1.2代码翻译

import js2py
#将js语句翻译为python语句
print(js2py.translate_js("console.log('hello world')"))
# 将js文件翻译为Python脚本(文件)
js2py.translate_file('test.js', 'test.py')

1.3代码中使用模块

import js2py
# 在js代码中导入Python模块并使用
# 使用pyimport语法
js_code = """
pyimport requests
console.log('导入成功');
var response = requests.get('http://www.baidu.com');
console.log(response.url);
console.log(response.content);
"""
print(js2py.eval_js(js_code))

2、ajax基本介绍

2.1动态了解HTML技术

• JS
• 是网络上最常用的脚本语言,它可以收集用户的跟踪数据,不需要重载页面直接提交表单,在页面嵌入多媒体文件,甚至运行网页
• jQuery
• jQuery是一个快速、简介的JavaScript框架,封装了JavaScript常用的功能代码
• ajax
• ajax可以使用网页实现异步更新,可以在不重新加载整个网页的情况下,对网页的某部分进行更新

2.2获取ajax数据的方式

1.直接分析ajax调用的接口。然后通过代码请求这个接口。
2.使用Selenium+chromedriver模拟浏览器行为获取数据
在这里插入图片描述

3、selenium + chromedriver获取动态数据

Chrome各版本驱动的下载地址
http://chromedriver.storage.googleapis.com/index.html

Firefox浏览器对应各个版本驱动下载地址:
https://github.com/mozilla/geckodriver/releases/

firefox各个版本安装包的下载地址:
http://ftp.mozilla.org/pub/firefox/releases/

3.1selenium简介

3.1.1

selenium是一个web的自动化测试工具,最初是为网站自动化测试而开发的,selenium可以直接运行在浏览器上,它支持所有主流的浏览器,可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏

3.1.2

chromedriver是一个驱动Chrome浏览器的驱动程序,使用他才可以驱动浏览器。当然针对不同的浏览器有不同的driver。以下列出了不同浏览器及其对应的driver:下载完后要记得添加环境变量或者直接加到python的环境变量中去
Chrome:https://sites.google.com/a/chromium.org/chromedriver/downloads
Firefox:https://github.com/mozilla/geckodriver/releases
Edge:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
Safari:https://webkit.org/blog/6900/webdriver-support-in-safari-10/
下载chromedriver
百度搜索:(淘宝镜像)
安装总结:https://www.jianshu.com/p/a383e8970135
安装Selenium:pip install selenium

3.2phtomjs

无头浏览器:一个完整的浏览器内核,包括js解析引擎,渲染引擎,请求处理等,但是不包括显示和用户交互页面的浏览器

import time
from selenium import webdriver
# 驱动路径
driver = webdriver.PhantomJS()
# 打开网站
driver.get('https://www.baidu.com')
driver.find_element_by_id('kw').send_keys('python')
driver.find_element_by_id('su').click()
time.sleep(5)
driver.save_screenshot('baidu.png')
# 查看当前请求的url地址
print(driver.current_url)
#查看当前网页源代码
print(driver.page_source)

3.3selenium快速入门

import time
from selenium import webdriver

driver = webdriver.Chrome()
#窗口最大化
driver.maximize_window()
driver.get('https://www.baidu.com')
cookie = driver.get_cookies()
time.sleep(3)
driver.close()
time.sleep(1)
# 退出浏览器
driver.quit()

4、定位元素

4.1find_element_by_id()

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.find_element_by_id('kw').send_keys('python***')
driver.find_element(By.ID,'kw')

4.2find_element_by_name()

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.find_element_by_name('')
driver.find_element(By.NAME,'')

4.3find_element_by_tag_name()

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.find_element_by_tag_name('')
driver.find_element(By.TAG_NAME,'')

4.4find_element_by_xpath()

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.find_element_by_xpath('')
driver.find_element(By.XPATH,'')

find_element是获取第一个满足条件的元素。find_elements是获取所有满足条件的元素

5、操作表单元素

5.1操作输入框

第一步:找到这个元素。
第二步:使用send_keys(value),将数据填充进去
使用clear方法可以清除输入框中的内容

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome()
driver.get('https://baidu.com/')

# ipt = driver.find_element_by_id('kw').send_keys('python')
# time.sleep(2)
# ipt.clear()
# ipt = driver.find_element_by_id('kw')
# print(type(ipt))#<class 'selenium.webdriver.remote.webelement.WebElement'>
# print(type(ipt.send_keys('python')))#<class 'NoneType'>
# time.sleep(2)
# ipt.clear()

5.2 操作checkbox

select元素不能直接点击。因为点击后还需要选中元素。这时候selenium就专门为select标签提供了一个类selenium.webdriver.support.ui.Select。将获取到的元素当成参数传到这个类中,创建这个对象。以后就可以使用这个对象进行选择了。
其它类型的下拉菜单直接定位选择就可

from selenium import webdriver
from selenium.webdriver.support.ui import Select

driver = webdriver.Chrome()
driver.get('https://www.17sucai.com/pins/demo-show?id=5926')
# driver.switch_to_frame(driver.find_element_by_id('iframe'))
driver.switch_to.frame(driver.find_element_by_id('iframe'))
ipt = Select(driver.find_element_by_name("country-wrap"))
ipt.select_by_index(2)
ipt.click()#AttributeError: 'Select' object has no attribute 'click'

6、行为链

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
# 定位到输入框
inputTag = driver.find_element_by_id('kw')
# 定位到百度一下按钮
submitBtn = driver.find_element_by_id('su')
# 实例化对象
actions = ActionChains(driver)
# 把鼠标移动到输入框中
actions.move_to_element(inputTag)
# 输入内容
actions.send_keys_to_element(inputTag,'jerry')
actions.move_to_element(submitBtn)
actions.click()
# 右键
actions.context_click()
# 提交行为链上的操作
actions.perform()

7、selenium页面等待

4.1cookie操作

保存用户在客户端的一些信息

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https:www.baidu.com/')
cookies = driver.get_cookies() # Returns a set of dictionaries
print(cookies)
# for cookie in cookies:
#     # print(cookie)
print('*'*50)
print(driver.get_cookie('BD_HOME')) # 通过value来获得
driver.delete_cookie('BD_HOME') # 通过value来删除

4.2页面等待

# from selenium import webdriver
# import time
# driver = webdriver.Chrome()
# driver.get('https://www.baidu.com/')
# 强制等待
# # time.sleep(2)
# # 隐式等待
# driver.implicitly_wait(5)
# driver.find_element_by_id('kw').send_keys('python')
# 显式等待
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
 )
finally:
    driver.quit()
# sleep()  强制等待
# implicitly_wait(5)  隐式等待
# ebDriverWait() 显示等待

现在的网页越来越多采用了 Ajax 技术,这样程序便不能确定何时某个元素完全加载出来了。如果实际页面等待时间过长导致某个dom元素还没出来,但是你的代码直接使用了这个WebElement,那么就会抛出NullPointer的异常。为了解决这个问题。所以 Selenium 提供了两种等待方式:一种是隐式等待、一种是显式等待
• 隐式等待:调用driver.implicitly_wait。那么在获取不可用的元素之前,会先等待10秒中的时间
显示等待:显示等待是表明某个条件成立后才执行获取元素的操作。也可以在等待的时候指定一个最大的时间,如果超过这个时间那么就抛出一个异常。显示等待应该使用selenium.webdriver.support.excepted_conditions期望的条件和selenium.webdriver.support.ui.WebDriverWait来配合完成
一些其他的等待条件
• presence_of_element_located:某个元素已经加载完毕了。
• presence_of_all_elements_located:网页中所有满足条件的元素都加载完毕了。
• element_to_be_clickable:某个元素是可以点击了。
更多条件请参考:http://selenium-python.readthedocs.io/waits.html

8、打开多窗口和切换页面

有时候窗口中有很多子tab页面。这时候肯定是需要进行切换的。selenium提供了一个叫做switch_to_window来进行切换,具体切换到哪个页面,可以从driver.window_handles中找到

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.execute_script('windows.open("https://www.douban.com/")')
# driver.close() 关闭的是当前的窗口,无论调用多少次豆瓣都不会关闭
# driver.quit()  退出驱动了,关闭了所有的窗口
driver.find_element_by_id('kw').send_keys('python')
print(driver.current_url)#操作的也是当前窗口,与其他打开的窗口无关
# 切换窗口,进行切换操作
driver.switch_to.window(driver.window_handles[1])#从0开始打开
print(driver.current_url)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python爬虫六:js2py以及selenium的使用 的相关文章

  • 采用通信方式控制台达B2伺服驱动器运行在速度模式

    目录 前言 一 伺服驱动器恢复出厂设置 二 伺服驱动器设置为速度模式 三 关闭告警信息 四 通讯功能设置 五 采用通信功能控制伺服驱动器按速度模式运行 总结 前言 最近 使用台达B2伺服驱动器做项目 项目中用伺服电机的速度模式驱动一个螺杆按
  • Linux笔记--查看Linux系统自动Kill掉的进程

    目录 1 前言 2 查看系统日志 3 参考 1 前言 今天在服务器训练一个模型 程序无任何错误 但一段时间后挂在后台的进程莫名被Kill掉 原因在于服务器 linux 系统的运行内存不足 为了避免系统奔溃 系统主动 kill 内存占用最大的
  • Python项目创建(Pycharm程序)

    点击 新建项目 创建一个新的项目 这一步重点在Python解释器的选择 一个是新建虚拟环境 另一个是使用已有环境 使用此工具新建环境 Virtualenv 新建后在项目根目录下会出现 venv 的文件夹 相当于把Python解释器复制过去一
  • RANSAC算法实现 + 直线拟合

    一 RANSAC算法 1 参考资料 1 题目来源与解析 商汤科技SLAM算法岗的RANSAC编程题 2 牛客网题目 编程题 线性回归 3 牛客网解答参考 商汤科技某算法岗的编程题有点过分了啊 4 RANSAC算法原理 RANSAC翻译 经典
  • TOPIAM 社区版 1.0.0 发布,开源 IAM/IDaaS 企业身份管理平台

    文章目录 产品概述 系统架构 功能列表 管理端 门户端 技术架构 后续规划 相关地址 Hi 亲爱的朋友们 今天是传统 24 节气中的立秋 秋天是禾谷成熟 收获的季节 经过长时间优化和迭代 TOPIAM 企业身份管控平台也迎来了当下的成长和收
  • [Redis]-四种部署方式

    森格 2022年11月 本文是对Redis部署方式的学习 主要学习基本原理 以及几种方式的优缺点 一 部署方式概况 对于Redis的安装部署主要可以分为单机版 主从同步 Sentinel哨兵 Cluster集群部署四种方式 下面一起看下几种

随机推荐

  • AutoCAD 2022 for Mac v2022(24.1.50.899)中文版介绍

    CAD2022 Mac是一款针对苹果电脑打造的CAD设计软件 用于二维绘图 详细绘制 设计文档和基本三维设计 广泛应用于机械设计 工业制图 工程制图 土木建筑 装饰装潢 服装加工等多个行业领域 CAD2022新特征 改进了桌面 Web和移动
  • 一个全网最详细的Python教程,不信你来学一学!2023Python入门教程完整版,无偿分享

    近几年 编程越来越火 网上也是铺天盖地的免费教程 中小学生都开始投入到学习中 编程学习从娃娃抓起 甚至有些小学生都做起了 UP 主 教大家学编程 PS 我落下了柠檬的眼泪 小小年纪就学得一手好编程 光从编程的难易度来说 Python 简单
  • IDEA进行了Pull操作,Merge时选择了他们的优先,但自己的代码没有Push导致自己未提交的代码没了,头脑发热我差点哭出来解决方案

    IDEA进行了Pull操作 Merge时选择了他们的优先 但自己的代码没有Push导致自己未提交的代码没了 头脑发热我差点哭出来解决方案 问题背景 解决方案 心得 Lyric 沉默是因为包容 问题背景 我和胖哥同时在一个项目里面开发 我让他
  • 华为OD机试 - 判断字符串子序列(Java)

    题目描述 给定字符串 target和 source 判断 target是否为 source 的子序列 你可以认为target和 source 中仅包含英文小写字母 字符串 source 可能会很长 长度 500 000 而 target是个
  • python笔记(爬虫 微爬取微信信息)

    views py import time import json import re import requests from bs4 import BeautifulSoup from flask import Blueprint ren
  • DevExpress ASP.NET GridView在Edit时弹出新窗体

    1 设置setting editing属性 选择PopupEditForm 2 如果在源代码中设置的话 如下
  • 机器学习入门教学——梯度下降、梯度上升

    1 简介 梯度表示某一函数在该点处的方向导数沿着该方向取得最大值 即函数在该点处沿着该方向 梯度的方向 变化最快 变化率 梯度的模 最大 可理解为导数 梯度上升和梯度下降是优化算法中常用的两种方法 主要目的是通过迭代找到目标函数的最大值和最
  • 编译原理实验一(C-语言词法分析器的编写C语言版本)

    编译原理实验一 C 语言词法分析器的编写C语言版本 一 tiny词法分析程序源代码阅读笔记 重要变量和函数 变量和函数 A 要计算的唯一特性是词法或是被识别的记号的串值 变量t o k e n S t r i n g B 扫描程序使用3个全
  • 设计模式:观察者模式

    观察者模式 又被称为发布 订阅 Publish Subscribe 模式 属于行为型模式的一种 它定义了一种一对多的依赖关系 让多个观察者对象同时监听某一个主题对象 这个主题对象在状态变化时 会通知所有的观察者对象 使他们能够自动更新自己
  • github-render.s3.amazonaws.com 报错 The specified key does not exist.

    GitHub网站在浏览 ipynb 类型的文件的时候 需要调用 https github render s3 amazonaws com 下面的接口 结果一直报404错误 返回的 xml 里面信息是 The specified key do
  • 数据结构——排序算法——基数排序

    基数排序有两种实现方式 本例属于最高位优先法 思路是从最高位开始 依次对基数进行排序 与之对应的是 最低位优先法 思路是从最低位开始 依次对基数进行排序 基数排序可以分为以下三个步骤 1 找到数组中的最大值 确定最大数字的位数 2 从最低位
  • 单片机设计_超声波测距仿真(AT89C51)

    超声波测距仿真 一 电路设计 超声波模块介绍 由于超声波指向性强 能量消耗缓慢 在介质中传播的距离较远 因而超声波经常用于距离的测量 利用超声波检测往往比较迅速 方便 计算简单 易于做到实时控制 并且在测量精度方面能达到工业实用的要求 因此
  • 3种方法:字符串转换整数 (atoi)

    文章目录 题目 解法一 排除法Python 解法二 正向逻辑C 解法三 有限状态机 C语言 题目 请你来实现一个 atoi 函数 使其能将字符串转换成整数 首先 该函数会根据需要丢弃无用的开头空格字符 直到寻找到第一个非空格的字符为止 接下
  • makefile中的多target混乱依赖模式

    来看个例子 makefile内容为 test1 test2 test1 cpp test2 cpp clean rm f test1 test2 这是一种非常懒散的写法 虽然可以work taoge localhost Desktop gt
  • TextSymbol使用方法

    private var grapbiaozhu GraphicsLayer new GraphicsLayer grapbiaozhu clear map addLayer grapbiaozhu var gra Graphic new G
  • 正点原子 第30章 SPI通信实验

    第三十章 SPI 实验 mw shl code c true 1 硬件平台 正点原子探索者STM32F407开发板 2 软件平台 MDK5 1 3 固件库版本 V1 4 0 mw shl code 本章我们将向大家介绍STM32F4的SPI
  • Python基础数据类型之字符串(一)

    Python基础数据类型之字符串 一 一 字符串格式化 1 字符串占位符 2 字符串格式化操作 二 f string格式化 三 字符串的索引 四 字符串的切片 1 常规切片使用方法 3 步长的介绍 2 切片使用方法二 一 字符串格式化 1
  • 按键精灵直接运行cmd指令

    vbs Set ObjShell CreateObject Wscript Shell vbs SttCommand cmd exe C 具体指令 vbs ObjShell Run SttCommand 0 False 比如执行python
  • vant组件库

    移动端组件库参考 https www jianshu com p c3c671787d1d 官网 https vant contrib gitee io vant v2 zh CN 1 下载安装vant组件库 cnpm i vant lat
  • python爬虫六:js2py以及selenium的使用

    1 js2py简介 http www porters vip verify sign 案例查看 Python中执行JS代码 通常两个库 js2py pyexecjs js2py是纯python实现的库 用于在python中运行js代码 本质