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

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

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

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

  1. /**
  2. * Created by xy49476 on 2018/1/9.
  3. */
  4.  
  5. /*
  6. * http://iservice.10010.com/e4/index_server.html
  7. * 提取个人信息
  8. * */
  9.  
  10. function extractPersonalInfomation() {
  11. var loginName = document.querySelector('#personalInfo td').innerText;
  12. var userLevel = document.querySelector('#font').innerText;
  13. var userName = document.querySelector('div.data_basic_c.ly_gr_zl > dl:nth-child(1) > dd').innerText;
  14. var sex = document.querySelector('div.data_basic_c.ly_gr_zl > dl:nth-child(3) > dd').innerText;
  15. var idNo = document.querySelector('div.data_basic_c.ly_gr_zl > dl:nth-child(5) > dd').innerText;
  16. var contactPhone = document.querySelector('div.data_basic_c.ly_gr_zl > dl:nth-child(9) > dd').innerText;
  17. var contactAddress = document.querySelector('div.data_basic_c.ly_gr_zl > dl:nth-child(11) > dd').innerText;
  18.  
  19. var package = document.querySelector('#packageInfocontext > div.add_main > div > dl:nth-child(1) > dd').innerText;
  20. var chargeType = document.querySelector('#packageInfocontext > div.add_main > div > dl:nth-child(3) > dd').innerText;
  21.  
  22. var currentStatus = document.querySelector('#numberContext > div.data_basic_c2 > div.data_basic_c2_l > dl:nth-child(1) > dd').innerText;
  23. var netInDate = document.querySelector('#numberContext > div.data_basic_c2 > div.data_basic_c2_r > dl:nth-child(1) > dd').innerText;
  24. var billingAccount = document.querySelector('#numberContext > div.data_basic_c2 > div.data_basic_c2_l > dl:nth-child(3) > dd').innerText;
  25. var brand = document.querySelector('#numberContext > div.data_basic_c2 > div.data_basic_c2_r > dl:nth-child(2) > dd').innerText;
  26. var communicatelevel = document.querySelector('#numberContext > div.data_basic_c2 > div.data_basic_c2_l > dl:nth-child(4) > dd').innerText;
  27. var pukCode = document.querySelector('#numberContext > div.data_basic_c2 > div.data_basic_c2_r > dl:nth-child(3) > dd').innerText;
  28.  
  29. var contractName = document.querySelector('#contractPeriod > div.ly_gr_l2 > dl:nth-child(1) > dd').innerText;
  30. var effectiveTime = document.querySelector('#contractPeriod > div.ly_gr_l2 > dl:nth-child(3) > dd').innerText;
  31. var uneffectiveTime = document.querySelector('#contractPeriod > div.ly_gr_l2 > dl:nth-child(5) > dd').innerText;
  32.  
  33. personalObj = {loginName:loginName,
  34. userLevel:userLevel,
  35. userName:userName,
  36. sex:sex,
  37. idNo:idNo,
  38. contactPhone:contactPhone,
  39. contactAddress:contactAddress,
  40.  
  41. package:package,
  42. chargeType:chargeType,
  43.  
  44. currentStatus:currentStatus,
  45. netInDate:netInDate,
  46. billingAccount:billingAccount,
  47. brand:brand,
  48. communicatelevel:communicatelevel,
  49. pukCode:pukCode,
  50.  
  51. contractName:contractName,
  52. effectiveTime:effectiveTime,
  53. uneffectiveTime:uneffectiveTime
  54. };
  55.  
  56. return '{"personalInfo":' + JSON.stringify(personalObj) + '}';
  57.  
  58. }
  59.  
  60. //extractPersonalInfomation();

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

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

  

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

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

最后三行是

  1. return extractCallRecords();
  2. }
  3. extractCallRecordsOuter();
  4.  
  5. 如果改成下面,
  1. return extractCallRecords;
  2. }
  3. extractCallRecordsOuter()();

这样就是js之闭包了。

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

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

javascript提取联通个人信息和通话记录的代码的更多相关文章

  1. 越狱的 ios 如何 获取 读取 提取 手机上的 短信 通话记录 联系人 等信息

    http://willson.sinaapp.com/2011/12/iphone 获取短信脚本.html  Iphone获取短信脚本http://bbs.9ria.com/thread-209349 ...

  2. 玩下软工项目,第一轮--全局Context的获取,SQLite的建立与增删改查,读取用户通话记录信息

    项目的Github地址:https://github.com/ggrcwxh/LastTime 采用基于git的多人协作开发模式 软件采用mvc设计模式,前端这么艺术的事我不太懂,交给斌豪同学去头疼了 ...

  3. 【爬虫问题】爬取tv.sohu.com的页面, 提取视频相关信息

    尝试解决下面的问题 问题: 爬取tv.sohu.com的页面, 提取视频相关信息,不可用爬虫框架完成 何为视频i关信息?属性有哪些? 需求: 做到最大可能的页面覆盖率 *使用httpClient 模拟 ...

  4. 内容观察者 ContentObserver 监听短信、通话记录数据库 挂断来电

    Activity public class MainActivity extends ListActivity {     private TextView tv_info;     private  ...

  5. 建立一个类似于天眼的Android应用程序:第4部分 - 持久收集联系人,通话记录和短信(SMS)

    建立一个类似于天眼的Android应用程序:第4部分 - 持久收集联系人,通话记录和短信(SMS) 电话黑客android恶意软件编程黑客入侵linux 随着我们继续我们的系列,AMUNET应用程序变 ...

  6. Android通讯录管理(获取联系人、通话记录、短信消息)

    前言:前阵子主要是记录了如何对联系人的一些操作,比如搜索,全选.反选和删除等在实际开发中可能需要实现的功能,本篇博客是小巫从一个别人开源的一个项目抽取出来的部分内容,把它给简化出来,可以让需要的朋友清 ...

  7. 通过查询数据库中的数据匹配在页面上:(set单条数据属性是在页面上的显示与foreach的不同) 通过ID修改提取位置表信息

    ACTION   OpenModifyExtractPositionById // set单条数据属性 /* * 通过ID修改提取位置表信息 */ public String OpenModifyEx ...

  8. 个人永久性免费-Excel催化剂功能第55波-Excel批注相关的批量删除作者、提取所有批注信息等

    Excel里的批注,许多人很喜欢用,但批注真的值得我们大量使用吗?批注的使用场景在哪里?这些问题可能更值得花时间来思考下.同样因为不规范地使用批注,也带出了一大堆的后续擦屁股的事情来,从批注中找回有价 ...

  9. CSipSimple通话记录分组

    为了便于查看通话记录,通常要对通话记录进行分组.本质上来说这没什么难度,只需要用ContentResolver去读数据库,剩下的就是策略问题.代码在com/csipsimple/ui/calllog/ ...

随机推荐

  1. https://github.com/cobolfoo/gdx-skineditor

    https://github.com/cobolfoo/gdx-skineditor A skin editor for libgdx 0.3

  2. postgresql远程连接中断的处理

    在网络上连接远程服务器postgresql时,不活动时间稍长就会自动断开连接,不利于操作. 琢磨了一下,服务器上使用以下网络配置时,解决了这个问题.   #man 7 tcp   net.ipv4.t ...

  3. Netty实践

    Netty是JBOSS针对网络开发的一套应用框架,它也是在NIO的基础上发展起来的.netty基于异步的事件驱动,具有高性能.高扩展性等特性,它提供了统一的底层协议接口,使得开发者从底层的网络协议(比 ...

  4. Python之collections.defaultdict

    转自:http://www.jb51.net/article/88147.htm

  5. Ogre GpuProgram分析

    和前面讲解的Compositor一样,GpuProgram也对应一种资源文件,意思我们可以直接写一个文件来完成,不需要了解相关的类. 但是就和winform一样,直接拖控件能完成大部分工作,假如如果需 ...

  6. 【转】【WPF】WPF - MVVM - 如何将ComboBox的Selectchange事件binding到ViewModel

    将所有的事件,属性,都映射到ViewModel中.好处多多,以后开发尽量用这种模式. 解决方法: 使用System.Windows.Interactivity.dll,添加该dll到项目引用 xmln ...

  7. 【转】【Python】装饰器

    1.闭包 >>> def outer(): ... x = 1 ... def inner(): ... ... return inner >>> foo = ou ...

  8. e838. 使JTabbedPane中的卡片能用按键的方式选取

    Setting a mnemonic on a tab allows the tab to be selected with a keystroke. For example, if the mnem ...

  9. 嵌入式开发之hi3519---i2c EEPROM

    http://pdf1.alldatasheetcn.com/datasheet-pdf/view/163283/MICROCHIP/24LC024.html http://www.elecfans. ...

  10. Java调试那点事[转]

    转自云栖社区:https://yq.aliyun.com/articles/56?spm=5176.100239.blogcont59193.11.jOh3ZG# 摘要: 该文章来自于阿里巴巴技术协会 ...