说PHP不适合做爬虫的人,看这里

news2024/10/6 8:33:42

文章目录

  • 一、关于PHP爬虫框架—Goutte
    • 1.1 什么是Goutte
    • 1.2 Goutte的优点
    • 1.3 Goutte的安装
  • 二、Goutte的使用
    • 2.1 基本用法
    • 2.2 获取页面内容
    • 2.3 表单提交
    • 2.4 AJAX请求
    • 2.5 登录并抓取数据
  • 三、15个Goutte爬虫示例
    • 3.1 简单示例
    • 3.2 获取表格内容
    • 3.3 登录并获取数据
    • 3.4 处理JavaScript渲染的内容
    • 3.5 使用代理访问网页
    • 3.6 提交表单并获取重定向后的页面内容
    • 3.7 处理XML数据
    • 3.8 获取多个页面的数据
    • 3.9 使用cookie访问网页
    • 3.10 处理AJAX响应
    • 3.11 从JSON数据中获取内容
    • 3.12 使用队列爬取网页
    • 3.13 处理下载文件
    • 3.14 获取图片链接并下载图片
    • 3.15. 关闭自动重定向
  • 总结


一、关于PHP爬虫框架—Goutte

本文已收录于PHP全栈系列专栏:PHP快速入门与实战

近年来,互联网上数据信息的更新迅速,而在很多情况下,我们需要获取某些特定的数据来分析或者用于其他用途。这时候就需要用到爬虫。PHP作为一种流行的编程语言,自然有相应的爬虫框架出现。今天,我们就来介绍一款常用的PHP爬虫框架——Goutte,并给出15个实例供读者参考。

在这里插入图片描述

1.1 什么是Goutte

Goutte是基于Symfony Components开发的一个PHP Web爬虫库,主要用于爬取网站HTML页面。它使用了 Guzzle HTTP客户端库和Symfony DomCrawler组件,能够模拟用户访问网站,获取网页的内容,并执行抓取任务。

1.2 Goutte的优点

Goutte具有以下优点:

  1. 简单易用:不需要掌握底层的爬虫原理和算法,只需了解一定的PHP语言和HTML基础即可上手。

  2. 兼容性强:能够适应不同的网站结构和页面布局,支持JavaScript、Cookies、Session等。

  3. 灵活性高:用户可以自定义HTTP请求及响应处理逻辑,如HTTP头部设置、页面截断、代理支持等等。

  4. 集成度高:Goutte可以结合其他Symfony组件使用,如表单组件、验证组件、视图组件等。

1.3 Goutte的安装

Goutte支持Composer安装,只需执行以下命令即可:

composer require fabpot/goutte

二、Goutte的使用

2.1 基本用法

下面是一个简单的Goutte使用实例:

use Goutte\Client;

$client = new Client();

$crawler = $client->request('GET', 'http://www.baidu.com/');

$crawler->filter('a')->each(function ($node) {
    print $node->attr('href')."\n";
});

该实例访问百度首页,获取所有链接的地址并输出。首先我们创建了一个Client实例,然后使用request方法获取百度首页HTML内容,接着使用filter方法选择DOM节点,并使用each方法进行循环处理每个节点。

2.2 获取页面内容

通过Goutte可以获取网页的所有内容,如标题、Meta标签、CSS样式、JavaScript脚本等。下面是一个实例:

$client = new Client();
$crawler = $client->request('GET', 'https://www.sina.com.cn/');
$title = $crawler->filterXPath('//title')->text();
$meta = $crawler->filterXPath('//meta[@name="description"]')->attr('content');
$css = $crawler->filterXPath('//link[@rel="stylesheet"]')->attr('href');
$script = $crawler->filterXPath('//script[@src]')->attr('src');
echo "title: ".$title."\n";
echo "meta_description: ".$meta."\n";
echo "css: ".$css."\n";
echo "script: ".$script."\n";

上述实例获取了新浪网首页的标题、Meta标签中的description、CSS样式文件和JavaScript脚本文件,并输出到控制台中。

2.3 表单提交

在某些情况下,我们需要模拟用户登录并提交表单来获取目标数据。Goutte可以通过类似用户行为的方式提交表单。下面是一个实例:

use Symfony\Component\DomCrawler\Form;

$client = new Client();
$crawler = $client->request('GET', 'http://localhost/login.php');

$form = $crawler->selectButton('login')->form();

$form['username'] = 'admin';
$form['password'] = '123456';

$crawler = $client->submit($form);

echo $crawler->filterXPath('//div[@class="alert alert-success"]')->text()."\n";

该实例模拟用户通过POST方式提交了用户名和密码,登录了本地服务器的一个测试站点,并获取了登录后的页面内容。

2.4 AJAX请求

现如今,越来越多的网页采用了AJAX的技术,动态更新数据。Goutte同样也支持模拟AJAX请求并抓取返回的结果。下面是一个实例:

$client = new Client();
$crawler = $client->request('GET', 'https://www.taobao.com/');
$ajax_url = $crawler->filterXPath('//a[@data-ajax]');
$response = $client->request('GET', $ajax_url->attr('href'));
echo $response->filterXPath('//title')->text()."\n";

该实例获取了淘宝首页中带data-ajax属性的链接地址,并使用Goutte进行AJAX请求,并输出返回的页面标题。

2.5 登录并抓取数据

在某些情况下,我们需要先登录才能抓取到目标数据。下面是一个实例:

$client = new Client();

// login first
$crawler = $client->request('GET', 'http://localhost/login.php');
$form = $crawler->selectButton('login')->form();
$form['username'] = 'admin';
$form['password'] = '123456';
$crawler = $client->submit($form);

// then visit the page you want
$crawler = $client->request('GET', 'http://localhost/data.php');
echo $crawler->filterXPath('//table')->text()."\n";

该实例先模拟用户登录操作,然后再访问数据页面,并输出数据表格内容。

三、15个Goutte爬虫示例

3.1 简单示例

use Goutte\Client;

$client = new Client();

$crawler = $client->request('GET', 'http://www.example.com');

$crawler->filter('h1')->each(function ($node) {
    echo $node->text()."\n";
});

3.2 获取表格内容

use Goutte\Client;

$client = new Client();

$crawler = $client->request('GET', 'http://www.example.com/table.html');

$tableRows = $crawler->filter('table tr')->each(function ($row) {
    return $row->filter('td')->each(function ($cell) {
        return $cell->text();
    });
});

var_dump($tableRows);

3.3 登录并获取数据

use Goutte\Client;

$client = new Client();

// 登录页面
$crawler = $client->request('GET', 'http://www.example.com/login');

// 填充表单并提交
$form = $crawler->selectButton('Login')->form();
$form['username'] = 'user';
$form['password'] = 'pass';
$crawler = $client->submit($form);

// 获取需要的数据
$crawler->filter('div.content')->each(function ($node) {
    echo $node->text()."\n";
});

3.4 处理JavaScript渲染的内容

use Goutte\Client;
use Symfony\Component\DomCrawler\Crawler;

$client = new Client();

$crawler = $client->request('GET', 'http://www.example.com');

// 等待JavaScript加载完成
$client->wait(5000, "document.readyState === 'complete'");

// 使用Crawler对象解析JavaScript渲染后的HTML内容
$javascriptRenderedHtml = $client->executeScript('return document.documentElement.outerHTML;');
$crawler = new Crawler($javascriptRenderedHtml);

$crawler->filter('h1')->each(function ($node) {
    echo $node->text()."\n";
});

3.5 使用代理访问网页

use Goutte\Client;

$client = new Client();

// 设置代理服务器
$client->setProxy('http://proxy.example.com:8080');

// 访问需要使用代理的页面
$crawler = $client->request('GET', 'http://www.example.com');

$crawler->filter('h1')->each(function ($node) {
    echo $node->text()."\n";
});

3.6 提交表单并获取重定向后的页面内容

use Goutte\Client;

$client = new Client();

// 访问包含表单的页面
$crawler = $client->request('GET', 'http://www.example.com/form');

// 填充表单并提交
$form = $crawler->selectButton('Submit')->form();
$form['name'] = 'John';
$crawler = $client->submit($form);

// 获取重定向后的页面内容
$url = $crawler->getUri();
$crawler = $client->request('GET', $url);

$crawler->filter('h1')->each(function ($node) {
    echo $node->text()."\n";
});

3.7 处理XML数据

use Goutte\Client;

$client = new Client();

$crawler = $client->request('GET', 'http://www.example.com/xml');

$xml = simplexml_load_string($crawler->html());

foreach ($xml->item as $item) {
    echo $item->title."\n";
    echo $item->description."\n";
}

3.8 获取多个页面的数据

use Goutte\Client;

$client = new Client();

$urls = [
    'http://www.example.com/page1',
    'http://www.example.com/page2',
    'http://www.example.com/page3',
];

foreach ($urls as $url) {
    $crawler = $client->request('GET', $url);

    $crawler->filter('h1')->each(function ($node) {
        echo $node->text()."\n";
    });
}

3.9 使用cookie访问网页

use Goutte\Client;

$client = new Client();

// 设置cookie
$client->getCookieJar()->set(new \Symfony\Component\BrowserKit\Cookie('session_id', '123'));

$crawler = $client->request('GET', 'http://www.example.com');

$crawler->filter('h1')->each(function ($node) {
    echo $node->text()."\n";
});

3.10 处理AJAX响应

use Goutte\Client;

$client = new Client();
$client->request('GET', 'http://www.example.com');

// 发送异步请求获取数据
$response = $client->getClient()->request('POST', 'http://www.example.com/ajax', [
    'headers' => ['X-Requested-With' => 'XMLHttpRequest'],
    'json' => ['key' => 'value'],
]);

// 处理响应
$data = json_decode($response->getBody(), true);
echo $data['name']."\n";
echo $data['age']."\n";

3.11 从JSON数据中获取内容

use Goutte\Client;

$client = new Client();
$crawler = $client->request('GET', 'http://www.example.com/api');

$jsonData = json_decode($crawler->html());

foreach ($jsonData as $item) {
    echo $item->name."\n";
    echo $item->age."\n";
}

3.12 使用队列爬取网页

use Goutte\Client;
use Symfony\Component\DomCrawler\Link;

$client = new Client();

$queue = new \SplQueue();
$queue->enqueue('http://www.example.com/');

while (!$queue->isEmpty()) {
    $url = $queue->dequeue();

    $crawler = $client->request('GET', $url);

    $crawler->filter('a')->each(function (Link $link) use ($queue) {
        $url = $link->getUri();
        if (strpos($url, 'http://www.example.com/') === 0) {
            $queue->enqueue($url);
        }
    });

    $crawler->filter('h1')->each(function ($node) {
        echo $node->text()."\n";
    });
}

3.13 处理下载文件

use Goutte\Client;

$client = new Client();

// 访问包含文件下载链接的页面
$crawler = $client->request('GET', 'http://www.example.com/files');

// 获取下载链接并下载文件
$link = $crawler->filter('a')->eq(0)->link();
$fileContent = $client->click($link)->getContent();

// 写入文件
file_put_contents('/path/to/downloaded/file', $fileContent);

3.14 获取图片链接并下载图片

use Goutte\Client;

$client = new Client();

$crawler = $client->request('GET', 'http://www.example.com/images');

// 获取图片链接并下载图片
$crawler->filter('img')->each(function ($image) use ($client) {
    $imageUrl = $image->attr('src');
    $imageContent = $client->request('GET', $imageUrl)->getContent();

    // 写入文件
    file_put_contents('/path/to/downloaded/image.jpg', $imageContent);
});

3.15. 关闭自动重定向

use Goutte\Client;

$client = new Client(['allow_redirects' => false]);

$crawler = $client->request('GET', 'http://www.example.com');

if ($client->getResponse()->getStatusCode() == 301) {
    $redirectUrl = $client->getResponse()->getHeader('location')[0];
    $crawler = $client->request('GET', $redirectUrl);
}

$crawler->filter('h1')->each(function ($node) {
    echo $node->text()."\n";
});

总结

Goutte是一款优秀的PHP爬虫框架,具有简单易用、兼容性强、灵活性高、集成度高等优点。通过以上实例,相信读者对Goutte的使用有了一定的了解,并可以在实际应用中灵活运用此框架来完成爬虫任务。

后续更多内容将收录在专栏PHP快速入门与实战中,感谢大家支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/443677.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

遇到Spring事务失效,你该怎么办?

Spring 事务场景失效是一个常见的问题。今天来分析这个问题。 1、事务方法被final、static关键字修饰,方法访问权限不是public Service public class UserService {Autowiredprivate UserDao userDao;// final修饰的事务方法Transactionalpublic final void addUse…

实时分布式低延迟OLAP数据库Apache Pinot探索实操

文章目录 概述定义特性何时使用 部署Local安装快速启动手动设置集群 Docker安装快速启动手动启动集群Docker Compose 实操批导入数据流式导入数据 概述 定义 Apache Pinot 官网地址 https://pinot.apache.org/ 最新版本0.12.1 Apache Pinot 官网文档地址 https://docs.pinot.a…

Vivado如何清理工程,并避免缺失必要的文件?

FPGA开发是一项非常复杂的工作,需要处理大量的代码、约束和仿真文件。在开发过程中,由于文件数量庞大,很容易导致工程变得混乱不堪。Vivado是Xilinx公司推出的一款FPGA开发工具,能够帮助开发人员处理这种复杂性,提高开…

【FPGA-DSP】第七期:Mcode调用

目录 1. 有限状态机设计 1.1 FSM代码编写 1.2 输入序列代码编写 1.3. mcode概念 2. Simulink 2.1. 输入部分 2.2. Mcode模块 2.3. 完整模块 总结 参考博客【R1】,参考视频资料【R2】 设计中经常用到一些控制逻辑,如有限状态机(FS…

语音特征参数MFCC提取过程详解

一、MFCC概述 在语音识别(SpeechRecognition)和话者识别(SpeakerRecognition)方面,最常用到的语音特征就是梅尔倒谱系数(Mel-scaleFrequency Cepstral Coefficients,简称MFCC)。根据…

IntelliJ IDEA全新发布v2023.1——全面增强UI体验和性能!

IntelliJ IDEA,是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的。 I…

javaSwingrsa和aes混合加密文件传输系统

RSA和AES加密混合文件传输系统 环境要求: 1、java1.8 2、socket 3、mysql 4、io流 5、swing 登录界面 客户端登录: 1.用户注册的账号保存到数据库中,用户的密码经过md5后保存到数据库中。 2.用户输入正确的账号和密码可以进入 “ …

Gulp 打包压缩 js 文件到指定目录详细流程(修改文件名与后缀)

主篇 前端 Gulp 详细介绍与案例使用。 打包 index.js 测试内容 js 包内容文件: // 测试属性 export const dzmName dzm export const dzmAge 18// 测试方法 export function dzmFunc (name, age) {return 名字:${name},年龄:${…

Chat的提问工程师,要上线了你慌不慌?

一、什么是Prompt? (1)Prompt的概念 我们在使用GPT的时候,给GPT发送的消息就是Prompt. 例如,当我们问ChatGPT"WPS是什么软件?"时: 其中,"WPS是什么软件?"这句话就是Prompt. (2)为什么要学习Prompt? Prompt是我们和GPT交流的方式,我们需要让GPT了解…

微信小程序从零开始经验贴(含详细资料及链接)

背景: 从事微信小程序开发近3年,现在几乎能独当一面,对后台程序也有一定研究。      我学习的基础是c编程经验,对前端、后端没有太多涉及。微信小程序相关资料都是自己找的,然后在项目中看别人的代码,摸着石头过河…

什么是单例模式?

文章目录 01 | 什么是单例模式?02 | 实现懒汉式饿汉式 03 | 总结 每一次实验课都要把上一节课的实验报告打印出来,交作业,这个时候的打印店总是很多人,这时候打印机就那么几台,粥少僧多的情况下,打印机怎么…

动态路由的原理与配置

一.动态路由介绍 1.动态路由选择 指路由器使用路由选择协议来获悉网络并更新路由选择表。 2.路由协议分类 3.管理距离介绍 管理距离(AD)用于判断从邻接路由器收到的路由选择信息的可信度,它是 0-255的整数,0 表示可信度最大&#…

Android9 Settings源码导入Android Studio查看并调试

Android9 Settings源码导入Android Studio查看并调试 本次调试在已编译的工程下 1. 导入packages/app/settings 不要直接导入这个模块,导入上一级app目录 在选择时选择Settings相关所有目录,如下 如下这里的sdk配置是我已经添加的,后面可…

用了这几个方法,Facebook广告转化真上去了!

随着全球电商市值的猛涨,Facebook广告的价值再次被放大。然而,在Facebook上的广告资源竞争日益激烈的情况下,即使你有最好的广告策略和投放预算,如果你的广告创意不能吸引潜在客户的注意,那么你的广告投放也可能失败。…

at单一次任务,crontab周期性任务 rhce(21)

目录 1.atd和crond两个任务管理程序的区别 2.指定在2023/08/26 09:00将时间写入testmail.txt文件中 3.指定在每天凌晨4:00将该时间点之前的系统日志信息备份到个目录下(/var/log/messages),备份后日志文件名显示格式logfileYY-MM-DD HH-MM…

08-java之io流基础

io流学习流程 说白了,本节的目的就是对 文件增删改查,先说一下学习顺序吧 定位文件 File类可以定位文件:可以进行删除文件内容,读取文件本身信息等操作,但是不能读写文件内容 字符集 想要读取文件中的数据&#xff0…

Nginx+Tomcat负载均衡、动静分离

1.Tomcat多实例部署 Tomcat的多实例部署简单的讲就是基于端口的虚拟主机设置 步骤一:安装jdk (1)关闭防火墙和selinux,防止其对安装过程的干扰 (2)将准备好的软件包拖入/opt目录下,进行安装 #某rpm包尚未…

【HCIP】BGP实验(联邦,路由反射器,手工汇总)

目录 需求: Ⅰ、IP规划 Ⅱ、配置IP与做通IGP(用的ospf) Ⅲ、开启BGP协议 Ⅳ、AS1、AS3的10...环回互相通讯 Ⅴ、对路由表进行汇总 Ⅵ、回望需求 需求: 1.AS1存在两个环回,一个地址为192.168.1.0/24该地址不能在任何协议中宣告 AS3存在两…

马斯克的Starship,除了“大”还有什么呢?

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 种种迹象表明,由ChatGPT引发的算力军备竞赛已经悄然而至了。 终于,到了检验人类最大火箭发射的时候了。 2023年4月17日,SpaceX将其大型深空火箭Starship发射升空,发射地点为Sp…

CANoe使用记录(三):CANoe发送报文设置

目录 1、概述 2、报文发送 2.1、interactive generators(交互生成器) 2.2、重命名发送报文 2.3、增加报文 2.4、触发方式 2.5、从DBC导入报文 2.6、设置信号值 1、概述 很大一部分时候,在控制零部件时候,需要发送报文到下…