使用php的curl函数多线程批量抓取网页-解决批量在线查询工具

2019年11月23日 | 标签:

先看效果

www.xcar.com.cn
www.pcauto.com.cn
www.jimi168.com
www.feelcars.com
www.chinaunix.net
www.cheshi.com
www.app111.com
auto.sohu.com
auto.sina.com.cn
auto.people.com.cn
auto.msn.com.cn
auto.china.com
auto.163.com
抓取这13个网站
我使用了curl 单线程抓取 所有内容然后放入变量中
耗时是33秒
然后我使用curl的多线程抓取 然后放置内容到函数中 用事是8秒 速度快了4倍以上 平均1秒可以分析2个网页
这还是在网速很卡的情况下
所以可以预估的是
如果是我多线程 设置好参数 查询13个社交平台的数据进行分析 是可以在3秒之内完成结果的
我们先进行打基数
直接看代码
先是单线程代码
<?php
$curl = curl_init();// 初始化一个 cURL 对象
curl_setopt($curl, CURLOPT_URL, ‘http://www.163.com’);// 设置你需要抓取的URL
curl_setopt($curl, CURLOPT_HEADER, 0);// 设置header
curl_setopt($curl, CURLOPT_USERAGENT, “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36”);   //直接用chrome的开发工具打开网页然后抄下你的发送的request中agent参数
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);// 设置cURL 参数,要求结果保存到字符串中如果是0就是直接打印在频幕上 如果不设置就直接打印在屏幕上 这里我们需要保存在字符串所以是true。
$data = curl_exec($curl);// 运行cURL,请求网页
curl_close($curl);// 关闭URL请求 释放内存
echo $data;// 显示获得的数据
?>
上面就是最简单的例子 获取网页 然后复制到变量 再显示网页上
需要主要就是returntransfer要设置为1 确保返回给变量 然后就是agent数据要用chrome里面查询到的
关于更多的setopt 可以这里查询
http://php.net/manual/zh/function.curl-setopt.php
然后我们做一个循环 查询13个网站
<?php
$urls = array(
‘www.xcar.com.cn’,
‘www.pcauto.com.cn’,
‘www.jimi168.com’,
‘www.feelcars.com’,
‘www.chinaunix.net’,
‘www.cheshi.com’,
‘www.app111.com’,
‘auto.sohu.com’,
‘auto.sina.com.cn’,
‘auto.people.com.cn’,
‘auto.msn.com.cn’,
‘auto.china.com’,
‘auto.163.com’
);
$curl = curl_init();
//开始计时,放在头部
$pagestartime=microtime();
foreach($urls as $url){
// 初始化一个 cURL 对象
// 设置你需要抓取的URL
curl_setopt($curl, CURLOPT_URL, $url);
// 设置header
curl_setopt($curl, CURLOPT_HEADER, 0);
// 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。
curl_setopt($curl, CURLOPT_USERAGENT, “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36”);
// 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
// 运行cURL,请求网页
$data = curl_exec($curl);
 @$totaldata=$totaldata.$data;
}
// 关闭URL请求
curl_close($curl);
//结束计时,放在最底部
$pageendtime = microtime();
$starttime = explode(” “,$pagestartime);
$endtime = explode(” “,$pageendtime);
$totaltime = $endtime[0]-$starttime[0]+$endtime[1]-$starttime[1];
$timecost = sprintf(“%s”,$totaltime);
echo “页面运行时间: $timecost seconds”;
echo $totaldata;
?>
这里我们使用了计时器 查看查询这些网址并且赋值给变量要多久
需要注意的是先输出时间 再输出html源代码 否则源代码这么长 显示出来要等很久
再看看使用curl的多线程的方法
<html>
 <meta  charset=”gb2312″>
 <?php
 set_time_limit(0);
//开始计时,放在头部
$pagestartime=microtime();
$urls = array(
‘www.xcar.com.cn’,
‘www.pcauto.com.cn’,
‘www.jimi168.com’,
‘www.feelcars.com’,
‘www.chinaunix.net’,
‘www.cheshi.com’,
‘www.app111.com’,
‘auto.sohu.com’,
‘auto.sina.com.cn’,
‘auto.people.com.cn’,
‘auto.msn.com.cn’,
‘auto.china.com’,
‘auto.163.com’
);
$mh = curl_multi_init();
foreach ($urls as $i => $url) {
  $conn[$i] = curl_init($url);
  curl_setopt($conn[$i], CURLOPT_USERAGENT, “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36”);
  curl_setopt($conn[$i], CURLOPT_HEADER ,0);
  curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60);
  curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,1);  // 设置不将爬取代码写到浏览器,而是转化为字符串
  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]); // 获得爬取的代码字符串
  @$totaldata=$totaldata.$data;
} // 获得数据变量,并写入文件
foreach ($urls as $i => $url) {
  curl_multi_remove_handle($mh,$conn[$i]);
  curl_close($conn[$i]);
}
curl_multi_close($mh);
//结束计时,放在最底部
$pageendtime = microtime();
$starttime = explode(” “,$pagestartime);
$endtime = explode(” “,$pageendtime);
$totaltime = $endtime[0]-$starttime[0]+$endtime[1]-$starttime[1];
$timecost = sprintf(“%s”,$totaltime);
echo “页面运行时间: $timecost seconds”;
echo $totaldata;
?>
</html>

先看效果

www.xcar.com.cn
www.pcauto.com.cn
www.jimi168.com
www.feelcars.com
www.chinaunix.net
www.cheshi.com
www.app111.com
auto.sohu.com
auto.sina.com.cn
auto.people.com.cn
auto.msn.com.cn
auto.china.com
auto.163.com
抓取这13个网站
我使用了curl 单线程抓取 所有内容然后放入变量中
耗时是33秒
然后我使用curl的多线程抓取 然后放置内容到函数中 用事是8秒 速度快了4倍以上 平均1秒可以分析2个网页
这还是在网速很卡的情况下
所以可以预估的是
如果是我多线程 设置好参数 查询13个社交平台的数据进行分析 是可以在3秒之内完成结果的
我们先进行打基数
直接看代码
先是单线程代码
<?php
$curl = curl_init();// 初始化一个 cURL 对象
curl_setopt($curl, CURLOPT_URL, ‘http://www.163.com’);// 设置你需要抓取的URL
curl_setopt($curl, CURLOPT_HEADER, 0);// 设置header
curl_setopt($curl, CURLOPT_USERAGENT, “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36”);   //直接用chrome的开发工具打开网页然后抄下你的发送的request中agent参数
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);// 设置cURL 参数,要求结果保存到字符串中如果是0就是直接打印在频幕上 如果不设置就直接打印在屏幕上 这里我们需要保存在字符串所以是true。
$data = curl_exec($curl);// 运行cURL,请求网页
curl_close($curl);// 关闭URL请求 释放内存
echo $data;// 显示获得的数据
?>
上面就是最简单的例子 获取网页 然后复制到变量 再显示网页上
需要主要就是returntransfer要设置为1 确保返回给变量 然后就是agent数据要用chrome里面查询到的
关于更多的setopt 可以这里查询
http://php.net/manual/zh/function.curl-setopt.php
然后我们做一个循环 查询13个网站
<?php
$urls = array(
‘www.xcar.com.cn’,
‘www.pcauto.com.cn’,
‘www.jimi168.com’,
‘www.feelcars.com’,
‘www.chinaunix.net’,
‘www.cheshi.com’,
‘www.app111.com’,
‘auto.sohu.com’,
‘auto.sina.com.cn’,
‘auto.people.com.cn’,
‘auto.msn.com.cn’,
‘auto.china.com’,
‘auto.163.com’
);
$curl = curl_init();
//开始计时,放在头部
$pagestartime=microtime();
foreach($urls as $url){
// 初始化一个 cURL 对象
// 设置你需要抓取的URL
curl_setopt($curl, CURLOPT_URL, $url);
// 设置header
curl_setopt($curl, CURLOPT_HEADER, 0);
// 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。
curl_setopt($curl, CURLOPT_USERAGENT, “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36”);
// 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
// 运行cURL,请求网页
$data = curl_exec($curl);
 @$totaldata=$totaldata.$data;
}
// 关闭URL请求
curl_close($curl);
//结束计时,放在最底部
$pageendtime = microtime();
$starttime = explode(” “,$pagestartime);
$endtime = explode(” “,$pageendtime);
$totaltime = $endtime[0]-$starttime[0]+$endtime[1]-$starttime[1];
$timecost = sprintf(“%s”,$totaltime);
echo “页面运行时间: $timecost seconds”;
echo $totaldata;
?>
这里我们使用了计时器 查看查询这些网址并且赋值给变量要多久
需要注意的是先输出时间 再输出html源代码 否则源代码这么长 显示出来要等很久
再看看使用curl的多线程的方法
<html>
 <meta  charset=”gb2312″>
 <?php
 set_time_limit(0);
//开始计时,放在头部
$pagestartime=microtime();
$urls = array(
‘www.xcar.com.cn’,
‘www.pcauto.com.cn’,
‘www.jimi168.com’,
‘www.feelcars.com’,
‘www.chinaunix.net’,
‘www.cheshi.com’,
‘www.app111.com’,
‘auto.sohu.com’,
‘auto.sina.com.cn’,
‘auto.people.com.cn’,
‘auto.msn.com.cn’,
‘auto.china.com’,
‘auto.163.com’
);
$mh = curl_multi_init();
foreach ($urls as $i => $url) {
  $conn[$i] = curl_init($url);
  curl_setopt($conn[$i], CURLOPT_USERAGENT, “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36”);
  curl_setopt($conn[$i], CURLOPT_HEADER ,0);
  curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60);
  curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,1);  // 设置不将爬取代码写到浏览器,而是转化为字符串
  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]); // 获得爬取的代码字符串
  @$totaldata=$totaldata.$data;
} // 获得数据变量,并写入文件
foreach ($urls as $i => $url) {
  curl_multi_remove_handle($mh,$conn[$i]);
  curl_close($conn[$i]);
}
curl_multi_close($mh);
//结束计时,放在最底部
$pageendtime = microtime();
$starttime = explode(” “,$pagestartime);
$endtime = explode(” “,$pageendtime);
$totaltime = $endtime[0]-$starttime[0]+$endtime[1]-$starttime[1];
$timecost = sprintf(“%s”,$totaltime);
echo “页面运行时间: $timecost seconds”;
echo $totaldata;
?>
</html>
目前还没有任何评论.