首页 > 开发 > 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. ?> 

以上所述就是本文的全部内容了,希望大家能够喜欢。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表