互联网时代,获取信息越来越方便,但是有时候我们需要的信息可能分散在多个网站上。这时候,如果手动一个一个去查找并整理,无疑是非常耗费时间和精力的。那么有没有一种方法可以自动化地采集其它网站的内容呢?答案是肯定的。本文将介绍如何使用 PHP 采集其它网站的内容。
一、获取目标网页的 HTML 内容
首先,我们需要获取目标网页的 HTML 内容。PHP 中提供了许多获取远程内容的函数,其中最常用的就是 file_get_contents()函数。该函数可以将一个2e9b5865537db47267991419e97f0ae9对应的文件读入到一个字符串中:
9328af9636bb3add707425d0a89494f5$url =''; $html = file_get_contents($url);
如果需要向目标网站发送 POST 请求,可以使用 cURL 库:
9328af9636bb3add707425d0a89494f5$url =''; $data = array('c2add694bf942dc77b376592d9c862cd'=>'value1','key2'=>'value2'); $options = array( CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => http_build_query($data) ); $ch = curl_init($url); curl_setopt_array($ch,$options); $html = curl_exec($ch); curl_close($ch);
二、解析 HTML 内容
获取到目标网页的 HTML 内容之后,我们需要从中提取出我们需要的信息。这时候就需要用到 HTML 解析器了。在 PHP 中,有两种常用的 HTML 解析器:DOM 和 SimpleXML。
DOM 解析器可以将 HTML 文档解析成一棵树型结构,我们可以通过遍历这个树来获取我们需要的信息:
9328af9636bb3add707425d0a89494f5$dom = new DOMDocument(); $dom->loadHTML($html); $links =$dom->getElementsByTagName('a'); foreach ($links as $link){ echo $link->getAttribute('href')."\n"; }
SimpleXML 解析器则将 HTML 文档解析成一个对象,我们可以使用对象属性或方法来获取我们需要的信息:
9328af9636bb3add707425d0a89494f5$xml = simplexml_load_string($html); foreach ($xml->xpath('//a') as $link){ echo (string)$link."\n"; }
三、处理解析结果
获取到我们需要的信息之后,我们还需要对其进行处理。比如说,如果我们要将这些信息存储到数据库中,那么就需要对其进行格式化和过滤。
对于格式化,PHP 中提供了许多函数来帮助我们实现。比如说,如果要将一个字符串转换成日期格式,可以使用 strtotime()函数:
9328af9636bb3add707425d0a89494f5$date_str ='2023-04-28'; $date = date('Y-m-d', strtotime($date_str));
对于过滤,PHP 中也提供了许多函数来帮助我们实现。比如说,如果要将一个字符串中的 HTML 标签全部去除,可以使用 strip_tags()函数:
9328af9636bb3add707425d0a89494f5$html ='
Hello,world!
'; $text = strip_tags($html);
四、使用第三方库加速开发
如果我们需要采集的网站比较复杂,那么手动解析 HTML 可能会非常麻烦。这时候,我们可以使用一些第三方库来加速开发。
比如说,PHPQuery 是一个基于 jQuery 的 PHP 库,可以让我们像使用 jQuery 一样来解析 HTML:
php require_once 'phpQuery.php'; phpQuery::newDocumentHTML($html); foreach (pq('a') as $link){ echo pq($link)->attr('href')."\n"; }
又比如说,Goutte 是一个基于 Symfony2 的 PHP 库,可以让我们像使用 jQuery 和 CSS 选择器一样来采集网页:

php require_once 'vendor/autoload.php'; use Goutte\Client; $client = new Client(); $crawler =$client->request('GET',''); foreach ($crawler->filter('a') as $link){ echo $link->getAttribute('href')."\n"; }
五、处理反爬虫机制
有些网站为了防止被爬虫抓取数据,会采用一些反爬虫机制。这时候我们就需要采取一些措施来应对。
最常见的反爬虫机制就是验证码。如果我们在采集数据的过程中遇到了验证码,可以使用第三方库来自动识别。比如说,DeathByCaptcha 就是一个非常常用的验证码识别服务:
php require_once 'deathbycaptcha.php'; $client = new DeathByCaptcha_Client('username','password'); $captcha_file ='/path/to/captcha.png'; $captcha_id =$client->decode($captcha_file);
又比如说,有些网站会检查我们的 User-Agent,如果发现我们使用的是爬虫,就会禁止我们访问。这时候,我们可以在请求头中添加一些随机的信息来模拟浏览器。比如说:
9328af9636bb3add707425d0a89494f5$url =''; $options = array( 'http'=> array( 'method'=>'GET', 'header'=>'User-Agent: Mozilla/5.0(Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.'. rand(1000, 9999).'.0 Safari/537.36' ) ); $context = stream_context_create($options); $html = file_get_contents($url, false,$context);
六、处理多线程采集
如果我们需要采集的网站非常多,那么单线程采集可能会非常慢。这时候,我们可以使用多线程来提高效率。
在 PHP 中,有两种常用的实现多线程的方法:PCNTL 和 cURL 多线程。
PCNTL 是一个 PHP 扩展,可以让我们创建子进程来并行执行任务:
9328af9636bb3add707425d0a89494f5$urls = array('','',''); foreach ($urls as $url){ $pid = pcntl_fork(); if ($pid ==-1){ die("fork failed\n"); } elseif ($pid ==0){ $html = file_get_contents($url); // do something with $html exit(0); } }
cURL 多线程则是使用 cURL 的 multi_*()函数来并行执行任务:
9328af9636bb3add707425d0a89494f5$urls = array('','',''); $mh = curl_multi_init(); foreach ($urls as $url){ $ch = curl_init($url); curl_setopt_array($ch, array( CURLOPT_RETURNTRANSFER => true, CURLOPT_HEADER => false )); curl_multi_add_handle($mh,$ch); } do { curl_multi_exec($mh,$running); } while ($running >0); foreach ($urls as $url){ $ch = curl_multi_getcontent($mh); // do something with $html } curl_multi_close($mh);
七、处理采集结果
最后,采集完成之后,我们需要对采集结果进行处理。比如说,如果要将采集到的数据存储到数据库中,那么就需要对其进行去重和排序。
对于去重,PHP 中提供了许多函数来帮助我们实现。比如说,如果要将一个数组中的重复元素全部去除,可以使用 array_unique()函数:
9328af9636bb3add707425d0a89494f5$data = array('a','b','c','a','d','b'); $data = array_unique($data);
对于排序,PHP 中也提供了许多函数来帮助我们实现。比如说,如果要将一个数组按照字母顺序排序,可以使用 sort()函数:
9328af9636bb3add707425d0a89494f5$data = array('c','b','a','d'); sort($data);
八、总结
PHP 采集其它网站内容是一项非常有用的技能。通过本文的介绍,相信大家已经掌握了如何使用 PHP 采集其它网站的内容,并且处理反爬虫机制、多线程采集和采集结果。但是需要注意的是,在进行网页采集时,一定要遵循法律法规和道德规范,不得侵犯他人权益。




