当梦想照进现实

Selenium+PhantomJS+Xpath抓取网页JS内容

2015.09.21

horse swimming in the ocean

之前抓一个爬虫代理网站,发现在port上做了点手脚,使用了JS去计算port的方式,比如<script>document.write((2773^seal)+837);</script>。就这样一个改动搞得我费劲心思,用最笨的方法虽然能实现,但太繁琐,代码量太大,有一种操作起重机抓纸牌的感觉。最后想到了Selenium的方式,虽然速度慢了点,但可以轻松获取。

安装

Linux

sudo pip install selenium
sudo apt-get install PhantomJS

Windows

  • Selenium下载地址:https://pypi.python.org/pypi/selenium#downloads
  • PhantomJS下载地址:http://phantomjs.org/download.html

原理

关于Selenium

Selenium是一个Web的自动化测试工具,可以在多平台下操作多种浏览器进行各种动作,比如运行浏览器,访问页面,点击按钮,提交表单,浏览器窗口调整,鼠标右键和拖放动作,下拉框和对话框处理等,算是QA自动化测试的必备工具。
我们抓取时选用它,主要是Selenium可以渲染页面运行页面中的JS,以及其点击按钮提交表单等操作。
但就是因为Selenium会渲染页面,所以相对于requests+BeautifulSoup会慢上一些。

关于PhantomJs

PhantomJs可以看作一个没有页面的浏览器,有渲染引擎(QtWebkit)和JS引擎(JavascriptCore)。PhantomJs有DOM渲染,JS运行,网络访问,网页截图等多个功能。

使用PhantomJS,而不用Chromedriver和firefox,主要是因为PhantomJS的静默方式(后台运行,不打开浏览器)。

抓取示例

牛刀小试 - 抓取zhidaow.com Title

先拿一个简单的例子试手,之前这样的内容一般用requests+BeautifulSoup或者Scrapy处理。

from selenium import webdriver

browser = webdriver.PhantomJS('D:\phantomjs.exe')  #浏览器初始化;Win下需要设置phantomjs路径,linux下置空即可
url = 'http://www.zhidaow.com'  # 设置访问路径
browser.get(url)  # 打开网页
title = browser.find_elements_by_xpath('//h2')  # 用xpath获取元素

for t in title:  # 遍历输出
    print t.text # 输出其中文本
    print t.get_attribute('class')  # 输出属性值

browser.quit()  # 关闭浏览器。当出现异常时记得在任务浏览器中关闭PhantomJS,因为会有多个PhantomJS在运行状态,影响电脑性能

以下是本次测试的运行结果:

运行结果

抓取爱站流量

爱站在网站的综合查询首页(如http://www.aizhan.com/siteall/tuniu.com/),历史流量部分采用了JS的形式。抓取这部分数据,requests+BeautifulSoup就使不上力了,也正是Selenium+PhantomJS的优势所在。

以下是代码:

from selenium import webdriver

browser = webdriver.PhantomJS('D:\phantomjs.exe')
url = 'http://www.aizhan.com/siteall/tuniu.com/'
browser.get(url)
table = browser.find_elements_by_xpath('//*[@id="history1"]/table/tbody/tr[1]')  # 用Xpath获取table元素


for t in table:
    print t.text

browser.quit()

运行结果:

2015-09-24 3534 - - - -

其他功能

  • browser.page_source # 源代码,可结合BeautifulSoup使用
  • browser.current_url # 当前URL

参考资料

备注

图片来自500px.com,by Kurt Arrigo。

Comments
Write a Comment