资讯专栏INFORMATION COLUMN

Web开发 - Selenium自动化&爬虫

Chao / 1751人阅读

摘要:自动化爬取淘宝中的订单这是淘宝会员登录页。但淘宝的反爬机制很难算出,很多都是通过的计算,所以不得不学习源码,反到最后看的头痛。。。

自动化爬取淘宝中的订单

这是 淘宝会员登录页 。因为之前做的爬虫都是通过框架或从登录页取得Cookie,再注入进去实现登陆过程的。但淘宝的反爬机制很难算出Cookie,很多Cookie都是通过JS的计算,所以不得不学习源码,反到最后看的头痛。。。

第一次尝试

(1)登录

通过 Jsoup get登录页成功返回Cookie:

            /**
             * 初始化淘宝登录页
             */
            Response firstLoginInitResp = Jsoup.connect("https://login.taobao.com/member/login.jhtml?redirectURL=http%3A%2F%2Ftrade.taobao.com%2Ftrade%2Fitemlist%2Flist_export_order.htm")
                    .header("Host", "login.taobao.com")
                    .header("Connection", "keep-alive")
                    .header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8")
                    .header("Upgrade-Insecure-Requests", "1")
                    .userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36")
                    .header("Accept-Encoding", "gzip, deflate, sdch")
                    .header("Accept-Language", "zh-CN,zh;q=0.8")
                    .execute();
            Map firstLoginInitCookies = firstLoginInitResp.cookies();
            System.out.println("code: "+firstLoginInitResp.statusCode()+", msg: "+firstLoginInitResp.statusMessage()+", 第一次登陆淘宝返回的Cookie: "+firstLoginInitCookies.toString()); 
_tb_token_=e71873665bdae
t=7770a28456dfcad8106b11406e3bc765
cookie2=17c4314a2a5b448f59aa038202b96019
v=0

返回成功后,JS动态添加了俩个Cookie:

l=
isg=

最后将Cookie重新注入,并传送消息体到登录页(这是为了js再次动态设置Cookie)

Response secondLoginInitResp = Jsoup.connect("https://login.taobao.com/member/login.jhtml?redirectURL=http%3A%2F%2Ftrade.taobao.com%2Ftrade%2Fitemlist%2Flist_export_order.htm%3Fpage_no%3D1")
                    .header("Host", "login.taobao.com")
                    .header("Connection", "keep-alive")
                    .header("Content-Length", secondLoginInitData.length()+"")
                    .header("Cache-Control", "max-age=0")
                    .header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8")
                    .header("Origin", "https://login.taobao.com")
                    .header("Upgrade-Insecure-Requests", "1")
                    .userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36")
                    .header("Content-Type", "application/x-www-form-urlencoded")
                    .referrer("https://login.taobao.com/member/login.jhtml?redirectURL=http%3A%2F%2Ftrade.taobao.com%2Ftrade%2Fitemlist%2Flist_export_order.htm%3Fpage_no%3D1")
                    .header("Accept-Encoding", "gzip, deflate")
                    .header("Accept-Language", "zh-CN,zh;q=0.8")
                    .cookies(firstLoginInitCookies)
                    .data(secondLoginInitMap)
                    .execute();
            Map secondLoginInitCookies = secondLoginInitResp.cookies();
            System.out.println("code: "+secondLoginInitResp.statusCode()+", msg: "+secondLoginInitResp.statusMessage()+", 第二次登陆淘宝返回的Cookie: "+secondLoginInitCookies.toString()); 

结果返回的Cookie为空。此处省略过多废话。。。只好再采用其他方式。

第二次尝试

这次将采用Selenium自动化框架完成自动登录,再获取Cookie注入到请求中,最后完成爬取。

因为需要用浏览器来完成自动化登录,所以应注意Firefox、Chrome、IE与Selenium对应的版本(本人火狐版本24 下载地址、Selenium2.40 下载地址)。

import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import org.jsoup.Connection.Response;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.openqa.selenium.By;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;

import common.DateUtil;
import common.FileUtil;
import common.Log;

/**
 * 淘宝爬虫
 * @author Alex
 * @date 2017年3月22日
 */
public class TaobaoCrawler extends Log{
    
    public String login(String username, String password){
        logger.info("Start firefox browser succeed...");
        try {
            WebDriver webDriver = new FirefoxDriver(); //创建火狐驱动(谷歌IE需下载驱动程序并添加浏览器插件,还有注意版本对应,比较麻烦,请百度版本对应)
            
            webDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 
            webDriver.get("https://login.taobao.com/member/login.jhtml?redirectURL=http://trade.taobao.com/trade/itemlist/list_export_order.htm?page_no=1");
            
            WebElement passLoginEle= webDriver.findElement(By.xpath("//a[@class="forget-pwd J_Quick2Static" and @target="_blank" and @href=""]")); //密码登录
            logger.info("密码登录是否显示可见:"+passLoginEle.isDisplayed());
            passLoginEle.click(); //显示账号密码表单域(模仿点击事件,将隐藏视图变为可见)
            
            webDriver.findElement(By.id("TPL_username_1")).clear();
            webDriver.findElement(By.id("TPL_username_1")).sendKeys(username); //输入用户名
            webDriver.findElement(By.id("TPL_password_1")).clear();
            webDriver.findElement(By.id("TPL_password_1")).sendKeys(password); //输入密码
            webDriver.findElement(By.id("J_SubmitStatic")).click(); //点击登录按钮  
            webDriver.switchTo().defaultContent();
            
            try {
                while (true) { //不停的检测,一旦当前页面URL不是登录页面URL,就说明浏览器已经进行了跳转
                    Thread.sleep(500L);
                    if (!webDriver.getCurrentUrl().startsWith("https://login.taobao.com/member/login.jhtml")) {
                        break;
                    }
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            //获取cookie,上面一跳出循环我认为就登录成功了,当然上面的判断不太严格,可以再进行修改
            StringBuffer cookieStr = new StringBuffer();
            Set cookies = webDriver.manage().getCookies();
            for (Cookie cookie : cookies) {
                cookieStr.append(cookie.getName() + "=" + cookie.getValue() + "; ");
            }
            logger.info("账号 "+username+" ,用户登录成功");
            return cookieStr.toString();
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
            logger.info("账号 "+username+" ,用户登录失败,可能被校验码拦截");
            logger.error(e.getMessage());
            return null;
        }
    }
    
    public String getOrderUrl(String cookie){
        try {
            Response orderResp = Jsoup.connect("https://trade.taobao.com/trade/itemlist/list_export_order.htm?page_no=1")
                    .header("Host", "login.taobao.com")
                    .header("Connection", "keep-alive")
                    .header("Cache-Control", "max-age=0")
                    .header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*;q=0.8")
                    .header("Origin", "https://login.taobao.com")
                    .header("Upgrade-Insecure-Requests", "1")
                    .userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36")
                    .header("Content-Type", "application/x-www-form-urlencoded")
                    .header("Accept-Encoding", "gzip, deflate")
                    .header("Accept-Language", "zh-CN,zh;q=0.8")
                    .cookie("Cookie", cookie)
                    .execute();
            logger.info("请求订单页返回的code: "+orderResp.statusCode()+", msg: "+orderResp.statusMessage());
            
            Document doc = orderResp.parse();
            Element orderEle = doc.getElementsByAttributeValue("title", "下载订单报表").get(0); //获取第一个
            
            String orderUrl = orderEle.attr("href");
            logger.info("订单下载地址:"+orderUrl);
            return orderUrl;
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
            logger.error(e.getMessage());
            return null;
        }
    }
    
    public static void main(String[] args){
        TaobaoCrawler crawler = new TaobaoCrawler();
        Map map = FileUtil.propToMap();
        String cookie = crawler.login(map.get("username"), map.get("password"));
        String orderUrl = crawler.getOrderUrl(cookie);
    }

}

普通验证码是可以获取的,但是通过以拖动滑块来验证用户身份,这种情况就很难解决了。希望大家有空能试下,多提供些宝贵意见。。。

先这样吧,不太会写文章,希望大家海涵。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/66873.html

相关文章

  • 动态HTML介绍 & Selenium PhantomJS

    摘要:一个网站使用的特征就是源代码里包含了入口比如如果你在一个网站上看到了,那么采集这个网站数据的时候要格外小心。直接点击下拉框中的选项不一定可行。未审核初审通过复审通过审核不通过专门提供了类来处理下拉框。 JavaScript JavaScript 是网络上最常用也是支持者最多的客户端脚本语言。它可以收集 用户的跟踪数据,不需要重载页面直接提交表单,在页面嵌入多媒体文件,甚至运行网页游戏。...

    Lsnsh 评论0 收藏0
  • Python爬虫Xpath定位数据的两种方法

      小编写这篇文章的主要目的,就是给大家介绍关于Python的一些总结,比如使用Python爬虫Xpath定位数据,那么,在定位数据的时候,有两种方法,具体有什么方法介绍呢?下面就给大家详细的解答下。  方法一:直接右键,将文章路径复制下来点击Copy full Xpath  使用selenium+lxml中的etree进行配合使用,使用etree解析html网页  importrequests ...

    89542767 评论0 收藏0
  • Python 从零开始爬虫(一)——爬虫伪装&反“反爬”

    摘要:总的来说有两种反爬策略,要么验证身份,把虫子踩死在门口要么在网站植入各种反爬机制,让爬虫知难而退。本节内容就着这两种反爬策略提出一些对策。内嵌反爬很灵活,没有什么固定的代码格式,要花时间去分析出来。   之前提到过,有些网站是防爬虫的。其实事实是,凡是有一定规模的网站,大公司的网站,或是盈利性质比较强的网站,都是有高级的防爬措施的。总的来说有两种反爬策略,要么验证身份,把虫子踩死在门口...

    int64 评论0 收藏0
  • 前端每周清单第 29 期:Web 现状分析与优化策略、Vue 单元测试、Headless Chrom

    摘要:前端每周清单第期现状分析与优化策略单元测试爬虫作者王下邀月熊编辑徐川前端每周清单专注前端领域内容,以对外文资料的搜集为主,帮助开发者了解一周前端热点分为新闻热点开发教程工程实践深度阅读开源项目巅峰人生等栏目。 showImg(https://segmentfault.com/img/remote/1460000011008022); 前端每周清单第 29 期:Web 现状分析与优化策略...

    HackerShell 评论0 收藏0
  • web动化爬虫selenium centos 无GUI环境配置

    摘要:基本环境安装安装下载注意要和版本对应由于下载的是版本的,所以选择了版本解压此文件,并将文件移动到目录下测试是否可用,请执行以下脚本,如返回内容,则说明安装成功注意需要加上,禁止在沙箱中运行补充安装支持测试脚本 基本环境:centos7,python3.x 1.安装selenium pip3 install selenium 2.安装chrome-browser wget https:/...

    张巨伟 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<