QQ 空间说说抓取难度比较大,花了一个星期才研究清楚!
代码请移步到 GitHub GitHub 地址: https://github.com/20100507/Qzone 【没有加入多线程, 希望你可以参与进来加入多线程不过 单个 QQ 请求频率不可以太高 过多的线程就需要 更多的 QQ 小号轮流登录】 不要忘了点一个赞 哈哈哈~~
1. 截图看一看效果:
1.1 抓取执行过程:
1.2 部分数据截图:
1.3 每一个说说的具体内容
1.4 70W 说说数据文件大小:
2. 接下来分析整个执行的流程
2.1 代码结构图【项目是采用 Maven 构建】:
简单的说一下整个代码的结构:
2.2Visio 分析流程
上面的 Vsio 的图,和代码中基本上都对应了,对于保存留言也很简单,换一个路径就好,所有的必要参数和 cookie 都已经拿到。如果想要保存一个人所有的 QQ 说说数据,切换分页的参数即可,but,我的代码中没有加入分页,仅仅保存每个 QQ 用户的首页的说说数据,懒得弄了,就是那么回事,就是在研究参数和 cookie 真的很费劲!!!!
2.3 测试代码中 请注意:
1. 注意我写的 try-catch,之前程序没有使用 try-catch,程序在执行中 ,会由于网络原因抛出异常 ,如果抛给了虚拟机 ,JVM 就停止,程序就挂了,干脆我就 catch 异常,如果 catch 到异常,我就在递归再次调用你,防止网络原因,导致程序极容易停止。
2. 注意一点,我的在 % ,也就是轮询 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 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 点一个赞!哈哈哈
来源: http://www.cnblogs.com/bianqi/p/7206885.html