python之jspy和selenium浅谈

js2py简介

js2py安装库现在写爬虫很多的网站都开始用js 加密技术了,所以这个库必须要学的。
Python中执⾏JS代码,通常两个库:js2py,pyexecjs
js2py是纯python实现的库,⽤于在python中运⾏js代码,本质上是将js代码翻 译成python代码 js2py安装

pip install js2py
import js2py

js2py.eval_js('console.log("hello python, I am js2py")')
func_js = '''
function subtraction(a,b)
{    
    return a-b 
} 
'''
add = js2py.eval_js(func_js)
print(add(200, 2))
#'hello python, I am js2py'
#198

js代码翻译

翻译js函数

print(js2py.translate_js('console.log("hello python, I am js2py")'))
# from js2py.pyjs import *
# # setting scope
# var = Scope( JS_BUILTINS )
# set_global_object(var)
# 
# # Code follows:
# var.registers([])
# var.get('console').callprop('log', Js('hello python, I am js2py'))

翻译js文件

js文件


function(){
    console.debug("welcome to Python world");
}
 js2py.translate_file('test.js', 'test.py')

Selenium

Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。
driver是一个驱动浏览器的驱动程序,针对不同的浏览器有不同的driver。以下列出了不同浏览器及其对应的driver:
Chrome: https://sites.google.com/a/chromium.org/chromedriver/download s
Firefox:https://github.com/mozilla/geckodriver/releases
下载chromedriver
百度搜索:淘宝镜像(https://npm.taobao.org/
安装总结:https://www.jianshu.com/p/a383e8970135

安装Selenium:

pip install selenium

PhantomJS快速使用

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


from selenium import webdriver
import time

# 建议最好把驱动放在当前的文件夹中
driver = webdriver.PhantomJS('../phantomjs.exe')

# 打开百度(无界面浏览器)
driver.get('https://www.baidu.com/')


#截屏
#driver.save_screenshot('baidu.png')

#定位到搜索框
#driver.find_element_by_name('wd').send_keys('phantomjs')
driver.find_element_by_id('kw').send_keys('phantomjs实例')
#driver.save_screenshot('baidu.png')

#定位到百度的搜索按钮,然后点击
#driver.find_element_by_class_name('bg s_btn').click()
#driver.find_element_by_class_name('s_btn').click()
driver.find_element_by_id('su').click()
time.sleep(2)
#截屏
#driver.save_screenshot('../baidu.png')

#查看网页源代码
#print(driver.page_source)

#请求的url
print(driver.current_url)
#https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=phantomjs%E5%AE%9E%E4%BE%8B&fenlei=256&rsv_pq=ac3bee8a00000254&rsv_t=81361WAJo1Xb5DvmNTmx56dvO9Rxs76DDd0Z6kd47w8Roqx1c1J9APbn6Qs&rqlang=cn&rsv_enter=0&rsv_dl=ib&rsv_sug3=11&rsv_btype=i&inputT=130&rsv_sug4=130

selenium使用

selenium定位

表达式解释
find_element_by_id根据id来查找某个元素
find_element_by_class_name根据类名查找元素
find_element_by_name根据name属性的值来查找元素
find_element_by_tag_name根据标签名来查找元素
find_element_by_xpath根据xpath语法来获取元素
find_element_by_css_selector根据css选择器选择元素

要注意,find_element是获取第一个满?条件的元素。find_elements 是获取所有满足条件的元素

rom selenium import webdriver
import time

#方法二
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()

# 打开百度
driver.get('https://www.baidu.com/')

# #窗口最大化
# driver.maximize_window()
#
# time.sleep(2)
#
# #窗口最小化
# driver.minimize_window()
# time.sleep(2)
# #关闭窗口
# driver.close()

driver.maximize_window()
#driver.find_element_by_name('wd').send_keys('Chrome使用')
#driver.find_element_by_id('kw').send_keys('Chrome教程')
#方法二
#driver.find_element(By.ID,'kw').send_keys('Chrome使用')


#driver.find_element_by_class_name('s_ipt').send_keys('Chrome例子')
#driver.find_element(By.CLASS_NAME,'s_ipt').send_keys('Chrome知识')


#driver.find_element_by_xpath('//input[@id="kw"]').send_keys('xpath')
#可以通过右键网页“检查”功能中的Elements定位到目标位置,然后右键copy相关内容
#driver.find_element_by_xpath('//*[@id="kw"]').send_keys('xpath copy')

# .表示class , #表示id
#driver.find_element_by_css_selector('#kw').send_keys('css_selector')
#driver.find_element(By.CSS_SELECTOR,'#kw').send_keys('By css_selector')

input_elements = driver.find_elements_by_tag_name('input')
print(input_elements,len(input_elements))



#关闭浏览器
#driver.close()

操作checkbox

from selenium import webdriver
import time

driver = webdriver.Chrome()

from selenium.webdriver.support.ui import Select

driver.get('https://www.17sucai.com/pins/demo-show?id=5926')

#check_box_e = driver.find_element_by_name('country-wrap')
#selenium.common.exceptions.NoSuchElementException: Message: no such element:

#原因是iframe
#https://www.17sucai.com/preview/157524/2014-07-08/jQuery自定义下拉菜单插件dropkick/index.html

#解决方法就必须切换到ifram里面
#time.sleep(3)
driver.switch_to_frame(driver.find_element_by_id('iframe'))
#driver.switch_to.frame(driver.find_element_by_id('iframe'))
# 找到下拉框
check_box_e = Select(driver.find_element_by_name('country-wrap'))

#选择方式

#1.根据值来选择
check_box_e.select_by_value('AU')
time.sleep(1)
#2.根据索引来选择
check_box_e.select_by_index(3)


from selenium import webdriver
import time


driver = webdriver.Chrome()

driver.get('https://www.douban.com/')

#ifrname_sel = driver.find_element_by_css_selector('#anony-reg-new > div > div.login > iframe')
#ifrname_sel = driver.find_element_by_xpath('//*[@id="anony-reg-new"]/div/div[1]/iframe')
ifrname_sel = driver.find_element_by_xpath('//div[@class="login"]/iframe')
#切换到密码登录
driver.switch_to.frame(ifrname_sel)

#print(driver.page_source)
time.sleep(2)
#print(driver.current_url)

pass_login = driver.find_element_by_xpath('//li[@class="account-tab-account"]')
pass_login.click()

username =  driver.find_element_by_id('username')
username.send_keys('1234567890')

password = driver.find_element_by_id('password')
password.send_keys('abc12345678')

auto_login = driver.find_element_by_name('remember')

auto_login.click()

练习登录豆瓣

from selenium import webdriver
import time


driver = webdriver.Chrome()

driver.get('https://www.douban.com/')

#ifrname_sel = driver.find_element_by_css_selector('#anony-reg-new > div > div.login > iframe')
#ifrname_sel = driver.find_element_by_xpath('//*[@id="anony-reg-new"]/div/div[1]/iframe')
ifrname_sel = driver.find_element_by_xpath('//div[@class="login"]/iframe')
#切换到密码登录
driver.switch_to.frame(ifrname_sel)

#print(driver.page_source)
time.sleep(2)
#print(driver.current_url)

pass_login = driver.find_element_by_xpath('//li[@class="account-tab-account"]')
pass_login.click()

username =  driver.find_element_by_id('username')
username.send_keys('1234567890')

password = driver.find_element_by_id('password')
password.send_keys('abc12345678')

auto_login = driver.find_element_by_name('remember')

auto_login.click()

auto_button = driver.find_element_by_class_name('btn-account')
auto_button.click()

行为链

有时候在页面中的操作可能要有很多步,那么这时候可以使鼠标行为链类
ActionChains来完成。示例如下:

from selenium import webdriver

from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()

driver.get('https://www.baidu.com')

#定位到输入框
input_e = driver.find_element_by_name('wd')
# input_e.send_keys('行为链')

#定位到百度按钮

btn_e = driver.find_element_by_id('su')
#btn_e.click()

#实例化行为链
actions = ActionChains(driver)
#模仿人的行为,如:
#第一步: 把鼠标移动到输入框
actions.move_to_element(input_e)
#第二步: 输入检索信息
actions.send_keys_to_element(input_e,'行为链录入')
#第三步: 点击搜索(焦点的移动)
actions.move_to_element(btn_e).click()
#第四步: 点击右键
actions.move_to_element(btn_e).context_click()

# 提交行为
actions.perform()

click_and_hold(element):点击但不松开鼠标。
context_click(element):右键点击。
double_click(element):双击。
更多方法请参考:http://selenium-python.readthedocs.io/api.html

Selenium页面等待

Cookie操作

from selenium import webdriver


driver = webdriver.Chrome()

#获取所有cookies,返回一个列表
driver.get('https://www.baidu.com/')

#print(driver.get_cookies())

# for cookie in driver.get_cookies():
#     print(cookie)
#根据cookie的name获取cookie
print(driver.get_cookie('H_PS_PSSID'))

#删除某个cookie
driver.delete_cookie('H_PS_PSSID')

print(driver.get_cookie('H_PS_PSSID'))
#None

页面等待

现在的网页越来越多采用了 Ajax 技术,这样程序便不能确定何时某个元素完全加载出来了。
如果实际页面等待时间过长导致某个dom元素还没出来,而且代码直接使用了这个WebElement,那么就会抛出NullPointer的异常。为了解决这个问题。所以 Selenium 提供了两种等待方式:一种是隐式等待、一种是显式等待。
隐式等待:调用driver.implicitly_wait。
那么在获取不可用的元素之前,会先等待10秒中的时间

 driver.implicitly_wait(10)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Narutolxy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值