用selenium+php-webdriver实现抓取淘宝页面

1 篇文章 0 订阅

用selenium+php-webdriver实现抓取淘宝页面
by Minirplus on 2015-05-08 in DEV
功能:实现抓取淘宝店铺商品信息,绕过淘宝防抓取策略

环境
Windows 8.1
selenium-2.44.0
ChromeDriver 2.15
php-webdriver
Chrome
安装selenium
在http://selenium-release.storage.googleapis.com/index.html找到最新的版本,下载selenium-server-standalone-X.XX.X.jar文件

安装ChromeDriver
在https://sites.google.com/a/chromium.org/chromedriver/downloads下载最新的ChromeDriver压缩包,解压得到chromedriver.exe文件

安装php-webdriver
访问https://github.com/facebook/php-webdriver,可以通过Composer安装,也可以直接下载后手动加载

selenium服务初始化
将上述selenium和ChromeDriver的两个文件放入一个文件夹中,运行cmd,输入如下命令初始化

java -jar D:\selenium\selenium-server-standalone-2.44.0.jar  -port 8888 -Dwebdriver.chrome.driver="D:\selenium\chromedriver.exe"

其中,D:\selenium\selenium-server-standalone-2.44.0.jar对应selenium文件的位置,D:\selenium\chromedriver.exe对应ChromeDriver文件的位置,-port 8888是监听的端口

执行完毕上述命令后,selenium服务就开始运行并在后台监听端口了,之后通过php发送命令到刚才设定的8888端口,selenium就会将指令发送给ChromeDriver并执行浏览器操作。

php-webdriver初始化
在使用php操作selenium前,需要先安装php-webdriver,一个由facebook维护的selenium插件,用于通过php来和selenium通信,composer方式安装这里不多介绍,这里仅介绍手动加载方式。

首先将刚才下载的压缩包解压,然后在php中添加一行代码,手动加载插件

require_once "D:/selenium/php-webdriver-master/lib/__init__.php";

其中D:/selenium/php-webdriver-master就是解压后的文件夹地址

然后在下方添加如下代码,初始化php-webdriver对象

$wd_host = 'http://localhost:8888/wd/hub';
$desired_capabilities = DesiredCapabilities::chrome();
$driver = RemoteWebDriver::create($wd_host, $desired_capabilities);

其中8888就是刚才初始化时设置的监听端口地址,DesiredCapabilities::chrome()用于指定打开的浏览器类型,$desired_capabilities可以有多种参数,详见这里

通过上述步骤,就完成了php-webdriver的初始化,并且定义了一个webdriver对象 d r i v e r , 接 下 来 就 可 以 通 过 driver,接下来就可以通过 driverdriver来进行实例操作。

执行浏览器操作
打开淘宝登陆网页
自动登陆

$driver->get('https://login.taobao.com/member/login.jhtml');

$element = $driver->findElement(
    WebDriverBy::name('TPL_username')
);
$element->clear(); //清空
$element->sendKeys("");//自动填写淘宝用户名
$element = $driver->findElement(
    WebDriverBy::name('TPL_password')
);
$element->clear(); //清空
$element->sendKeys("");//自动填写淘宝密码
$driver->findElement(WebDriverBy::id('J_SubmitStatic'))->click();

获取页面内容

$driver->get($url);
$html_selenium = $driver->getPageSource();

更多操作范例可以看这里,或者访问API手册http://facebook.github.io/php-webdriver/index.html

登陆淘宝后,浏览器会保留cookies,这样就可以绕开淘宝的防抓取限制

内容分析
在通过php-webdriver获取到网页内容之后,可以直接用它的API来进行内容分析,但是因为习惯了用php-simple-html-dom-parser,所以这里还是用它来对抓取的内容进行分析。

安装php-simple-html-dom-parser,https://github.com/sunra/php-simple-html-dom-parser

手动引用插件

include_once(‘D:/simplehtmldom/simple_html_dom.php’);

将php-webdriver抓取的内容传递给php-simple-html-dom-parser

$driver->get($url);
$html_selenium = $driver->getPageSource();
$html = str_get_html ( $html_selenium );

php-simple-html-dom-parser支持通过str字符串获取网页内容,只需将php-webdriver获取的内容保存为字符串后传递给str_get_html函数

执行分析

$items = $html->find('.shop-hesper-bd .item');
unset($item_array);
foreach($items as $table) {
if ($table->find('.item-name', 0)) {
    $item['link'] = $table->find('.item-name', 0)->href;
    $item_name = $table->find('.item-name', 0)->plaintext;
    $item['name'] = $item_name;
    $item['id'] = $table->getAttribute('data-id');
    $img_src = $table->find('.photo img', 0)->getAttribute('src');
    $item['img_src'] = substr($img_src, 0, strlen($img_src) - 12);
    $price = $table->find('.c-price', 0)->plaintext;
    $price = str_replace(' ', '', $price);
    $item['price'] = $price;
}

php-simple-html-dom-parser的详细API操作手册见这里:

http://simplehtmldom.sourceforge.net/manual.htm

总结
selenium可以实现很多功能,网页抓取只是其中很小的一部分,但是却非常实用。selenium的特点是直接可以在浏览器中看到所有的操作,可以实现很多curl无法完成的功能,特别是有部分操作需要人工介入的过程,比如抢火车票、秒拍等等。相信只要有想象力,selenium绝对是一款非常值得学习的网络工具。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
PHP自动化测试工具有很多,其中一个比较常用的是PHPUnit。PHPUnit是一个用于PHP单元测试的测试框架,它提供了一些功能来编写和运行测试用例。PHPUnit可以与Selenium WebDriver结合使用来执行Web应用程序的自动化测试。 在PHPUnit中使用Selenium WebDriver需要使用php-webdriver库。php-webdriver是一个PHP客户端库,它提供了一个简单的接口来与Selenium WebDriver进行交互。使用php-webdriverPHPUnit,你可以编写自动化测试用例来测试Web应用程序的各个方面,如用户界面、表单验证等。 下面是一个使用php-webdriverPHPUnit编写的简单的自动化测试用例: ```php <?php use PHPUnit\Framework\TestCase; use Facebook\WebDriver\Remote\RemoteWebDriver; use Facebook\WebDriver\WebDriverBy; class MyTest extends TestCase { protected $webDriver; public function setUp() { $capabilities = array(\WebDriverCapabilityType::BROWSER_NAME => 'chrome'); $this->webDriver = RemoteWebDriver::create('http://localhost:4444/wd/hub', $capabilities); } public function tearDown() { $this->webDriver->quit(); } public function testTitle() { $this->webDriver->get('http://www.example.com'); $this->assertEquals('Example Domain', $this->webDriver->getTitle()); } public function testLink() { $this->webDriver->get('http://www.example.com'); $link = $this->webDriver->findElement(WebDriverBy::tagName('a')); $link->click(); $this->assertEquals('Example Domain', $this->webDriver->getTitle()); } } ``` 在这个示例中,我们首先使用了PHPUnit的TestCase类来定义测试用例,然后在setUp()方法中创建了一个RemoteWebDriver实例,该实例与Selenium WebDriver通信。在tearDown()方法中,我们退出WebDriver会话。 在testTitle()方法中,我们使用WebDriver访问了一个网站,并检查了页面标题是否正确。在testLink()方法中,我们模拟了用户点击页面上的链接,并检查了新页面的标题是否正确。 通过php-webdriverPHPUnit,我们可以轻松地编写和运行自动化测试用例来测试Web应用程序的各个方面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿威,awin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值