php 爬虫抓取网页数据(对PHP数据没有比较好的处理方案,你了解多少?)
优采云 发布时间: 2021-09-09 00:07php 爬虫抓取网页数据(对PHP数据没有比较好的处理方案,你了解多少?)
很多爬虫都是用python写的。它的优点是可以简单的模仿各种请求,对文档解析有更好的支持。
对于PHP来说,写爬虫有点麻烦,不过也有很多强大的第三方库来支持。
比较知名的PHP爬虫框架
phpspider
git 地址
文件地址
优点是简单的配置可以直接运行,xPath选择器一般都能得到你想要的信息。支持多进程,使用redis支持断点采集。自动扫描列表页面匹配规则链接,更利于自动化。
缺点是如果采集比较大网站,很容易被反爬虫机制识别,导致无法获取数据。 Ajax数据没有更好的解决方案,尤其是使用POST获取数据。
总结:适合抓取静态页面,中小型网站无反爬虫机制。
PHP 硒
文件地址
严格来说,这不是爬虫。 Selenium 是一个前端自动化测试框架。可以使用各种语言执行JS脚本来模拟用户访问界面。
提交、验证、点击等操作事件,因为它模仿真实操作进行数据采集,可以很好的应对很多反爬虫机制,也是很多人比较喜欢的工具。
优点是完美模仿用户行为,可以绕过一般的反爬虫机制。对数据源没有要求,只要是页面渲染的数据就可以获取。填写表格和验证注册相对简单。
缺点是需要模拟浏览器,消耗资源过多。需要编写更多的模拟操作代码来模拟行为。如果操作过于频繁,也会触发网站的机器人验证。
总结:适用于抓取少量数据,或者抓取跳转较深的页面数据。
自己手动编写爬虫
PHP不是特别适合做专业的爬虫工具,但是如果对以上两个都不满意,那就手动写一个简单的爬虫吧。优点是可以处理各种数据类型,可以抓取任何你想要抓取的页面的缺点当然很明显,自动化程度不是很高。
第一步是选择自己喜欢的PHP框架,当然我们这里选择Laravel
第二部分,安装两个必要的库
Goutte 和 Guzzle
composer require fabpot/goutte
composer require guzzlehttp/guzzle:~6.0
Goutte git 地址
Guzzle git 地址
Guzzle 文档地址
Guzzle 库是一个强大的 PHP HTTP 请求套件,可以模拟各种请求,如 GET、POST、PUT 等。页面,那就够了。
基本使用方法如下
use GuzzleHttp\Client;
use GuzzleHttp\Psr7\Request as GuzzleRequest;
public function index()
{
$url = "https://www.hao123.com/";
$request = new GuzzleRequest('GET', $url);
$response = $client->send($request, ['timeout' => 5]);
$content = $response->getBody()->getContents();
echo $content;
}
其他高级用法请参考文档。
Goutte 库实际上依赖于 Guzzle 和 DomCrawler
原理是检索到的页面数据由DomCrawler处理,基础爬虫就是靠这个来获取数据的。
use Goutte\Client as GoutteClient;
public function index()
{
$client = new GoutteClient();
$url = 'https://www.hao123.com/';
$crawler = $client->request('GET', $url);
//hao123 导航分类
$navs = $crawler->filter('#menus')->html();
echo $navs;
}
此代码将返回带有 id 菜单的 html 结构。是的,它的过滤器选择器与 Jquery 相同。它可以支持嵌套和每个循环。有关详细信息,请参阅文档。我将发布另一个循环代码。
public function index()
{
$client = new GoutteClient();
$url = 'https://www.hao123.com/';
$crawler = $client->request('GET', $url);
//hao123 导航分类
$navs = $crawler->filter('#menus li');
$navs->each(function ($node) {
echo $node->text().'
';
});
}
您可以打印出导航下 li 标签中的每个选项。其他高级用法请参考文档。
有了这两个函数,你就可以通过分析数据抓取的规律来编写自己的爬虫了。
当然,这个Url需要注意,不能只填页面地址,所以可能什么也得不到。
ajax数据需要打开开发者面板查看获取数据的实际url,直接获取结果。
还有很多网站做了anti-curl获取源码,那我们就需要另辟蹊径,比如用wget命令将页面直接下载到本地,然后用DomCrawler截取数据。
参考文章
%E7%...
博客:PHP爬虫爬取社区文章content
goutteGuzzle
本作品采用《CC协议》,转载需注明作者及本文链接