javascript提取联通个人信息和通话记录的代码

由于一些巨大的困难,一些后端爬虫改成了前端爬虫。

 

前端爬虫是只有js语言,后端爬虫有python java nodejs php这些语言。

 

前端爬虫有window.document对象,在浏览器端的爬虫即使是二次发送ajax,也不需要学后端爬虫来构造一堆请求头,特别是困难的cookie token。最为重要的还是天然的突破了ip限制。

 

提取个人信息,直接使用页面渲染后的结构:

复制代码
/**
 * Created by xy49476 on 2018/1/9.
 */

/*
* http://iservice.10010.com/e4/index_server.html
* 提取个人信息
* */

function  extractPersonalInfomation() {
    var loginName = document.querySelector('#personalInfo td').innerText;
    var  userLevel = document.querySelector('#font').innerText;
    var userName = document.querySelector('div.data_basic_c.ly_gr_zl > dl:nth-child(1) > dd').innerText;
    var sex = document.querySelector('div.data_basic_c.ly_gr_zl > dl:nth-child(3) > dd').innerText;
    var idNo = document.querySelector('div.data_basic_c.ly_gr_zl > dl:nth-child(5) > dd').innerText;
    var contactPhone = document.querySelector('div.data_basic_c.ly_gr_zl > dl:nth-child(9) > dd').innerText;
    var contactAddress =  document.querySelector('div.data_basic_c.ly_gr_zl > dl:nth-child(11) > dd').innerText;

    var package = document.querySelector('#packageInfocontext > div.add_main > div > dl:nth-child(1) > dd').innerText;
    var chargeType = document.querySelector('#packageInfocontext > div.add_main > div > dl:nth-child(3) > dd').innerText;

    var currentStatus = document.querySelector('#numberContext > div.data_basic_c2 > div.data_basic_c2_l > dl:nth-child(1) > dd').innerText;
    var netInDate = document.querySelector('#numberContext > div.data_basic_c2 > div.data_basic_c2_r > dl:nth-child(1) > dd').innerText;
    var billingAccount = document.querySelector('#numberContext > div.data_basic_c2 > div.data_basic_c2_l > dl:nth-child(3) > dd').innerText;
    var brand = document.querySelector('#numberContext > div.data_basic_c2 > div.data_basic_c2_r > dl:nth-child(2) > dd').innerText;
    var communicatelevel = document.querySelector('#numberContext > div.data_basic_c2 > div.data_basic_c2_l > dl:nth-child(4) > dd').innerText;
    var pukCode = document.querySelector('#numberContext > div.data_basic_c2 > div.data_basic_c2_r > dl:nth-child(3) > dd').innerText;

    var contractName = document.querySelector('#contractPeriod > div.ly_gr_l2 > dl:nth-child(1) > dd').innerText;
    var effectiveTime =  document.querySelector('#contractPeriod > div.ly_gr_l2 > dl:nth-child(3) > dd').innerText;
    var uneffectiveTime =  document.querySelector('#contractPeriod > div.ly_gr_l2 > dl:nth-child(5) > dd').innerText;

    personalObj = {loginName:loginName,
        userLevel:userLevel,
        userName:userName,
        sex:sex,
        idNo:idNo,
        contactPhone:contactPhone,
        contactAddress:contactAddress,

        package:package,
        chargeType:chargeType,

        currentStatus:currentStatus,
        netInDate:netInDate,
        billingAccount:billingAccount,
        brand:brand,
        communicatelevel:communicatelevel,
        pukCode:pukCode,

        contractName:contractName,
        effectiveTime:effectiveTime,
        uneffectiveTime:uneffectiveTime
    };

    return '{"personalInfo":' + JSON.stringify(personalObj) + '}';


}

//extractPersonalInfomation();
复制代码

 

 

提取通话记录,这里和上面不同,发送了ajax来获取json,按月份按分页获取通话记录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/**
 * Created by xy49476 on 2018/1/10.
 */
/*http://iservice.10010.com/e4/query/bill/call_dan-iframe.html?menuCode=000100030001
提取通话记录
*
* */
 
function  extractCallRecordsOuter() {
 
 
    function getNear6Montgh(){
        var near6MonthArray = [];
 
        for (var i=0;i<6;i++){
            var d = new Date();
            d.setMonth(d.getMonth() - i);
            var yy1 = d.getFullYear();
            var mm1 = d.getMonth() + 1;//因为getMonth()返回值是 0(一月) 到 11(十二月) 之间的一个整数。所以要给其加1
            var dd1 = d.getDate();
            // if (mm1 < 10) {
            //     mm1 = '0' + mm1;
            // }
            if (dd1 < 10) {
                dd1 = '0' + dd1;
            }
            console.info(yy1 + '-' + mm1 + '-' + dd1);
            near6MonthArray.push([yy1,mm1]);
        }
        return near6MonthArray;
    }
 
    //按照年月,获取一个月有多少天 mGetDate(2004,2)
    function mGetDate(year, month){
        var d = new Date(year, month, 0);
        return d.getDate();
    }
 
    var callRecordsArray = [];
    function  extractCallRecords() {
 
        //历史账单
        var near6MonthArray = getNear6Montgh();
        for (i of near6MonthArray) {
            var dates = mGetDate(i[0], i[1]);
            var mm1 = i[1];
            if (mm1 < 10) {
                mm1 = '0' + mm1;
            }
            var yearMonth = i[0] + '' + mm1;
 
            var callRecordsObj = {};
            callRecordsObj.pagelist = [];
            callRecordsObj.yearMonth = yearMonth;
 
            function extractCallRecordByPage(page) {
                var page = page || 1;
 
                var url = 'http://iservice.10010.com/e3/static/query/callDetail?_=1515561593328&accessURL=http://iservice.10010.com/e4/query/bill/call_dan-iframe.html?menuCode=000100030001&menuid=000100030001';
                var data = {
                    pageNo: page,
                    pageSize: 200,
                    beginDate: yearMonth + '01',
                    endDate: yearMonth + dates
                };
                console.debug(data);
                var htmlObj = $.ajax({
                    type: 'POST',
                    url: url,
                    data: data,
                    async: false    //一定要设置这个,否则异步的还没得到返回结果就执行到下面去了,代码 一定会报错
                });
                var htmlStr = htmlObj.responseText;
                console.debug('htmlStr:',htmlStr);
                var callRecordsRawObj = JSON.parse(htmlStr);
                callRecordsObj.pagelist = callRecordsObj.pagelist.concat(callRecordsRawObj.pagelist);
                var totalpage = callRecordsRawObj.totalpage;
                if (page < totalpage) {
                    extractCallRecordByPage(page + 1);    //回调自己
                }
            }
 
            extractCallRecordByPage();
            callRecordsArray.push(callRecordsObj);
        }
        callRecordsInfoObj = {
            callRecordsInfo:callRecordsArray
        };
        return JSON.stringify(callRecordsInfoObj);
 
    }
 
    return extractCallRecords();
}
//extractCallRecordsOuter();

  

为了一个脚本一个函数,在最外层套了一个函数。

有没有很像js闭包,但这不是闭包。

最后三行是

1
2
3
    return extractCallRecords();
}
extractCallRecordsOuter();<br><br>如果改成下面,
1
2
3
return extractCallRecords;
}
extractCallRecordsOuter()();

这样就是js之闭包了。

 

 

 

前端爬虫时候,使用jqury选择器或者document的queryselector方法就能使用css3选择器的语法了。比getElementByxx能更精确的提取某些元素。

使用jquery时候,如果被爬页面没有引入jquery库,需要先在document注入jquery地址或者完整的执行一遍jquery代码。

posted @   北风之神0509  阅读(1890)  评论(3编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示