QQ空间说说抓取难度比较大,花了一个星期才研究清楚!java
代码请移步到GitHub GitHub地址:https://github.com/20100507/Qzone 【没有加入多线程,但愿你能够参与进来加入多线程不过 单个QQ请求频率不能够过高 过多的线程就须要 更多的QQ小号轮流登陆】 不要忘了点一个赞 哈哈哈~~ git
1. 截图看一看效果:github
1.1抓取执行过程: 浏览器
1.2 部分数据截图:
安全
1.3 每个说说的具体内容cookie
1.4 70W说说数据文件大小:网络
2.接下来分析整个执行的流程多线程
2.1代码结构图【项目是采用Maven构建】:测试
简单的说一下整个代码的结构:ui
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点一个赞!哈哈哈