网站首页 > 教程分享 正文
什么是网页抓取?
你是否曾经需要从一个没有提供 API 的站点获取信息? 我们可以通过网页抓取,然后从目标网站的 HTML 中获得我们想要的信息,进而解决这个问题。 当然,我们也可以手动提取这些信息, 但手动操作很乏味。 所以, 通过爬虫来自动化来完成这个过程会更有效率。
在这个教程中我们会从 Pexels 抓取一些猫的图片。这个网站提供高质量且免费的素材图片。他们提供了API, 但这些 API 有 200次/小时 的请求频率限制。
发起并发请求
在网页抓取中使用异步 PHP (相比使用同步方式)的最大好处是可以在更短的时间内完成更多的工作。使用异步 PHP 使得我们可以立刻请求尽可能多的网页而不是每次只能请求单个网页并等待结果返回。 因此,一旦请求结果返回我们就可以开始处理。
首先,我们从 GitHub 上拉取一个叫做 buzz-react 的异步 HTTP 客户端的代码 -- 它是一个基于 ReactPHP 的简单、致力于并发处理大量 HTTP 请求的异步 HTTP 客户端:
composer require clue/buzz-react
这里用到了composer这个神器,不了解的同学可以私信回复“composer”自助获取相关资料。
现在, 我们就可以请求 pexels 上的图片页面 了:
我们创建了 Clue\React\Buzz\Browser 的实例, 把它作为 HTTP client 使用。上面的代码发起了一个异步的 GET 请求来获取网页内容(包含一张小猫们的图片)。 $client->get($url) 方法返回了一个包含 PSR-7 response 的 promise 对象。
客户端是异步工作的,这意味着我们可以很容易地请求几个页面,然后这些请求会被同步执行:
这里的代码含义如下:
- 发起一个请求
- 获取响应
- 添加响应的处理程序
- 当响应解析完毕就处理响应
所以,这个逻辑可以提取到一个类里,这样我们可以很容易地请求多个 URL 并添加相同的响应处理程序。让我们基于Browser创建一个包装器。
用下面的代码创建一个名为Scraper的类:
我们把Browser作为依赖项注入到构造函数并提供一个公共方法scrape(array $urls)。接着对每个指定的 URL 发起一个GET请求。当响应完成时,我们调用一个私有方法processResponse(string $html)。这个方法负责遍历 HTML 代码并下载图片。下一步是审查收到的 HTML 代码,然后从里面提取图片。
小编建议PHP版本最好在7.0以上,在实践过程中遇到问题的可以私信小编哦~~把你们的D盘,E盘,F盘都装满吧!!
猜你喜欢
- 2024-09-11 VSCode快速入门(快捷键,个性化配置,实用插件)
- 2024-09-11 如何下载理财投资工具及安装「Moneydance mac」
- 2024-09-11 利用一行代码下载网页视频(怎么用代码下载网页视频)
- 2024-09-11 DecSoft HTML Compiler 2022(html编译工具)v2023.9(x64)特别版
- 2024-09-11 视频下载|利用浏览器插件或视频嗅探工具、网站页面
- 2024-09-11 Mathematica 12.3中文版软件下载及安装教程
- 2024-09-11 linux wget 命令小白教学,做一个有技术范的下载狂魔
- 2024-09-11 Python爬虫实战:利用scrapy,短短50行代码下载整站短视频
- 2024-09-11 solidworks2022软件下载与安装教程
- 2024-09-11 Adobe Character Animator 2018 安装教程(附安装包下载)
你 发表评论:
欢迎- 最近发表
-
- 有了这份900多页的Android面试指南,你离大厂Offer还远吗?
- K2 Blackpearl 流程平台总体功能介绍:常规流程功能
- 零基础安卓开发起步(一)(安卓开发入门视频)
- 教程:让你的安卓像Windows一样实现程序窗口化运行
- Android事件总线还能怎么玩?(事件总线有什么好处)
- Android 面试被问“谈谈架构”,到底要怎样回答才好?
- Android开发工具Parcel和Serialize
- Android 中Notification的运用(notification widget安卓)
- Android退出所有Activity最优雅的方式
- MT管理器-简单实战-去除启动页(mt管理器怎么去除软件弹窗)
- 标签列表
-
- css导航条 (66)
- sqlinsert (63)
- js提交表单 (60)
- param (62)
- parentelement (65)
- jquery分享 (62)
- check约束 (64)
- curl_init (68)
- sql if语句 (69)
- import (66)
- chmod文件夹 (71)
- clearinterval (71)
- pythonrange (62)
- 数组长度 (61)
- javafx (59)
- 全局消息钩子 (64)
- sort排序 (62)
- jdbc (69)
- php网页源码 (59)
- assert h (69)
- httpclientjar (60)
- postgresql conf (59)
- winform开发 (59)
- mysql数字类型 (71)
- drawimage (61)
本文暂时没有评论,来添加一个吧(●'◡'●)