当我们需要对多个网站进行数据抓取时,可以使用多线程来加速抓取的效率。PHP中的curl库可以用来发送http请求来进行数据抓取,而结合foreach循环,可以实现多个curl请求同时发送,进而实现多线程抓取的效果。
一、curl库的基本使用
要使用curl库发送http请求,我们首先需要开启curl扩展,可以在php.ini文件中将其打开,或者使用函数extension_loaded('curl')
判断是否加载curl扩展。
发送一个GET请求示例:
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'http://example.com');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($curl);
curl_close($curl);
发送一个POST请求示例:
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'http://example.com');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, ['key' => 'value']);
$result = curl_exec($curl);
curl_close($curl);
二、使用foreach结合curl进行多线程抓取
首先,我们需要准备一个待抓取的URL列表,可以使用数组来实现。
$urls = [
'http://example.com',
'https://www.google.com',
'https://www.facebook.com'
];
然后,我们使用foreach循环来遍历URL列表,并使用curl发送http请求,将结果保存到一个数组中。
$curls = [];
$results = [];
foreach ($urls as $url) {
$curls[] = curl_init();
curl_setopt($curls[count($curls)-1], CURLOPT_URL, $url);
curl_setopt($curls[count($curls)-1], CURLOPT_RETURNTRANSFER, 1);
}
$mh = curl_multi_init();
foreach ($curls as $curl) {
curl_multi_add_handle($mh, $curl);
}
$running = null;
do {
curl_multi_exec($mh, $running);
} while ($running > 0);
foreach ($curls as $i => $curl) {
$results[$i] = curl_multi_getcontent($curl);
curl_multi_remove_handle($mh, $curl);
}
curl_multi_close($mh);
上述代码首先使用foreach循环创建了多个curl句柄,并将其添加到curl_multi_init()对象中,然后调用curl_multi_exec()方法,将所有curl请求发送出去,直到所有请求全部完成。最后,我们遍历所有curl句柄,获取回应的内容,并将结果保存到一个数组中。
三、示例代码
以下是一个完整的使用foreach结合curl实现多线程抓取的示例代码:
<?php
$urls = [
'http://example.com',
'https://www.google.com',
'https://www.facebook.com'
];
$curls = [];
$results = [];
foreach ($urls as $url) {
$curls[] = curl_init();
curl_setopt($curls[count($curls)-1], CURLOPT_URL, $url);
curl_setopt($curls[count($curls)-1], CURLOPT_RETURNTRANSFER, 1);
}
$mh = curl_multi_init();
foreach ($curls as $curl) {
curl_multi_add_handle($mh, $curl);
}
$running = null;
do {
curl_multi_exec($mh, $running);
} while ($running > 0);
foreach ($curls as $i => $curl) {
$results[$i] = curl_multi_getcontent($curl);
curl_multi_remove_handle($mh, $curl);
}
curl_multi_close($mh);
foreach ($results as $result) {
echo $result;
}
?>
以上代码会输出三个URL的HTML源代码。根据实际需要,我们可以对代码进行修改,来处理不同的抓取任务。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:php中foreach结合curl实现多线程的方法分析 - Python技术站