Python爬虫——js2py与selenium

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解析引擎、渲染引擎、请求处理等,但是不包括显示和?户交互??的浏览器
      实例如下:
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()