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
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文件
function(){
console.debug("welcome to Python world");
}
js2py.translate_file('test.js', 'test.py')
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
pip install selenium
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
表达式 | 解释 |
---|---|
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()
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
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)