使用 Selenium 抓取网页内容和模拟登入

传统的 cURL 没法执行页面中的浏览器脚本,而且在抓取一些对爬虫有限制的网页时,每每要设定详细的 http header 来突破限制,编写起来较为复杂。php

Selenium简介:

Selenium 是一个用于Web应用程序测试的工具(用处也不单单是测试)。
Selenium 直接使用浏览器运行,像真正的用户在操做。支持较多的浏览器。css

组件

Selenium IDE:Firefox插件,有录制脚本的功能。支持自动录制动做和自动生成其余语言的自动化脚本。java

Selenium Remote Control (RC) :支持多种平台(Windows,Linux)和多浏览器(IE,Firefox,Opera,Safari,Chrome),能够用多种语言(Java,Ruby,Python,Perl,PHP,C#)编写用例。git

Selenium Grid :容许Selenium-RC 针对规模庞大的测试案例集或者须要在不一样环境中运行的测试案例集进行扩展。github


实例:驱动 chrome 模拟登入淘宝,获取页面信息

1.前往项目主页:SeleniumHQ 下载web

  • Selenium Server (formerly the Selenium RC Server)ajax

  • Third Party Browser Drivers NOT DEVELOPED by seleniumhqchrome

(选择chrome的driver)浏览器

  • Third Party Language Bindings NOT DEVELOPED by seleniumhq

(选择PHP by Adam Goucher (SeHQ recommended php client))bash

2.打开 selenium

java -jar path_to_selenium.jar 
[-timeout 0] 
[-Dwebdriver.server.session.timeout=0] 
-Dwebdriver.chrome.driver="path_to_chrome_driver"
-browser [-timeout=0] [-browserTimeout=0]
browserName=chrome,[timeout=0]

如需长时间运行请酌情设置各 '[ ]' 中的超时时间

3.PHP代码

 execute(array('script' => "return (document.readyState != 'complete')", 'args' => array())));
}  //该函数会把脚本挂起直到等待到Ajax结束

require_once "webdriver/PHPWebDriver/__init__.php";
// 引入 selenium 的PHP封装函数库
// 下载地址:https://github.com/Element-34/php-webdriver
// 文档中有各类操做浏览器方法,如获取全部cookie等

$wd_host = 'http://127.0.0.1:4444/wd/hub';
$web_driver = new PHPWebDriver_WebDriver($wd_host);

$session = $web_driver->session('chrome');

//设置超时时间
$session->implicitlyWait(5);
$session->setScriptTimeout(5);
$session->setPageLoadTimeout(15);

//打开链接
$session->open('http://login.m.taobao.com/login.htm?tpl_redirect_url=http://m.taobao.com');

//输入验证码用,若是须要的话
sleep(5);

//请设置好账号密码
$session->element('css selector', 'input[name=TPL_username]')->value(array('value' => str_split('your_username')));
$session->element('css selector', 'input[name=TPL_password]')->value(array('value' => str_split('your_password')));

//模拟点击登入按钮
$elements = $session->element('css selector', '.c-btn-oran-big')->click();

//打开 m.taobao.com,此时已获取到cookie
$session->open('http://m.taobao.com/');

//等待ajax加载完毕
waitForAjax();

$elements = $session->element('css selector', 'body')->text();
//得到了登入后ajax执行完毕时的页面内容
?>

以后即可以按需对 $session 实例进行 element 方法的各类操做。

支持如下方式进行选择元素

  • id
  • xpath
  • link text
  • partial link text
  • name
  • tag name
  • class name
  • css selector

PS:各类库对Ajax状况的检测方法

  • jQuery: "jQuery.active"

  • Prototype: "Ajax.activeRequestCount"

  • Dojo: "dojo.io.XMLHTTPTransport.inFlight.length"

相关文章
相关标签/搜索