资讯专栏INFORMATION COLUMN

Just for fun——写个爬虫抓取whois信息

Cheng_Gang / 1858人阅读

摘要:代码需要的字段模仿获取西部数码信息域名代理模拟执行代码解析出错添加代理解析出错查询西部数码失败请求西部数码失败生成失败提取西部数码数据使用结果另外这个域名是我的,有意出售。

目标对象和过程

爬取的网站是西部数码,该网站在https://www.west.cn/web/whois...可以查询whois信息,通过chrome调试知道,数据是从接口:https://www.west.cn/web/whois...中获取的

cookie

分析该请求发现,qtoken2016这个key是最为重要(反爬虫的标记,我之前写的时候,还是qtoken),这个token的生成不在本页,而在https://www.west.cn/main/whoi...这一页点击查看whois的时候,发送请求:https://www.west.cn/services/...来生成新的token,得到的结果是混淆的js代码:

var l=[119,98,115,33,117,116,101,112,98,62,92,50,50,54,45,50,49,50,45,50,50,52,45,50,50,49,45,50,50,55,45,50,51,51,45,50,49,58,45,50,50,54,45,50,50,52,45,50,49,55,45,50,50,54,45,50,49,50,45,50,50,51,45,50,50,54,45,50,50,52,45,50,50,51,45,50,51,51,45,50,50,51,45,50,50,58,45,50,49,55,45,50,50,55,45,50,49,50,94,60,119,98,115,33,101,99,105,107,114,62,92,57,45,53,45,50,56,45,50,49,45,50,50,45,50,57,45,58,45,50,51,45,51,49,45,50,54,45,49,45,50,52,45,55,45,54,45,50,55,45,51,50,45,52,45,50,58,45,50,53,45,50,45,56,45,51,94,60,119,98,115,33,99,62,35,35,60,103,112,115,33,41,100,62,49,60,100,61,101,99,105,107,114,47,109,102,111,104,117,105,60,100,44,44,42,124,99,44,62,84,117,115,106,111,104,47,103,115,112,110,68,105,98,115,68,112,101,102,41,117,116,101,112,98,92,101,99,105,107,114,92,100,94,94,42,126,60,37,47,100,112,112,108,106,102,41,40,114,117,112,108,102,111,51,49,50,55,40,45,99,45,124,113,98,117,105,59,40,48,40,126,42,60];eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!"".replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return"w+"};c=1;};while(c--)if(k[c])p=p.replace(new RegExp(""+e(c)+"","g"),k[c]);return p;}("6 3="";7(2=0;2<4.5;2++){3+=8.a(4[2]-1)};9(3)",11,11,"||i|t|l|length|var|for|String|eval|fromCharCode".split("|"),0,{}))

对于这一点,用js的eval函数模拟一下就可以解决。

代码
/**
 * Created by salamander on 2016/11/8.
 */
let request = require("request");
let Q = require("q");
let datetime = require("locutus/php/datetime");

let getTokenUrl = "http://www.west.cn/main/whois.asp?act=gettok&_=";
let whoisUrl = "http://www.west.cn/web/whois/whoisinfo?domain=";
// 需要的字段
let needFields = ["domain", "registrar", "country", "mail", "whoisinfo", "add_time", "registrant_name", "expire_date"];

// 模仿jquery
let jQuery, $;
$ = jQuery = {
    token: ""
};

jQuery.cookie =  function(name, value, options) {
    this.token = value;
};

/**
 * 获取西部数码whois信息
 * @param domain 域名
 * @param proxy 代理
 */
function getWestWhois(domain, proxy) {
    let defer = Q.defer();
    let firstOptions = {
        url: getTokenUrl + (new Date()).getTime()
    };
    if(proxy) {
        firstOptions.proxy = "http://" + proxy.trim();
    }
    request(firstOptions, function (error, response, body) {
        if(!error && response.statusCode === 200) {
            // 模拟执行js代码
            try {
                eval(body);
            } catch (err) {
                defer.reject("解析json出错:" + err);
                return;
            }
            if($.token) {
                let options = {
                    url: whoisUrl +  domain + "&server=&refresh=1",
                    headers: {
                        "Cookie": "qtoken=" + $.token,
                        "X-Requested-With": "XMLHttpRequest"
                    }
                };
                // 添加代理
                if(proxy) {
                    options.proxy = "http://" + proxy.trim();
                }
                request(options, function (error, response, body) {
                    if(!error && response.statusCode === 200) {
                        let data = null;
                        try {
                            data = JSON.parse(body);
                        } catch (err) {
                            defer.reject("解析json出错:" + err);
                            return;
                        }
                        if(data["code"] === 200) {
                            defer.resolve(extractWestData(domain, data));
                        } else {
                            defer.reject("查询西部数码whois失败")
                        }
                    } else {
                        defer.reject("请求西部数码whois失败");
                    }
                })
            } else {
                defer.reject("生成token失败");
                return defer.promise;
            }
        } else {
            defer.reject(error);
        }
    });
    return defer.promise;
}

/**
 * 提取西部数码数据
 * @param domain
 * @param data
 */
function extractWestData(domain, data) {
    let country = solveCountry(domain, data["body"]);
    return {
        domain: domain,
        mail: data["dom_em"],
        errcode: 0,
        country: country,
        registrant_name: data["dom_org"],
        registrar: data["registrer"],
        expire: data["expdate"],
        whoisinfo: JSON.stringify({
            domain: domain,
            mail: data["dom_em"],
            errcode: 0,
            country: country,
            registrant_name: data["dom_org"],
            registrar: data["registrer"],
            expire: data["expdate"]
        })
    };

    function solveCountry(domain, html) {
        if(domain && domain.substr(-1, 3) === ".cn") {
            return  "CN";
        }
        let result = html.match(/Registrant Country: (S+?)
/); if(result) { return result[1].trim(); } return ""; } } module.exports.getWestWhois = getWestWhois;
使用
let westWhois = require("./west_whois.js");

westWhois.getWestWhois("51nazi.com").then((info) => {
    console.log(info);
});

结果:

另外

51nazi.com这个域名是我的,有意出售。

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

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

相关文章

  • Just for fun——Nginx配Lua写个hello world

    摘要:是一个基于与的高性能平台,其内部集成了大量精良的库第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发扩展性极高的动态应用服务和动态网关。,,,阶段处理,比如记录访问量统计平均响应时间 Lua lua的特点 小巧:一个完整的Lua解释器不过200k 可扩展性:Lua的解释器是100%的ANSI编写的,它提供了非常易于使用的扩展接口和机制,所以Lua的脚本很容易的被C/C++ ...

    kevin 评论0 收藏0
  • 分分钟教你用node.js写个爬虫

    摘要:爬虫介绍二爬虫的分类通用网络爬虫全网爬虫爬行对象从一些种子扩充到整个,主要为门户站点搜索引擎和大型服务提供商采集数据。 分分钟教你用node.js写个爬虫 写在前面 十分感谢大家的点赞和关注。其实,这是我第一次在segmentfault上写文章。因为我也是前段时间偶然之间才开始了解和学习爬虫,而且学习node的时间也不是很长。虽然用node做过一些后端的项目,但其实在node和爬虫方面...

    fanux 评论0 收藏0
  • Just for fun——用Python的Tkinter写个连连看

    摘要:很早之前用也是写过一个,但是写的不好,这次用写,看看自己有木有提升。 UI showImg(https://segmentfault.com/img/bVWg8e?w=1074&h=839); 代码 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2017-10-02 15:19:24 # @Author : Sa...

    崔晓明 评论0 收藏0
  • 爬虫 - 收藏集 - 掘金

    摘要:使用的爬虫知乎用户数据爬取和分析阅读掘金背景说明小拽利用的写的爬虫,实验性的爬取了知乎用户的基本信息同时,针对爬取的数据,进行了简单的分析呈现。 Python 知乎爬虫(最新) - 后端 - 掘金 环境:python3.x外部依赖包:requestsgithub项目地址 主要的问题:模拟登陆: 知乎现在改用https请求了,数据加密,但是问题不大,重要的是网页数据改动了,而且在请求时后...

    zzbo 评论0 收藏0
  • Evil Python

    摘要:用将倒放这次让我们一个用做一个小工具将动态图片倒序播放发现引力波的机构使用的包美国科学家日宣布,他们去年月首次探测到引力波。宣布这一发现的,是激光干涉引力波天文台的负责人。这个机构诞生于上世纪年代,进行引力波观测已经有近年。 那些年我们写过的爬虫 从写 nodejs 的第一个爬虫开始陆陆续续写了好几个爬虫,从爬拉勾网上的职位信息到爬豆瓣上的租房帖子,再到去爬知乎上的妹子照片什么的,爬虫...

    Turbo 评论0 收藏0

发表评论

0条评论

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