• Java版 QQ空间自动登录无需拷贝cookie一天抓取30WQQ说说数据&流程分析


    QQ空间说说抓取难度比较大,花了一个星期才研究清楚!

     代码请移步到GitHub GitHub地址:https://github.com/20100507/Qzone 【没有加入多线程,希望你可以参与进来加入多线程不过 单个QQ请求频率不可以太高  过多的线程就需要 更多的QQ小号轮流登录】 不要忘了点一个赞 哈哈哈~~       

    1. 截图看一看效果:

          1.1抓取执行过程:         

         1.2 部分数据截图:

     

    1.3 每一个说说的具体内容

     1.4 70W说说数据文件大小:

            

    2.接下来分析整个执行的流程

      2.1代码结构图【项目是采用Maven构建】:

           

       简单的说一下整个代码的结构:

    1. QQBean         是对QQ密码和账号的简单的一个封装,
    2. VerifyCode      提取验证码的【如果你的QQ号码是异地登录就需要输入验证码或者腾讯检测到你不安全】
    3. QzoneEncrypt 加密 俩个重要的参数 一个是加密QQ密码【腾讯在传输密码是做得很安全】,一个是加密g_tk,这个在获取说说时必须携带
    4. GetQQByProperties  读取num.properties文件中的QQ账号和密码
    5. KeyWord   对QQ账号密码 和关键参数的一个提取
    6. Login 使用加密后的密码和QQ账号 登录 获取相关重要的cookie 
    7. InputNameAndPwd 在login基础上再次调用其他登录接口直到真正登录到平常打开的QQ空间好友动态页面从页面中提取到 g_qzonetoken
    8. GetMsgBoard 获取QQ用户留言
    9. GetQNum 获取你的好友的列表
    10. GetShuoShuoData 获取说说数据
    11. login.js 是网上的一位高人,提取加密QQ密码的js精华
    12. entry.js是对g_tk的加密的获取
    13. num.properties 是存放QQ和密码的地方 如果你真的想保存数据的话 你最好放上6个无须验证码登录的QQ小号 就临时注册几个就完事了,切记一定不要使用一个,否则封号了就吉吉了。

       2.2Visio分析流程

          

        上面的Vsio的图,和代码中基本上都对应了,对于保存留言也很简单,换一个路径就好,所有的必要参数和cookie都已经拿到。如果想要保存一个人所有的QQ说说数据,切换分页的参数即可,but,我的代码中没有加入分页,仅仅保存每个QQ用户的首页的说说数据,懒得弄了,就是那么回事,就是在研究参数和cookie真的很费劲!!!!

     2.3 测试代码中 请注意:

        1. 注意我写的 try-catch,之前程序没有使用try-catch,程序在执行中 ,会由于网络原因抛出异常 ,如果抛给了虚拟机 ,JVM就停止,程序就挂了,干脆我就catch异常,如果catch到异常,我就在递归再次调用你,防止网络原因,导致程序极容易停止。

        2.注意一点,我的在  %25 ,也就是轮询QQ号登陆,每个QQ号采集25个用户我就重新换其他的QQ用户登录,num.properties中的QQ数量越多越好【封号率越低】,%多少看自己的喜好!

        

     1 package qzone_enter;
     2 
     3 import java.io.IOException;
     4 import java.util.List;
     5 
     6 import org.bianqi.enter.bean.QQBean;
     7 import org.bianqi.enter.key.GetQQByProperties;
     8 import org.bianqi.enter.key.KeyWord;
     9 import org.bianqi.enter.login.InputNameAndPwd;
    10 import org.bianqi.getdata.GetShuoShuoData;
    11 
    12 public class GetMyShuoShuo {
    13 
    14     public static List<QQBean> listQQ = null;
    15     public static int k = 0;
    16     
    17     static {
    18         try {
    19             listQQ = GetQQByProperties.getQQNumAndPwd();
    20             KeyWord.uin = listQQ.get(k).getNum();
    21             KeyWord.password = listQQ.get(k).getPwd();
    22             System.out.println("初始化"+KeyWord.uin+"登录~~~~~~~~~~~~~");
    23             InputNameAndPwd.login();
    24         } catch (IOException e) {
    25             e.printStackTrace();
    26         }
    27     }
    28 
    29     public static void getShuoshuoDemo(long i, long j) throws Exception {
    30         try {
    31             for (; i <= j; i++) {
    32                 if (i % 25 == 0) {
    33                     if (k == listQQ.size()) {
    34                         k = 0;
    35                     }
    36                     KeyWord.uin = listQQ.get(k).getNum();
    37                     KeyWord.password = listQQ.get(k).getPwd();
    38                     System.out.println("切换到"+KeyWord.uin+"登录");
    39                     InputNameAndPwd.login();
    40                     k++;
    41                 }
    42                 GetShuoShuoData.getShuoData(Long.toString(i));
    43                 System.out.println(KeyWord.uin+"正在采集==============QQ用户" + i + "数据=======================");
    44             }
    45         } catch (Exception e) {
    46             e.printStackTrace();
    47             GetMyShuoShuo.getShuoshuo(i, j);
    48         }
    49     }
    50 
    51     public static void getShuoshuo(long i, long j) throws Exception {
    52         try {
    53             for (; i <= j; i++) {
    54                 if (i % 25 == 0) {
    55                     if (k == listQQ.size()) {
    56                         k = 0;
    57                     }
    58                     KeyWord.uin = listQQ.get(k).getNum();
    59                     KeyWord.password = listQQ.get(k).getPwd();
    60                     System.out.println("切换到"+KeyWord.uin+"登录");
    61                     InputNameAndPwd.login();
    62                     k++;
    63                 }
    64                 GetShuoShuoData.getShuoData(Long.toString(i));
    65                 System.out.println(KeyWord.uin+"正在采集==============QQ用户" + i + "数据=======================");
    66             }
    67         } catch (Exception e) {
    68             e.printStackTrace();
    69             GetMyShuoShuo.getShuoshuoDemo(i, j);
    70         }
    71     }
    72 
    73     public static void main(String[] args) throws Exception {
    74         // 开始QQ号 结束QQ号
    75         long i = 669424;
    76         long j = 2000000000;
    77         getShuoshuo(i, j);
    78     }
    79 }

     3.1总结

                       就目前来看,我的网速可能不是很好,但是一天依然可以保存30W说说数据,但是有时候程序也会假死,也许是网络不好。

                       还有,有时候 莫名的需要你输入验证码,没有办法你就在浏览器输入这个QQ账号密码,手动多输入几次验证码,他就一般不会检测了。不在需要验证码

                      PS【验证码需要打码平台 但是我没有整,but 需要money哦~还有 , 验证码图片会自动保存到项目路径下但是,手动输入验证码目前程序也不通过,可以修复的帮我修                     复一下 谢谢~~~】

                     num.properties中 QQ号码低于12个也有可能封号,再次强调QQ小号一定要多,让他检测不出你是爬虫。如果你就一个QQ号就不要尝试玩 ,封号不要怪我!

                      没有采用多线程技术,一个原因我也没有那么多的QQ小号。如果每一个QQ访问频率太高就会封号!!

                      记得在GitHub点一个赞!哈哈哈

  • 相关阅读:
    多线程学习纪要
    字符编码ASCII、Unicode、UTF-8以及验证
    C# 自定义特性Attribute要点
    Java --- 流操作
    数据库 --- 索引
    Java -- 枚举
    mybatis --- 使用通用mapper或者mybatis-plus进行映射时,当数据库中有大写字母,自定义映射的字段名。
    后端 --- 快速创建一个sb项目 (使用spring官网的https://start.spring.io)
    数据库 --- decimal类型测试
    Java --- 线上故障调优01 打印堆栈信息
  • 原文地址:https://www.cnblogs.com/bianqi/p/7206885.html
Copyright © 2020-2023  润新知