QQ空間說說抓取難度比較大,花了一個星期才研究清楚!

 代碼請移步到GitHub GitHub地址:https://github.com/20100507/Qzone 【沒有加入多線程,希望你可以參與進(jìn)來加入多線程不過 單個QQ請求頻率不可以太高  過多的線程就需要 更多的QQ小號輪流登錄】 不要忘了點(diǎn)一個贊 哈哈哈~~       

1. 截圖看一看效果:

      1.1抓取執(zhí)行過程:         移動開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

     1.2 部分?jǐn)?shù)據(jù)截圖:

 移動開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

1.3 每一個說說的具體內(nèi)容

移動開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

 1.4 70W說說數(shù)據(jù)文件大小:

        移動開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

 

2.接下來分析整個執(zhí)行的流程

  2.1代碼結(jié)構(gòu)圖【項目是采用Maven構(gòu)建】:

       移動開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

   簡單的說一下整個代碼的結(jié)構(gòu):

  1. QQBean         是對QQ密碼和賬號的簡單的一個封裝,

  2. VerifyCode      提取驗證碼的【如果你的QQ號碼是異地登錄就需要輸入驗證碼或者騰訊檢測到你不安全】

  3. QzoneEncrypt 加密 倆個重要的參數(shù) 一個是加密QQ密碼【騰訊在傳輸密碼是做得很安全】,一個是加密g_tk,這個在獲取說說時必須攜帶

  4. GetQQByProperties  讀取num.properties文件中的QQ賬號和密碼

  5. KeyWord   對QQ賬號密碼 和關(guān)鍵參數(shù)的一個提取

  6. Login 使用加密后的密碼和QQ賬號 登錄 獲取相關(guān)重要的cookie 

  7. InputNameAndPwd 在login基礎(chǔ)上再次調(diào)用其他登錄接口直到真正登錄到平常打開的QQ空間好友動態(tài)頁面從頁面中提取到 g_qzonetoken

  8. GetMsgBoard 獲取QQ用戶留言

  9. GetQNum 獲取你的好友的列表

  10. GetShuoShuoData 獲取說說數(shù)據(jù)

  11. login.js 是網(wǎng)上的一位高人,提取加密QQ密碼的js精華

  12. entry.js是對g_tk的加密的獲取

  13. num.properties 是存放QQ和密碼的地方 如果你真的想保存數(shù)據(jù)的話 你最好放上6個無須驗證碼登錄的QQ小號 就臨時注冊幾個就完事了,切記一定不要使用一個,否則封號了就吉吉了。

   2.2Visio分析流程

      移動開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

 

    上面的Vsio的圖,和代碼中基本上都對應(yīng)了,對于保存留言也很簡單,換一個路徑就好,所有的必要參數(shù)和cookie都已經(jīng)拿到。如果想要保存一個人所有的QQ說說數(shù)據(jù),切換分頁的參數(shù)即可,but,我的代碼中沒有加入分頁,僅僅保存每個QQ用戶的首頁的說說數(shù)據(jù),懶得弄了,就是那么回事,就是在研究參數(shù)和cookie真的很費(fèi)勁!?。?!

 2.3 測試代碼中 請注意:

    1. 注意我寫的 try-catch,之前程序沒有使用try-catch,程序在執(zhí)行中 ,會由于網(wǎng)絡(luò)原因拋出異常 ,如果拋給了虛擬機(jī) ,JVM就停止,程序就掛了,干脆我就catch異常,如果catch到異常,我就在遞歸再次調(diào)用你,防止網(wǎng)絡(luò)原因,導(dǎo)致程序極容易停止。

    2.注意一點(diǎn),我的在  %25 ,也就是輪詢QQ號登陸,每個QQ號采集25個用戶我就重新?lián)Q其他的QQ用戶登錄,num.properties中的QQ數(shù)量越多越好【封號率越低】,%多少看自己的喜好!

    

移動開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

 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 + "數(shù)據(jù)=======================");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 + "數(shù)據(jù)=======================");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號 結(jié)束QQ號75         long i = 669424;76         long j = 2000000000;77         getShuoshuo(i, j);78     }79 }

移動開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

 

 3.1總結(jié)

                   就目前來看,我的網(wǎng)速可能不是很好,但是一天依然可以保存30W說說數(shù)據(jù),但是有時候程序也會假死,也許是網(wǎng)絡(luò)不好。

                   還有,有時候 莫名的需要你輸入驗證碼,沒有辦法你就在瀏覽器輸入這個QQ賬號密碼,手動多輸入幾次驗證碼,他就一般不會檢測了。不在需要驗證碼

                  PS【驗證碼需要打碼平臺 但是我沒有整,but 需要money哦~還有 , 驗證碼圖片會自動保存到項目路徑下但是,手動輸入驗證碼目前程序也不通過,可以修復(fù)的幫我修                     復(fù)一下 謝謝~~~】

                 num.properties中 QQ號碼低于12個也有可能封號,再次強(qiáng)調(diào)QQ小號一定要多,讓他檢測不出你是爬蟲。如果你就一個QQ號就不要嘗試玩 ,封號不要怪我!

                  沒有采用多線程技術(shù),一個原因我也沒有那么多的QQ小號。如果每一個QQ訪問頻率太高就會封號??!

                  記得在GitHub點(diǎn)一個贊!哈哈哈

 

http://www.cnblogs.com/bianqi/p/7206885.html