***PHP多執行緒pthreads實現QQ號碼爬蟲
通過空間歷史瀏覽,爬出檢視你空間的人(一般限制20人,除非開通黃鑽),然後在爬出這20人的瀏覽記錄,依次向下爬,你可以控制爬行深度。
這裡僅僅給出怕中程式碼片段,你可以進一步優化,將QQ分類儲存。通過QQ相互瀏覽關係,可以通過繪圖工具繪製好友網路。等等
程式碼涉及pthreads 如果不清楚請閱讀:《PHP 高階程式設計之多執行緒》
http://netkiller.github.io/journal/thread.php.html
<?php /* Homepage: http://netkiller.github.io Author: Neo <netkiller@msn.com> */ if(!extension_loaded(`pthreads`)) die (`Please install pthreads`); include_once(`Snoopy.class.php`); class CrawlerWorker extends Worker { protected static $dbh; public function __construct() { } public function run(){ /* $dbhost = `db.example.com`; // 資料庫伺服器 $dbuser = `example.com`; // 資料庫使用者名稱 $dbpw = `password`; // 資料庫密碼 $dbname = `example`; // 資料庫名 self::$dbh = new PDO("mysql:host=$dbhost;port=3306;dbname=$dbname", $dbuser, $dbpw, array( PDO::MYSQL_ATTR_INIT_COMMAND => `SET NAMES `UTF8``, PDO::MYSQL_ATTR_COMPRESS => true, PDO::ATTR_PERSISTENT => true ) ); */ } protected function getInstance(){ return self::$dbh; } } /* the collectable class implements machinery for Pool::collect */ class Crawler extends Stackable { public $depth = 3; private static $level = 0; public function __construct($qq) { $this->qq = $qq; } public function run() { try { $dbh = $this->worker->getInstance(); $this->recursion(array($this->qq)); } catch(PDOException $e) { $error = sprintf("%s,%s ", $mobile, $id ); file_put_contents("mobile_error.log", $error, FILE_APPEND); } //printf("runtime: %s, %s ", date(`Y-m-d H:i:s`), $this->worker->getThreadId()); //$lst = $this->qzone($this->qq); //print_r($lst); } public function recursion($qqs){ if( self::$level <= $this->depth){ self::$level++; }else if(self::$level > 0){ self::$level--; } printf("Level: %s ", self::$level); //sleep(1); usleep(mt_rand(10000,1000000)); if(self::$level >= $this->depth){ return; } foreach($qqs as $uin) { $lst = $this->qzone($uin); print_r($lst); $this->recursion($lst); } } public function qzone($qq){ $url = `http://m.qzone.com/mqz_get_visitor?g_tk=1191852101&res_mode=0&res_uin=`.$qq.`&offset=0&count=100&page=1&format=json&t=1401762986882&sid=dODKVcYv6azjN87cxXQ5mao1xgakYjHg18c8aa5e0201%3D%3D`; $snoopy = new Snoopy; // need an proxy? //$snoopy->proxy_host = "my.proxy.host"; //$snoopy->proxy_port = "8080"; // set browser and referer: $snoopy->agent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"; $snoopy->referer = "http://m.qzone.com/"; // set some cookies: //$snoopy->cookies["SessionID"] = `238472834723489`; //$snoopy->cookies["favoriteColor"] = "blue"; // set an raw-header: $snoopy->rawheaders["Pragma"] = "no-cache"; // set some internal variables: $snoopy->maxredirs = 2; $snoopy->offsiteok = false; $snoopy->expandlinks = false; // set username and password (optional) //$snoopy->user = "joe"; //$snoopy->pass = "bloe"; // fetch the text of the website www.google.com: if($snoopy->fetchtext($url)){ // other methods: fetch, fetchform, fetchlinks, submittext and submitlinks // response code: //print "response code: ".$snoopy->response_code."<br/> "; // print the headers: //print "<b>Headers:</b><br/>"; //while(list($key,$val) = each($snoopy->headers)){ // print $key.": ".$val."<br/> "; //} // print the texts of the website: //print_r( json_decode($snoopy->results) ); $results = array(); $tmp = json_decode($snoopy->results); if($tmp){ if(property_exists($tmp, `data`)){ foreach( $tmp->data->list as $lst ){ $results[] = $lst->uin; } } } return ($results); } else { print "Snoopy: error while fetching document: ".$snoopy->error." "; } } } $pool = new Pool(100, CrawlerWorker::class, []); #foreach (range(1000, 100000) as $number) { # $pool->submit(new Crawler($number)); #} $pool->submit(new Crawler(`13721218`)); $pool->submit(new Crawler(`291379`)); //$pool->submit(new Crawler(`xxx`)); //$pool->submit(new Crawler(`xxx`)); //$pool->submit(new Crawler(`xxx`)); // 以此類推 //$pool->submit(new Crawler(`nnn`)); $pool->shutdown(); ?>
如何聯絡我:【萬里虎】www.bravetiger.cn
【QQ】3396726884 (諮詢問題100元起,幫助解決問題500元起)
【部落格】http://www.cnblogs.com/kenshinobiy/
相關文章
- 多執行緒爬蟲實現(上)執行緒爬蟲
- 如何使用queue模組實現多執行緒爬蟲執行緒爬蟲
- iOS多執行緒Pthreads篇iOS執行緒thread
- 如何讓您的php也支援pthreads多執行緒PHPthread執行緒
- python多執行緒爬蟲與單執行緒爬蟲效率效率對比Python執行緒爬蟲
- 簡易多執行緒爬蟲框架執行緒爬蟲框架
- Python 爬蟲 (四) --多執行緒Python爬蟲執行緒
- python爬蟲之多執行緒、多程式+程式碼示例Python爬蟲執行緒
- Python《多執行緒併發爬蟲》Python執行緒爬蟲
- 資料提取方法-多程式多執行緒爬蟲執行緒爬蟲
- Python爬蟲入門【9】:圖蟲網多執行緒爬取Python爬蟲執行緒
- Python 爬蟲 (五) --多執行緒續 (Queue )Python爬蟲執行緒
- python爬蟲入門八:多程式/多執行緒Python爬蟲執行緒
- PHP多執行緒的實現方法詳解PHP執行緒
- 多執行緒-多執行緒方式1的程式碼實現執行緒
- Python爬蟲入門【10】:電子書多執行緒爬取Python爬蟲執行緒
- 如何實現多執行緒執行緒
- 多執行緒原理實現執行緒
- PHP的多樣化執行方式(parallel PHP多執行緒實現,原生協程實現,多程序實現,ZTS、NTS、TS又是什麼)PHPParallel執行緒
- 多執行緒實現多工二執行緒
- 多執行緒實現多工一執行緒
- Python3多執行緒爬蟲例項講解Python執行緒爬蟲
- 多執行緒-多執行緒方式2的思路及程式碼實現執行緒
- python多執行緒非同步爬蟲-Python非同步爬蟲試驗[Celery,gevent,requests]Python執行緒非同步爬蟲
- Java多執行緒實現方式Java執行緒
- 多執行緒具體實現執行緒
- Java多執行緒的實現Java執行緒
- JavaScript如何實現多執行緒?JavaScript執行緒
- Runnable介面實現多執行緒執行緒
- python多執行緒實現Python執行緒
- NSThread實現多執行緒thread執行緒
- NSThread多執行緒實現thread執行緒
- 【unity】 Loom實現多執行緒UnityOOM執行緒
- 基於多執行緒+協程的非同步增量式爬蟲執行緒非同步爬蟲
- 多執行緒-匿名內部類的方式實現多執行緒程式執行緒
- Python爬蟲:一些常用的爬蟲技巧總結(IP,cookie,header,多執行緒)Python爬蟲CookieHeader執行緒
- ajax+php實現爬蟲功能PHP爬蟲
- 利用訊號量實現執行緒順序執行執行緒