這裡我就在想一個請求嘛,我驗證請求一次,瀏覽量增加1。於是我就按F5刷新,但其實並不是每次都增加,繼續驗證發現多會再按F5就增加1了。到這裡基本特徵分析完畢,親,你有思路了嗎?我這裡想到以前的爬蟲,不就是請求頁面,得到回傳的html再解析字串嘛。所以我也藉鑒這個思想,使用服務端請求鏈接,然後剩下的就是這個等待時間,如果不管一直刷,可能會有惡意請求的嫌疑,這是要被封號的。那麼這個場景適合什麼技術了,大家think到沒?沒錯,可以用線程,設定每次請求後的sleep時間。
那麼大致思路就明確了:httpClient發請求,執行緒控制停頓時間。廢話不說了,我就上程式碼了:
上面這個main大家應該熟的很,我這裡的想法就是線程類別裡有三個變量,我使用前,new出來後先設定好變量,方便後期線程run方法裡使用。這裡跟大家補充下多線程實現的4中方式,這個之前好像也寫了博文提到過。
多執行緒的實作有4種方式,很多都至說前面兩種,不帶回傳值的。
1、繼承Thread類別建立執行緒
Thread類別本質上是實作了Runnable介面的一個實例,代表一個執行緒的實例。啟動執行緒的唯一方法就是透過Thread類別的start()實例方法。 start()方法是一個native方法,它將啟動一個新線程,並執行run()方法。這種方式實作多執行緒很簡單,透過自己的類別直接extend Thread,並複寫run()方法,就可以啟動新執行緒並執行自己定義的run()方法。例如:
public class MyThread extends Thread { public void run() { System.out.println("MyThread.run()"); } 新 Myread (); myThread1.start(); myThread2.start();
2、實作Runnable介面建立執行緒
如果自己的類別已經extends另一個類,就無法直接extends Thread,此時,可以實作一個Runnable接口,如下:
public class MyThread extends OtherClass implements Runnable { public void run() { System.out.println("Thread.run()"); System.out.println("Thread.run()");
#為了啟動MyThread,需要先實例化一個Thread,並傳入自己的MyThread實例:MyThread myThread = new MyThread(); Thread thread = new Thread(myThread); thread.start( ); 事實上,當傳入一個Runnable target參數給Thread後,Thread的run()方法就會呼叫target.run(),參考JDK原始碼:#public void run() { if (target != null) { target.run(); } } #3、實作Callable介面透過FutureTask機來建立單一介麵包裝器來建立Thread 介面只有#一個方法)定義如下: public interface Callable##public class SomeCallable
##public class SomeCallable
Callable
4、使用ExecutorService、Callable、Future實作有回傳結果的執行緒
ExecutorService、Callable、Future三個介面其實都是屬於Executor框架。回傳結果的執行緒是在JDK1.5中引入的新特徵,有了這個特徵就不需要再為了得到回傳值而大費周折了。而且自己實現了也可能漏洞百出。
可傳回值的任務必須實作Callable介面。類似的,無回傳值的任務必須實作Runnable介面。
執行Callable任務後,可以取得一個Future的對象,在該對像上呼叫get就可以取得到Callable任務返回的Object了。
注意:get方法是阻塞的,也就是:執行緒無回傳結果,get方法會一直等待。
再結合線程池介面ExecutorService就可以實現傳說中有回傳結果的多線程了。
言歸正傳,我這裡使用的是第一種,因為我不需要回傳值。
這裡面加入的是可以多個位址刷的思路,以及奇偶分請求方式,避免每次都是同一種請求方式,規避被系統列為惡意請求的風險。以及休眠時間可以在main設定。下面就來看看刷之前的閱讀量:
昨天晚上是寫完這個我就去睡了,電腦都沒有關,看看這一晚上請求到多少次了:
然後,我現在刷新下列表頁,重新看看閱讀量:
看到沒,閱讀量現在已經是600多了,原本才300多。
這裡因為ip一直都是這個,所以中間的sleep時間有點長,如果能有ip供切換,加入切換邏輯,效果會更好。
理論上所有的閱讀量都是可以用這個刷的,當然要客戶端沒有做比較嚴格的同ip請求多次至算閱讀1次等策略。百度文庫的那些文章我不找到怎麼評為優秀文檔的,但是我想跟請求量肯定有一定關係,大家有機會可以按照這個思路試試。可以改造下搞兩個線程,交替進行,一個線程刷一個網站,哈哈。
不過如果封號了不要怪我,呵呵。
相關推薦:
#以上是使用執行緒和httpclient刷瀏覽量的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!