PHP实现多线程抓取网页
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                PHP实现多线程抓取网页
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                來源:http://www.cnblogs.com/jyginger/archive/2010/07/20/1781516.html
PHP 利用 Curl Functions 可以完成各種傳送文件操作,比如模擬瀏覽器發送GET,POST請求等等,受限于php語言本身不支持多線程,所以開發爬蟲程序效率并不高,這時候往往需 要借助Curl Multi Functions 它可以實現并發多線程的訪問多個url地址。既然 Curl Multi Function如此強大,能否用 Curl Multi Functions 來寫并發多線程下載文件呢,當然可以,下面給出我的代碼:
代碼1:將獲得的代碼直接寫入某個文件
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | <?php $urls?= array(?? ?'http://www.sina.com.cn/',?? ?'http://www.sohu.com/',?? ?'http://www.163.com/'? ); // 設置要抓取的頁面URL?? ????? $save_to='/test.txt';?? // 把抓取的代碼寫入該文件??? ??? $st?= fopen($save_to,"a");?? $mh?= curl_multi_init();??? ??? foreach?($urls?as?$i?=> $url) {?? ??$conn[$i] = curl_init($url);?? ??curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");?? ??curl_setopt($conn[$i], CURLOPT_HEADER ,0);?? ??curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60);?? ??curl_setopt($conn[$i], CURLOPT_FILE,$st); // 設置將爬取的代碼寫入文件?? ??curl_multi_add_handle ($mh,$conn[$i]);?? } // 初始化?? ????? do?{?? ??curl_multi_exec($mh,$active);?? } while?($active);? // 執行?? ????? foreach?($urls?as?$i?=> $url) {?? ??curl_multi_remove_handle($mh,$conn[$i]);?? ??curl_close($conn[$i]);?? } // 結束清理?? ????? curl_multi_close($mh);?? fclose($st); ?> | 
代碼2:將獲得的代碼先放入變量,再寫入某個文件
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | <?php $urls?= array(?? ?'http://www.sina.com.cn/',?? ?'http://www.sohu.com/',?? ?'http://www.163.com/'? );?? ??? $save_to='/test.txt';?? // 把抓取的代碼寫入該文件?? $st?= fopen($save_to,"a");?? ??? $mh?= curl_multi_init();?? foreach?($urls?as?$i?=> $url) {?? ??$conn[$i] = curl_init($url);?? ??curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");?? ??curl_setopt($conn[$i], CURLOPT_HEADER ,0);?? ??curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60);?? ??curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,true);? // 設置不將爬取代碼寫到瀏覽器,而是轉化為字符串?? ??curl_multi_add_handle ($mh,$conn[$i]);?? }?? ??? do?{?? ??curl_multi_exec($mh,$active);?? } while?($active);?? ????? foreach?($urls?as?$i?=> $url) {?? ??$data?= curl_multi_getcontent($conn[$i]); // 獲得爬取的代碼字符串?? ??fwrite($st,$data);? // 將字符串寫入文件。當然,也可以不寫入文件,比如存入數據庫?? } // 獲得數據變量,并寫入文件?? ??? foreach?($urls?as?$i?=> $url) {?? ??curl_multi_remove_handle($mh,$conn[$i]);?? ??curl_close($conn[$i]);?? }?? ??? curl_multi_close($mh);?? fclose($st);? ?> | 
?
總結
以上是生活随笔為你收集整理的PHP实现多线程抓取网页的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 保险免赔额是什么意思
- 下一篇: curl_init()和curl_mul
