Python爬虫——js2py与selenium
- 1.js2py简介
- 1.1 python中的js2py模块
- 1.2 js2py的使用
- 2.动态HTML技术
- 2.1 爬虫的进化史
- 2.2 ajax的介绍
- 了解动态HTML技术
- 获取ajax数据的方式
- 3.Selenium+chromedrive获取动态数据
- 3.1 Selenium介绍
- 3.2 webdriver快速上手
- 3.3 selenium快速上手
1.js2py简介
1.1 python中的js2py模块
- JS全称为JavaScript ,属于 HTML 和 Web 的编程语言
- Python中也可以执行JS代码,但需要两个库:js2py,pyexecjs,在这里我们主要使用js2py
- js2py是全由python实现的库,实质上就是将js代码翻译成python代码,js2py可用于在python中运行js代码
- js2py的安装:pip install js2py、在PyCharm中安装
1.2 js2py的使用
- Js控制台输出
1 2 3 4 5 6 7 8 9 10 11 12 13 | import js2py # 控制台输出 js2py.eval_js('console.log("HELLO!")') # 定义函数并调用 func_js = """ function mul(a,b){ return a*b } """ mul = js2py.eval_js(func_js) print(mul(5, 6)) # 'HELLO!' # 30 |
- Js代码的翻译
1 2 3 4 5 6 7 8 9 10 | import js2py print(js2py.translate_js("console.log('HELLO!')")) # 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!')) |
- Js使用函数
1 2 3 4 5 6 7 8 9 | import js2py 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 爬虫的进化史
| 爬虫者 | 问题 | 反爬着 |
|---|---|---|
| 多线程多进程快速爬取 | 网站压力大,并且访问ip相同 | 检测User-Agent,限制访问 |
| 设置User-Agent模拟浏览器访问并获取代理ip | 网站压力依然非常大,不符合正常现象 | 设置登录访问 |
| 注册账号,携带cookie进行爬取 | 单账号访问存在异常 | 限制账号权限 |
| 注册多账号或某宝购买多账号,多cookie池,多账号联合爬取 | ip访问过于频繁 | 封锁频繁访问的ip |
| 限制自己的爬取速度 | 不能像人一样识别验证码等 | 设置验证码策略 |
| 通过机器学习识别验证码 | 大量请求html,而不请求js与css | 将重要数据或整个页面通过ajax加载 |
| 采用selenium和phantomjs完全模拟浏览器操作 | 0-0 | 不来了,你慢慢爬吧 |
因此,在爬取数据时,我们要:
- 尽量减少请求次数
- 能抓取列表页就不抓取详情页
- 保存获取到的HTML,供查错和重复使用
- 关注网站的所有类型的页面
- H5页面
- APP
- 多伪装
- 代理IP
- 随机请求头
2.2 ajax的介绍
了解动态HTML技术
| HTML技术 | 简介 |
|---|---|
| JS | 网络上最常用的脚本语言,它可以收集用户的跟踪数据,不需要重载页面直接提交表单,在页面嵌入多媒体文件,甚至运行网页 |
| jQuery | 是一个快速、简介的JavaScript框架,封装了JavaScript常用的功能代码 |
| ajax | 可以使用网页实现异步更新,可以在不加载整个网页的情况下,对网页进行本分更新 |
获取ajax数据的方式
- 1.直接分析ajax调用的接口,然后通过代码请求这个接口
- 2.使用Selenium+chromedriver模拟浏览器行为获取数据
| 方式 | 优点 | 缺点 |
|---|---|---|
| 分析接口 | 可直接请求到数据。不需要做分析。代码少,性能高 | 分析接口比较复杂,特别是一些通过js混淆的接口,需要一定的js的功底。容易被发现是爬虫 |
| selenium | 直接模拟浏览器的行为。浏览器能请求到的,使用selenium也能请求到。更稳定 | 代码量多。性能低 |
3.Selenium+chromedrive获取动态数据
3.1 Selenium介绍
- Selenium是一个web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium可以直接运行在浏览器上,它支持所有的主流浏览器,可以接受指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏
- chromedrive是一个驱动Chrome浏览器的驱动程序,使用它才能驱动浏览器。当然,针对不同浏览器还有不同的drive。下面是不同浏览器及其对应的driver:
| 浏览器 | driver |
|---|---|
| Chrome | http://chromedriver.storage.googleapis.com/index.html |
| 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-insafari-10/ |
- 下载chromedriver
- 百度搜索:淘宝镜像(https://npm.taobao.org/)
- 安装selenium
3.2 webdriver快速上手
- PhantomJS
- 无头浏览器:?个完整的浏览器内核,包括js解析引擎、渲染引擎、请求处理等,但是不包括显示和?户交互??的浏览器
实例如下:
- 无头浏览器:?个完整的浏览器内核,包括js解析引擎、渲染引擎、请求处理等,但是不包括显示和?户交互??的浏览器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | # 1.加载?? from selenium import webdriver import time # PhantomJS为无头浏览器 driver = webdriver.PhantomJS('地址') driver.get("https://www.baidu.com") # 截屏 # driver.save_screenshot("baidu.png") # 2.定位和操作 driver.find_element_by_id("kw").send_keys("python") driver.find_element_by_id("su").click() # time.sleep(3) # driver.save_screenshot("baidu.png") # 3.查看请求信息 # 当前页面源信息 driver.page_source # 当前cookies driver.get_cookies() # 当前url driver.current_url # 4.退出 driver.quit() |
3.3 selenium快速上手
1 2 3 4 5 6 7 | from selenium import webdriver # 实例化浏览器 driver = webdriver.Chrome() # 发送请求 driver.get('https://www.baidu.com') # 退出浏览器 driver.quit() |