1 Introduction

1.1 Category

在爬取网页内容的时候因为JS混淆获取cookie, 网站过于复杂等原因, 无法快速的分析网站并抓取数据, 这时候就会使用现有的一些轻量级浏览器, WEB自动化测试框架来实现可见即可得的数据抓取服务, 其中较为出名的就是selenium([sɪ'liːnɪəm]), 以及最新的NodeJS API-puppeteer(傀儡师 [‚pʌpɪ'tɪə‚pʌpə'tɪə]).

这里我们就来介绍一下已有的几种轻量级浏览器, 其中python语言环境下:

  • PhantomJS: 无界面浏览器,可编程的WebKit浏览器引擎, 对复杂网站进行浏览器渲染
  • Splash: Javascript渲染服务, 一个实现了HTTP API的轻量级浏览器
  • Headless Chrome: google最新的无头浏览器, 已经完整的替代了phantomjs

NodeJS语言环境:

  • Puppeteer: 一个通过 DevTools Protocol 控制 headless chrome 的 high-level Node 库

其中PhantomJS, headless chrome都可以搭配webdriver来进行可见即所得的爬取工作, 目前而言, Puppeteer成为最新的自动化测试框架, 完全代替了phantomJSSelenium IDE.

当然, 在爬虫方面, selenium配合chrome无头浏览器, firefox无头浏览器仍然是一个非常通用的方案.关于Puppeteer会在后续介绍, 这里主要介绍下selenium以及webdriver.

1.2 Selenium

selenium–一个由插件, 类库组成的自动化测试框架, web任务自动化管理工具.

selenium经历了两个大版本, 其中selenium 2.0和selenium 1.0有非常大的变动, 在2.0版本中将seleniumwebdriver进行合并.目前来说, selenium 2.0 = selenium + webdriver, 从而通过原生浏览器或者浏览器扩展来直接控制浏览器, 例如chromedriver就可以完美的搭配selenium从而进行页面的抓取工作.

selenium有几个部分组成:

  • selenium IDE: 实现浏览器的录制和回访功能
  • seenium Grid: 自动化的测试辅助工具
  • Webdriver: 实现web自动化

另外, selenium大部分情况下用于自动化测试, 在爬虫方面不建议使用selenium, 就我目前已知的缺点:

  • 问题太多: 使用selenium进行网页爬取工作, 经常跑着跑着就出现卡死等一些位置原因, 特别是网络不好的时候
  • 内存占用: 在出现问题的时候更严重, 毕竟模拟人工进行浏览器模拟操作
  • 资源占用: 如果使用requests一个请求就能搞定的时候, 使用selenium加载无数的图片, JS, CSS.
  • 爬取规模: 一般而言, 使用selenium进行网页爬取内容的都不可能是在生产环境

另外, 目前很多网站对selenium的反爬策略都有专门的研究, 此时就需要对selenium源码有一定的研究, 以便绕过反爬.

2 Chromedriver

参考: 按照selenium和chrome

2.1 Install

centos上的安装, 后期建议直接使用docker进行安装工作, 默认root用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 1 安装yum源
yum install -y epel-release

# 2 安装chromium
yum install -y chromium

# 3 下载chromedriver并安装, 注意, 必须同chrome版本相匹配
wget https://chromedriver.storage.googleapis.com/2.46/chromedriver_linux64.zip
unzip chromedriver_linux64.zip
mv chromedriver /usr/lib64/chromium-browser/
ln -sf /usr/lib64/chromium-browser/chromedriver /usr/bin/chromedriver

# 4 安装XVFB(virtual framebuffer X server for X Version 11), 处理图形化
yum install Xvfb -y
yum install xorg-x11-fonts* -y

# 5 创建/usr/bin/xvfb-chromium文件并添加启动启动代码, 具体见下面
vim /usr/bin/xvfb-chromium

# 6 更改软连接
ln -s /usr/lib64/chromium-browser/chromium-browser.sh /usr/bin/chromium
rm -rf /usr/bin/chromium-browser
ln -s /usr/bin/xvfb-chromium /usr/bin/chromium-browser
ln -s /usr/bin/xvfb-chromium /usr/bin/google-chrome

关于xvfb-chromium文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash

_kill_procs() {
kill -TERM $chromium
wait $chromium
kill -TERM $xvfb
}

# Setup a trap to catch SIGTERM and relay it to child processes
trap _kill_procs SIGTERM

XVFB_WHD=${XVFB_WHD:-1280x720x16}

# Start Xvfb
Xvfb :99 -ac -screen 0 $XVFB_WHD -nolisten tcp &
xvfb=$!

export DISPLAY=:99

chromium --no-sandbox --disable-gpu$@ &
chromium=$!

wait $chromium
wait $xvfb

2.2 Test

在不同的系统上安装完chromedriver和selenium之后, 需要使用python测试一下, 首先安装selenium

1
pip install selenium

之后使用python代码测试:

1
2
3
4
5
6
7
8
9
10
11
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-extensions')
chrome_options.add_argument('--disable-gpu')
driver = webdriver.Chrome(options=chrome_options)
driver.get("http://www.baidu.com")
driver.find_element_by_xpath("./*//input[@id='kw']").send_keys("chromedriver")
driver.find_element_by_xpath("./*//input[@id='su']").click()
driver.page_source

2.3 headless

headless chrome–无界面浏览器, 在确保浏览器正常功能使用的前提下, 可以在非桌面环境下运行.

其中chrome从59.0版本开始就支持headless, 当然firefox也支持无头浏览器模式. 无头浏览器显然不是面向普通用户, 其应用场景:

  • 自动化测试
  • 模拟登陆
  • 爬虫

常用的无头浏览器:

  • Phantomjs: Webkit内核的无头浏览器
  • SlimerJS: 使用Gecko内核, firefox无头浏览器就是基于Gecko内核
  • puppeteer: Chrome推出的基于nodeJS语言