国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

PHP使用CURL實現多線程抓取網頁

2024-05-04 23:34:50
字體:
來源:轉載
供稿:網友

PHP 利用 Curl 可以完成各種傳送文件操作,比如模擬瀏覽器發送GET,POST請求等等,然而因為php語言本身不支持多線程,所以開發爬蟲程序效率并不高,不過可以用 Curl ,借助Curl 這個功能實現并發多線程的訪問多個url地址以實現并發多線程抓取網頁或者下載文件

PHP 利用 Curl Functions 可以完成各種傳送文件操作,比如模擬瀏覽器發送GET,POST請求等等,受限于php語言本身不支持多線程,所以開發爬蟲程序效率并不高,這時候往往需 要借助Curl Multi Functions 它可以實現并發多線程的訪問多個url地址。既然 Curl Multi Function如此強大,能否用 Curl Multi Functions 來寫并發多線程下載文件呢,當然可以,下面給出我的代碼:

代碼1:將獲得的代碼直接寫入某個文件

 

 
  1. <?php  
  2. $urls = array(  
  3. 'http://www.sina.com.cn/',  
  4. 'http://www.sohu.com/',  
  5. 'http://www.163.com/' 
  6. ); // 設置要抓取的頁面URL  
  7.  
  8. $save_to='/test.txt'// 把抓取的代碼寫入該文件  
  9.  
  10. $st = fopen($save_to,"a");  
  11. $mh = curl_multi_init();  
  12.  
  13. foreach ($urls as $i => $url) {  
  14. $conn[$i] = curl_init($url);  
  15. curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");  
  16. curl_setopt($conn[$i], CURLOPT_HEADER ,0);  
  17. curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60);  
  18. curl_setopt($conn[$i], CURLOPT_FILE,$st); // 設置將爬取的代碼寫入文件  
  19. curl_multi_add_handle ($mh,$conn[$i]);  
  20. // 初始化  
  21.  
  22. do {  
  23. curl_multi_exec($mh,$active);  
  24. while ($active); // 執行  
  25.  
  26. foreach ($urls as $i => $url) {  
  27. curl_multi_remove_handle($mh,$conn[$i]);  
  28. curl_close($conn[$i]);  
  29. // 結束清理  
  30.  
  31. curl_multi_close($mh);  
  32. fclose($st);  
  33. ?>  

代碼2:將獲得的代碼先放入變量,再寫入某個文件

 

 
  1. <?php  
  2. $urls = array(  
  3. 'http://www.sina.com.cn/',  
  4. 'http://www.sohu.com/',  
  5. 'http://www.163.com/' 
  6. );  
  7.  
  8. $save_to='/test.txt'// 把抓取的代碼寫入該文件  
  9. $st = fopen($save_to,"a");  
  10.  
  11. $mh = curl_multi_init();  
  12. foreach ($urls as $i => $url) {  
  13. $conn[$i] = curl_init($url);  
  14. curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");  
  15. curl_setopt($conn[$i], CURLOPT_HEADER ,0);  
  16. curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60);  
  17. curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,true); // 設置不將爬取代碼寫到瀏覽器,而是轉化為字符串  
  18. curl_multi_add_handle ($mh,$conn[$i]);  
  19. }  
  20.  
  21. do {  
  22. curl_multi_exec($mh,$active);  
  23. while ($active);  
  24.  
  25. foreach ($urls as $i => $url) {  
  26. $data = curl_multi_getcontent($conn[$i]); // 獲得爬取的代碼字符串  
  27. fwrite($st,$data); // 將字符串寫入文件。當然,也可以不寫入文件,比如存入數據庫  
  28. // 獲得數據變量,并寫入文件  
  29.  
  30. foreach ($urls as $i => $url) {  
  31. curl_multi_remove_handle($mh,$conn[$i]);  
  32. curl_close($conn[$i]);  
  33. }  
  34.  
  35. curl_multi_close($mh);  
  36. fclose($st);  
  37. ?> 

以上所述就是本文的全部內容了,希望大家能夠喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 呈贡县| 宜丰县| 菏泽市| 长宁区| 玛纳斯县| 垫江县| 扎赉特旗| 衡山县| 庆城县| 军事| 松潘县| 子洲县| 余姚市| 瑞昌市| 渑池县| 慈溪市| 类乌齐县| 犍为县| 天峨县| 若尔盖县| 遂平县| 江阴市| 大石桥市| 炉霍县| 凤城市| 株洲市| 梁平县| 元朗区| 枣庄市| 会泽县| 红河县| 长寿区| 东阳市| 五家渠市| 财经| 会泽县| 汾阳市| 克拉玛依市| 莲花县| 昔阳县| 衡东县|