在ubuntu服务器上使用Chrome Headless

几个月前发布的Chrome 59 beta推出了headless模式。原生的Chrome,更好的通用性,更快的速度……似乎是时候和Phantomjs、Ghost们说再见了。
搜索一圈发现大多数人都是在桌面版的linux或者mac上尝了鲜,然而要将Chrome用于web2.0爬虫的的话,还是得在服务器版的linux中运行。

安装chrome

测试环境: Ubuntu 16.04
如果是桌面版的ubuntu,直接到官网下载最新版chrome安装就好。
对于服务器版的ubuntu,只能用命令行安装:

# Install Google Chrome
# https://askubuntu.com/questions/79280/how-to-install-chrome-browser-properly-via-command-line
sudo apt-get install libxss1 libappindicator1 libindicator7
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo dpkg -i google-chrome*.deb  # Might show "errors", fixed by next line
sudo apt-get install -f

安装好后可以测试下:

google-chrome --headless --remote-debugging-port=9222 https://chromium.org --disable-gpu

这里是使用headless模式进行远程调试,ubuntu上大多没有gpu,所以--disable-gpu以免报错。
之后使用另一个命令行访问本地的9222端口:

curl http://localhost:9222

能够看到调试信息应该就是装好了。

下载chromedriver

chromedriver提供了操作chrome的api,是selenium控制chrome的桥梁。
可以到:https://sites.google.com/a/chromium.org/chromedriver/downloads查看最新的版本。
下载并解压:

wget https://chromedriver.storage.googleapis.com/2.31/chromedriver_linux64.zip
unzip chromedriver_linux64.zip

运行

这里我们直接用selenium来控制chrome在headless模式下运行:

# coding: utf-8
from selenium import webdriver

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')

client = webdriver.Chrome(chrome_options=chrome_options, executable_path='/home/chromedriver')    # 如果没有把chromedriver加入到PATH中,就需要指明路径
 
client.get("https://jiayi.space")

content = client.page_source.encode('utf-8')
print content

client.quit()

当然这里是打印出了页面的内容。
之后我找了一个以前爬过的网站来试试,它做了js加密重定向,而且检测到phantomjs请求直接丢弃。结果Chrome headless成功拿到渲染后的页面。
基于简单的测试后,感觉一切都还很完美。还不知道在生产环境下有没有什么bug,遇到再更新咯。

----update---
开启headless模式后,请求头的user-agent和正常访问会稍有不同:

  • headless: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3202.94 Safari/537.36'
  • 正常浏览器: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'

如果网站检查下user-agent,就可以很容易得ban掉headless模式下的请求了。所以需要修改一下headless模式下的请求头:

chrome_options.add_argument("user-agent='Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'")
Comments
Write a Comment
  • lsz reply

    你好,我qq627541483,方便的话加个好友,互相交流下

  • lsz reply

    你好,我用的是scrapy框架,最近公司需要我优化下Selenium+Phantomjs的性能,还打算做成分布式,想请教一下你这方面的经验

    • Melw00d reply

      @lsz 分布式这些我也没咋接触啊

  • xiaoyutou reply

    需要添加一个 options.add_argument('--no-sandbox'),要不然root运行的时候会报错。

    • Melw00d reply

      @xiaoyutou 谢谢提醒

      我是非root权限倒也能正常运行。