原创|PHP高级爬虫实践之记一次失败的淘宝自动登录尝试

几句废话 笔者最近在逛sf.gg的时候,发现了一个关于每天“自动登录淘宝网站”的问题,很久没玩采集数据的我手有点痒痒,于是开始了自动登录淘宝网站的爬虫之旅。 一点介绍 下面的代码要实现自...

几句废话

笔者最近在逛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();


最后的结果截图如下:

attachments-2018-03-bCj2r4Az5abdc43929b38.png

竟然没有成功,笔者现在还在研究为什么会失败,本文权当是抛砖引玉,希望同学们发挥你们的才能突破淘宝自动登录。


代码放在这里(git clone https://gitee.com/node_study/php-webdriver-demos.git),直接运行 php loginTaobaoMobile.php 即可。

注意事项

  1. 要求安装chrome浏览器;

  2. 使用 java -jar selenium-server-standalone-3.9.1.jar 运行 Tool 目录的selenium 服务端单例程序。


  • 发表于 2018-03-30 13:00
  • 阅读 ( 1222 )
  • 分类:后端技术

相关问题

0 条评论

请先 登录 后评论
不写代码的码农
Kemin

架构工程师

35 篇文章

作家榜 »

  1. Kemin 35 文章
  2. golanglover 5 文章
  3. D.Chen 2 文章
  4. salamander 1 文章
  5. 深圳-伟 1 文章
  6. 广训 1 文章
  7. PHP小菜 1 文章
  8. 后端彭于晏 0 文章