首頁 >後端開發 >php教程 >使用執行緒和httpclient刷瀏覽量的方法

使用執行緒和httpclient刷瀏覽量的方法

小云云
小云云原創
2018-03-05 10:50:041845瀏覽

這裡我就在想一個請求嘛,我驗證請求一次,瀏覽量增加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   {   V call() throws Exception;   }

public class SomeCallable extends OtherClass

##public class SomeCallable extends OtherClass

##public class SomeCallable extends OtherClass

##public class SomeCallable extends OtherClass impleoo Callable < ; V call() throws Exception {        // TODO Auto-generated method stub        return null;    }}

Callable物件:   FutureTask oneTask = new FutureTask(oneCallable);   //註解:FutureTask是一個包裝器,它透過接受CallableFuture,它同時實作了一個包裝器,它透過接受CallableFuture,它同時實現了Future和Runnable;接口。   //由FutureTask建立一個Thread物件:   Thread oneThread = new Thread(oneTask);   oneThread.start();   //至此,一個執行緒就建立完成了。

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次等策略。百度文庫的那些文章我不找到怎麼評為優秀文檔的,但是我想跟請求量肯定有一定關係,大家有機會可以按照這個思路試試。可以改造下搞兩個線程,交替進行,一個線程刷一個網站,哈哈。
不過如果封號了不要怪我,呵呵。

相關推薦:

使用thinkPHP+ajax實作統計頁面pv瀏覽量的方法

#

以上是使用執行緒和httpclient刷瀏覽量的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn