1. js2py简介
1.1 js2py模块使用
- Python中执行js代码,通常用2个库:js2py,pyexecjs
- js2py是纯Python实现的库,用于在Python中运行js代码,本质上是将js代码翻译成Python代码
- js2py安装:pip install js2py
1.2 快速入门
import js2py
js2py.eval_js('console.log("hello world")')
func_js="""
function add(a,b){
return a+b
}
"""
add = js2py.eval_js(func_js)
print(add(1, 2))
js代码翻译
import js2py
print(js2py.translate_js("console.log('hello world')"))
# 将js文件翻译成python脚本
js2py.translate_file('test.js','test.py')
js代码中使用函数
import js2py
# 在js中导入python模块并使用
# 使用pyimport programmer
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)
2. 动态HTML技术了解
2.1 爬虫和反爬虫的斗争
爬虫建议:
- 尽量少次数的请求网站,保存获取的HTML,供差错和重复使用
- 关注网站的所有类型页面:APP和H5页面
- 多伪装:代理IP,随机请求头
- 利用多线程分布式:在不被发现的情况下,尽可能地提高速度
2.2 ajax介绍
动态了解HTML技术
- js:全拼是javaScript,和Java没有关系的一种独立编程语言,也是最常用的一种脚本语言,可以收集用户的跟踪数据,不需要重新载入页面,直接提交表单,在页面嵌入多媒体文件,运行网页。
- JQuery:是一个快速简洁的JavaScript框架,封装了常用功能代码
- ajax:可以使用网页实现异步更新,在不重新加载网页情况下,对网页的某部分实现更新
获取ajax数据的方式
1.直接分析ajax调用的接口,通过代码请求这个接口
2.使用Seleum+chromedriver模拟浏览器方法获取
方式 | 优点 | 缺点 |
---|---|---|
分析接口 | 直接可以请求到数据,不需要做解析工作,代码量少性能高 | 分析接口比较复杂,特别是对一些通过js混淆的接口,需要一定的js功底,容易被发现是爬虫 |
seleum | 直接模拟浏览器的行为,浏览器能请求到的,seleum也能请求到,稳定性高 | 代码量多,性能差 |
3. Seleum+chromedriver获取动态数据
3.1 Seleum介绍
- Seleum是一个web自动化测试工具,最初是为了网站自动化测试而开发的,seleum可以直接在浏览器上运行,支持所有主流的浏览器,可以接受指令,让浏览器自动加载页面,获取需要的数据,甚至是网页截图
- chromedriver是一个驱动Chrome浏览器的驱动程序,使用这个才能驱动浏览器。针对不同的浏览器有不同的driver
- 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.2 Phantomjs入门
- 无头浏览器: 一个完整的浏览器内核,包括js引擎分析,渲染引擎,请求处理等,但是不包括显示和用户交互的页面浏览器
- Phantomjs案例:
# 1.加载网页
from seleum import webdriver
driver = webdriver.PhantomJS("安装目录")
driver.get("https://www.baidu.com")
driver.save_screenshots("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
# 4. 退出
driver.quit()
seleum实例介绍
from seleum import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
driver.quit()