PHP多線程抓取網(wǎng)頁實(shí)現(xiàn)代碼
更新時(shí)間:2010年07月22日 01:03:58 作者:
PHP 利用 Curl Functions 可以完成各種傳送文件操作,比如模擬瀏覽器發(fā)送GET,POST請(qǐng)求等等。
受限于php語言本身不支持多線程,所以開發(fā)爬蟲程序效率并不高,這時(shí)候往往需 要借助Curl Multi Functions 它可以實(shí)現(xiàn)并發(fā)多線程的訪問多個(gè)url地址。既然 Curl Multi Function如此強(qiáng)大,能否用 Curl Multi Functions 來寫并發(fā)多線程下載文件呢,當(dāng)然可以,下面給出我的代碼:
代碼1:將獲得的代碼直接寫入某個(gè)文件
<?php
$urls = array(
'http://www.sina.com.cn/',
'http://www.sohu.com/',
'http://www.163.com/'
); // 設(shè)置要抓取的頁面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); // 設(shè)置將爬取的代碼寫入文件
curl_multi_add_handle ($mh,$conn[$i]);
} // 初始化
do {
curl_multi_exec($mh,$active);
} while ($active); // 執(zhí)行
foreach ($urls as $i => $url) {
curl_multi_remove_handle($mh,$conn[$i]);
curl_close($conn[$i]);
} // 結(jié)束清理
curl_multi_close($mh);
fclose($st);
?>
代碼2:將獲得的代碼先放入變量,再寫入某個(gè)文件
<?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); // 設(shè)置不將爬取代碼寫到瀏覽器,而是轉(zhuǎn)化為字符串
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); // 將字符串寫入文件。當(dāng)然,也可以不寫入文件,比如存入數(shù)據(jù)庫
} // 獲得數(shù)據(jù)變量,并寫入文件
foreach ($urls as $i => $url) {
curl_multi_remove_handle($mh,$conn[$i]);
curl_close($conn[$i]);
}
curl_multi_close($mh);
fclose($st);
?>
代碼1:將獲得的代碼直接寫入某個(gè)文件
復(fù)制代碼 代碼如下:
<?php
$urls = array(
'http://www.sina.com.cn/',
'http://www.sohu.com/',
'http://www.163.com/'
); // 設(shè)置要抓取的頁面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); // 設(shè)置將爬取的代碼寫入文件
curl_multi_add_handle ($mh,$conn[$i]);
} // 初始化
do {
curl_multi_exec($mh,$active);
} while ($active); // 執(zhí)行
foreach ($urls as $i => $url) {
curl_multi_remove_handle($mh,$conn[$i]);
curl_close($conn[$i]);
} // 結(jié)束清理
curl_multi_close($mh);
fclose($st);
?>
代碼2:將獲得的代碼先放入變量,再寫入某個(gè)文件
復(fù)制代碼 代碼如下:
<?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); // 設(shè)置不將爬取代碼寫到瀏覽器,而是轉(zhuǎn)化為字符串
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); // 將字符串寫入文件。當(dāng)然,也可以不寫入文件,比如存入數(shù)據(jù)庫
} // 獲得數(shù)據(jù)變量,并寫入文件
foreach ($urls as $i => $url) {
curl_multi_remove_handle($mh,$conn[$i]);
curl_close($conn[$i]);
}
curl_multi_close($mh);
fclose($st);
?>
您可能感興趣的文章:
- PHP pthreads v3使用中的一些坑和注意點(diǎn)分析
- php使用pthreads v3多線程實(shí)現(xiàn)抓取新浪新聞信息操作示例
- php pthreads多線程的安裝與使用
- 使用pthreads實(shí)現(xiàn)真正的PHP多線程(需PHP5.3以上版本)
- 實(shí)現(xiàn)PHP多線程異步請(qǐng)求的3種方法
- php三種實(shí)現(xiàn)多線程類似的方法
- php異步多線程swoole用法實(shí)例
- PHP多線程類及用法實(shí)例
- PHP安裝threads多線程擴(kuò)展基礎(chǔ)教程
- PHP多線程批量采集下載美女圖片的實(shí)現(xiàn)代碼(續(xù))
- PHP Curl多線程原理實(shí)例詳解
- PHP pthreads v3下的Volatile簡(jiǎn)介與使用方法示例
相關(guān)文章
php 強(qiáng)制下載文件實(shí)現(xiàn)代碼
php 強(qiáng)制下載文件實(shí)現(xiàn)代碼。需要的朋友可以過來參考下,希望對(duì)大家有所幫助2013-10-10
基于PHP實(shí)現(xiàn)郵件實(shí)時(shí)通知功能
隨著企業(yè)化的管理越來越規(guī)范,各種項(xiàng)目管理系統(tǒng)中,都需要加入到郵件實(shí)時(shí)通知功能,所以在項(xiàng)目中如何整合發(fā)郵件功能,其實(shí)也是很重要的一點(diǎn)。本文為大家介紹了PHP實(shí)現(xiàn)郵件實(shí)時(shí)通知功能的示例代碼,需要的可以參考一下2022-04-04
PHP實(shí)現(xiàn)微信掃碼登錄功能的兩種方式總結(jié)
這篇文章主要為大家介紹了利用PHP實(shí)現(xiàn)微信掃碼登錄功能的兩種方式,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)有一定借鑒價(jià)值,需要的可以參考一下2022-08-08
PHP人民幣金額數(shù)字轉(zhuǎn)中文大寫的函數(shù)代碼
在網(wǎng)上看到一個(gè)非常有趣的PHP人民幣金額數(shù)字轉(zhuǎn)中文大寫的函數(shù),其實(shí)質(zhì)就是數(shù)字轉(zhuǎn)換成中文大寫,測(cè)試了一下,非常有趣,隨便輸個(gè)數(shù)字,就可以將其大寫打印出來,新手朋友們?cè)囈幌掳?/div> 2013-02-02
PHP模擬asp中response類實(shí)現(xiàn)方法
這篇文章主要介紹了PHP模擬asp中response類的方法,可實(shí)現(xiàn)模擬ASP中response類處理客戶端響應(yīng)的功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08
基于php偽靜態(tài)的實(shí)現(xiàn)方法解析
這篇文章主要介紹了基于php偽靜態(tài)的實(shí)現(xiàn)方法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
php下圖片文字混合水印與縮略圖實(shí)現(xiàn)代碼
php中圖片文字混合水印與縮略圖的實(shí)現(xiàn)代碼,需要的朋友可以參考下。2009-12-12
PHP使用pdo實(shí)現(xiàn)事務(wù)處理操作示例
這篇文章主要介紹了PHP使用pdo實(shí)現(xiàn)事務(wù)處理操作,結(jié)合實(shí)例形式較為詳細(xì)的分析了php基于pdo實(shí)現(xiàn)事務(wù)處理的相關(guān)原理與操作技巧,需要的朋友可以參考下2018-09-09
PHP+JS+rsa數(shù)據(jù)加密傳輸實(shí)現(xiàn)代碼
PHP+JS+rsa數(shù)據(jù)加密傳輸實(shí)現(xiàn)代碼,需要的朋友可以參考下。2011-03-03最新評(píng)論

