07 js2py和selenium

2020年06月03日 246点热度 0人点赞 0条评论

7.1 js2py 简介

7.1.1 js2py 模块的使用
  • Python中执行JS代码,通常两个库:js2py,pyexecjs
  • js2py是纯python实现的库,用在python中执行的js代码,本质上是将js代码翻译成python代码。
  • js2py安装方法:
pip install js2py
7.1.2 使用方法
import js2py
js2py.eval_js('console.log("hello world")')

func_js = """
function add(a,b){
    return a+b
}
"""

add = js2py.eval_js(funv_js)
print(add(1,2))
7.1.3 js 代码翻译
import js2py

print(js2py.translate_js("console.log('hello world')"))

# 将js文件翻译为Python脚本
js2py.translate_file('test.js','test.py')         
7.1.4 js代码中使用函数
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);
"""
js2py.eval_js(js_code)

7.2 动态HTML和Selenium

7.2.1 爬虫和反爬虫的斗争

file

最后网站维护者(反爬虫)最终放弃了,Selenium模拟人浏览网页,需要反爬成本太大了,也因此诞生了各种反爬机制的验证码。

爬虫建议
  • 尽量减少请求的次数,以免被发现
    • 把怕爬取到的页面保存成HTML文件,供查错和重复使用
  • 关注网站的所有类型的页面
    • H5页面
    • APP
  • 多为装
    • 使用代理IP(Proxy)
    • 随机切换请求头(User-Agent)
  • 利用多线程分布式
    • 在不被发现的情况下尽可能的提高速度
动态HTML技术了解
  • js

    • 是网络上最常用的脚本语言,它可以收集用户的跟踪数据,不需要重新加载页面直接提交表单,在页面嵌入多媒体文件,甚至运行网页。
  • jQuery

    • jQuery是一个快速,简介的JavaScript框架,封装了JavaScript常用的功能代码。
  • ajax

    • ajax可以使用网页实现异步更新,可以在不重新加载整个页面的情况下,对网页的某部分进行更新。
获取ajax的数据方式

1、直接分析ajax调用的接口。然后通过代码请求这个接口。

2、使用Selenium+chromedriver模拟浏览器行为获取数据

方式 优点 缺点
分析接口 直接可以请求到数据。不需要做一些解析工作。代码量少,性能高 分析接口比较复杂,特别是一些通过js混淆的接口,要有一定的js功底。容易被发现是爬虫。
selenium 直接模拟浏览器的行为。浏览器能请求到的,使用selenium也能请求到。爬虫更稳定。 代码量多。性能低。
Selenium+chromedriver获取动态数据
  • selenium是一个web的自动化测试工具,最初是为网站自动化测试而开发的,selenium可以直接运行在浏览器上,它支持所有主流的浏览器,可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至是页面截屏
  • chromedriver是一个驱动Chrome浏览器的驱动程序,使用他才可以驱动浏览器。当然针对不同的浏览器有不同的driver。
不同浏览器对应的Driver:

** 根据对应的浏览器的Driver进行安装,我们可以把相对应的Driver下载后储存在环境变量,当我们要使用的时候,直接可以调用。

安装方法:

pip install selenium
Phantomjs

除了有以上各种浏览器的Driver,我们还有一种浏览器叫做:无头浏览器,它拥有一个完整的浏览器内核,包括js解析引擎,渲染引擎,请求处理等,但是不显示和用户交互页面的浏览器。

Phantomjs案例
# 1、导入selenium模块下的webdriver
from selenium import webdriver
driver = webdriver.PhantomJS("PhantomJS的安装目录")
driver.get('https://www.baidu.com') # 加载页面
driver.save_screenshot('baidu.png') # 保存截图

# 2、定位和操作
driver.find_element_by_id("kw").send_keys("搜索关键字") # 搜索窗输入内容
driver.find_element_by_id("su").click() # 点击搜索按钮

# 3、查找请求信息
driver.page_source  # 网页源代码
driver.get_cookies()    # 用户信息
driver.current_url  # 当前URL地址

# 4、退出
driver.quit()
selenium的使用
from selenium import webdriver

# 实例化浏览器
driver = webdriver.Chrome() # 加载Chrome浏览器控件

# 发送请求
driver.get('https://www.baidu.com')

# 退出浏览器
driver.quit()

YenYoong☕

当你能梦的时候就不要放弃梦~😎

文章评论