php多线程抓取多个网页(PHP利用Curl实现并发多线程抓取网页或者下载文件的操作 )

优采云 发布时间: 2021-10-28 00:13

  php多线程抓取多个网页(PHP利用Curl实现并发多线程抓取网页或者下载文件的操作

)

  PHP可以使用Curl来完成各种文件传输操作,比如模拟浏览器发送GET、POST请求等,但是由于PHP语言本身不支持多线程,所以开发爬虫程序的效率不高。一般使用采集数据即可。使用PHPquery类来采集数据库,除此之外,还可以使用Curl,借助Curl这个功能实现多线程并发访问多个URL地址,实现网页的并发多线程爬取或下载文件。

  具体实现过程请参考以下示例:

  1、 实现抓取多个URL并将内容写入指定文件

  $urls = array( 

'路径地址', 

'路径地址', 

'路径地址' 

); // 设置要抓取的页面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、使用PHP的Curl抓取网页的URL并保存内容

  下面的代码和上面类似,只不过这个地方先把获取到的代码放入变量中,然后将获取到的内容写入到指定文件中

  $urls = array( 

'路径地址', 

'路径地址', 

'路径地址' 

); 

$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);

  3、使用PHP的Curl实现文件的多线程并发下载

  $urls=array(

'路径地址5w.zip',

'路径地址5w.zip',

'路径地址5w.zip'

);

$save_to='./home/';

$mh=curl_multi_init();

foreach($urls as $i=>$url){

$g=$save_to.basename($url);

if(!is_file($g)){

$conn[$i]=curl_init($url);

$fp[$i]=fopen($g,"w");

curl_setopt($conn[$i],CURLOPT_USERAGENT,"Mozilla/4.0(compatible; MSIE 7.0; Windows NT 6.0)");

curl_setopt($conn[$i],CURLOPT_FILE,$fp[$i]);

curl_setopt($conn[$i],CURLOPT_HEADER ,0);

curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,60);

curl_multi_add_handle($mh,$conn[$i]);

}

}

do{

$n=curl_multi_exec($mh,$active);

}while($active);

foreach($urls as $i=>$url){

curl_multi_remove_handle($mh,$conn[$i]);

curl_close($conn[$i]);

fclose($fp[$i]);

}

curl_multi_close($mh);$urls=array(

'路径地址5w.zip',

'路径地址5w.zip',

'路径地址5w.zip'

);

$save_to='./home/';

$mh=curl_multi_init();

foreach($urls as $i=>$url){

$g=$save_to.basename($url);

if(!is_file($g)){

$conn[$i]=curl_init($url);

$fp[$i]=fopen($g,"w");

curl_setopt($conn[$i],CURLOPT_USERAGENT,"Mozilla/4.0(compatible; MSIE 7.0; Windows NT 6.0)");

curl_setopt($conn[$i],CURLOPT_FILE,$fp[$i]);

curl_setopt($conn[$i],CURLOPT_HEADER ,0);

curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,60);

curl_multi_add_handle($mh,$conn[$i]);

}

}

do{

$n=curl_multi_exec($mh,$active);

}while($active);

foreach($urls as $i=>$url){

curl_multi_remove_handle($mh,$conn[$i]);

curl_close($conn[$i]);

fclose($fp[$i]);

}

curl_multi_close($mh);

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线