几句废话
笔者最近在逛sf.gg的时候,发现了一个关于每天“自动登录淘宝网站”的问题,很久没玩采集数据的我手有点痒痒,于是开始了自动登录淘宝网站的爬虫之旅。
一点介绍
下面的代码要实现自动登录淘宝手机网站,区别于通过 curl 等模拟请求的方式,笔者采用了 php-webdriver 自动化测试框架来模拟登录。
下面是采用 php-webdriver 的几个优点:
1)能够轻松处理复杂的SPA(single page application),这种应用一般通过js渲染生成的,http 请求和响应的 cookie 或者 header 可能会比较复杂;
2)完全模拟了用户的真实操作,大大降低了被反爬虫的可能;
3)代码更加简洁;
直接撸代码
<?phpnamespace 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();//创建一个 chrome 配置选项$chromeOptions = new ChromeOptions();//chromedriver 是用于直接跟 chrome 浏览器交互数据,设置 chromedriver 的位置$chromeOptions->setBinary("E:\\code\\php-webdriver-demos\\Tool\\chromedriver.exe");//给本次自动化测试的 chrome 驱动功能集中增加一个自定义的 chromeOptions 的配置$capabilities->setCapability(ChromeOptions::CAPABILITY,$chromeOptions->toCapabilities());//链接指定的 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 即可。
注意事项
4.mac 用户自己 google 一份 chromedriver.dmg。