几句废话
笔者最近在逛sf.gg的时候,发现了一个关于每天“自动登录淘宝网站”的问题,很久没玩采集数据的我手有点痒痒,于是开始了自动登录淘宝网站的爬虫之旅。
一点介绍
下面的代码要实现自动登录淘宝手机网站,区别于通过 curl 等模拟请求的方式,笔者采用了 php-webdriver 自动化测试框架来模拟登录。
下面是采用 php-webdriver 的几个优点:
1)能够轻松处理复杂的SPA(single page application),这种应用一般通过js渲染生成的,http 请求和响应的 cookie 或者 header 可能会比较复杂;
2)完全模拟了用户的真实操作,大大降低了被反爬虫的可能;
3)代码更加简洁;
直接撸代码
<?php
namespace Facebook\WebDriver;
use Facebook\WebDriver\Chrome\ChromeOptions;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
//包含 composer 的自动加载
require_once('vendor/autoload.php');
//$host 是 selenium(一个 web 自动化测试框架)的 server 地址,用户自动化测试时的数据同步和 session (会话)管理
$host = 'http://localhost:4444/wd/hub'; // this is the default
//定义 chrome 驱动需要的功能集
$capabilities = DesiredCapabilities::chrome();
//链接指定的 selenium host,并使用相关的功能集
$driver = RemoteWebDriver::create($host, $capabilities, 5000);
// 打开淘宝手机web端的登录网站
$driver->get('https://login.m.taobao.com/login.htm');
//增加真实登录时的cookie信息,添加成功之后同学们可以通过 chrome的开发者工具的application tab页查看cookie是否设置正确
$cookie2 = new Cookie("cookie2","131eea94d7b3430c58580f00cd237b61");
//设置cookie所属的域
$cookie2->setDomain(".taobao.com");
//把cookie设置到 chrome 驱动请求中
$driver->manage()->addCookie($cookie2);
$ctokenCookie = new Cookie("ctoken","L60jtYinmoPoCDYcISxVrhllor");
$ctokenCookie->setDomain(".taobao.com");
$driver->manage()->addCookie($ctokenCookie);
$_tb_token_Cookie = new Cookie("_tb_token_","784e7be17350a");
$_tb_token_Cookie->setDomain(".taobao.com");
$driver->manage()->addCookie($_tb_token_Cookie);
$encCookie = new Cookie("enc","yrYsvz83La8hQX826NzulzeG1ZwIFkaCADiYSz29aP8c02pTMxJehxANYa4aDb44F%2BrkWQrykmy%2BHFhUi6WuAA%3D%3D");
$encCookie->setDomain(".taobao.com");
$driver->manage()->addCookie($encCookie);
//使用 id 来寻找指定的用户名输入框,并输入你的手机号码
$driver->findElement(WebDriverBy::id("username"))->sendKeys("18588260233");//请填写你自己的淘宝真实手机号
$driver->findElement(WebDriverBy::id("password"))->sendKeys("xiaosh211");//请填写你自己的淘宝真实密码
//接着点击登录
$driver->findElement(WebDriverBy::id("btn-submit"))->click();
try{
//因为需要验证身份,淘宝弹出了“请点击下方的圆圈”的提示,类似验证码
//下面的 css 选择器直接使用了 chrome 浏览器的 copy css querySelector 的功能
$cssSelectorForVerifyBtn = "body > div.km-dialog.km-dialog-ios7.km-dialog-alert > div.km-dialog-buttons > span";
//最多等待10秒钟时间知道上面的确定按钮出现
$driver->wait(10)
->until(
WebDriverExpectedCondition::presenceOfAllElementsLocatedBy(
WebDriverBy::cssSelector($cssSelectorForVerifyBtn)
)
);
//我们现在点击确定按钮,并开始下一步的点击圆圈操作
$driver->findElement(WebDriverBy::cssSelector($cssSelectorForVerifyBtn))->click();
}catch (\Exception $e) {
//对于某些ajax请求生成的html元素或可能不存在的元素,捕捉异常信息是必须的,
echo $e->getMessage()."\n";
}
try {
//小圆圈的css querySelector
$cssSelectorForCircleBtn = "#nc_1-stage-1 > div > div.click2slide-btn > div";
//这里的含义就不用解释了吧,跟上面类似
$driver->wait(10)
->until(WebDriverExpectedCondition::presenceOfAllElementsLocatedBy(
WebDriverBy::cssSelector($cssSelectorForCircleBtn)
)
);
$driver->findElement(WebDriverBy::cssSelector($cssSelectorForCircleBtn))->click();
}catch (\Exception $e){
echo $e->getMessage()."\n";
}
//为了看到效果,我们让这个会话界面停留20秒
sleep(20);
//关闭会话
$driver->quit();
最后的结果截图如下:
竟然没有成功,笔者现在还在研究为什么会失败,本文权当是抛砖引玉,希望同学们发挥你们的才能突破淘宝自动登录。
代码放在这里(git clone https://gitee.com/node_study/php-webdriver-demos.git),直接运行 php loginTaobaoMobile.php 即可。
注意事项
要求安装chrome浏览器;
使用 java -jar selenium-server-standalone-3.9.1.jar 运行 Tool 目录的selenium 服务端单例程序。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!