php抓取网页匹配url(PHP在线测试通过的正则匹配解决方法及解决步骤(一))

优采云 发布时间: 2021-11-17 15:05

  php抓取网页匹配url(PHP在线测试通过的正则匹配解决方法及解决步骤(一))

  原意

  最近在学习爬虫的时候遇到了一个小问题。抓取某些网页时,通过在线测试的正则匹配,用PHP抓取,但发现只能抓取某些非关键元素。

  经过排查,发现在抓取页面时(是电商页面),页面的详情页是通过JS的第二次请求动态添加的,而PHP(通过curl函数库)只是添加了它的静态页面抓取它,所以正则匹配的不是整个渲染的完整页面,而是隐藏细节的页面。

  解决方案

  粗略涉足其中,一般行业有两种解决方案:

  解析JS文件,在JS中模拟请求运行JS,在JS运行渲染后抓取页面(本文介绍的方法)phantomjs

  

  

  phantomjs基于WebKit,开源服务器端JavaScript API,phantomjs,使用WebKit核心,可以模拟浏览器运行网页,可以简单理解为除了显示访问过的页面。

  此外,它具有其他浏览器的所有功能(DOM 处理、CSS 选择器、JSON、Canvas 和 SVG),因此您可以使用它来运行收录 JS 文件且需要运行的 html 页面。当然,它的用处肯定不止这些,网页测试、页面截图、网络监控等等(详见官网文档)。

  解决步骤 Step.1 下载(编译)phantomjs文件

  有两种方式:

  1. 直接从官网下载对应系统编译的可执行文件,解压后移动到bin目录下。

  2. 从官方Github下载源码,编译成可执行文件。

  下面给大家介绍一个比较通用的方法一:

  如图,到官网下载你的服务器系统对应的版本,

  

  

  以CentOS为例,下载Linux 64位版本(32/64区分好)

  curl -O https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2

  解压缩文件

  tar xvf phantomjs-2.1.1-linux-x86_64.tar.bz2

  将文件移动到bin目录

  cp phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/bin

  至此,phantomjs的安装过程已经完成,不过最好测试一下是否可以运行成功。

  随便写个测试js文件,运行看看是否成功

  phantomjs helloworld.js

  如果不成功,请在运行前按照提示安装缺少的库。

  如果还是不行,可以尝试第二种用法,获取phantomjs文件。

  Step.2 通过PHP调用phantomjs

  正常情况下,我们应该使用PHP获取对应页面的URL,然后使用phantomjs获取返回的内容,然后对其进行正则匹配(代替原来的curl操作)。

  在Github上发现有朋友封装了一个基于PHP-phantomjs的包,并且写了一个非常完善的文档,并赠送了一个Star给他。

  

  

  由于文档是英文的,我简单介绍一下关键步骤

  1) 通过 Composer 安装

  composer require "jonnyw/php-phantomjs:4.*"

  2) 初始化 JonnyW\PhantomJs\Client 类

  $client = Client::getInstance();

//这一步非常重要,务必跟服务器的phantomjs文件路径一致

$client->getEngine()->setPath('/usr/local/bin/phantomjs');

  3) 简单易用

  $request = $client->getMessageFactory()->createRequest();

$response = $client->getMessageFactory()->createResponse();

//设置请求方法

$request->setMethod('GET');

//设置请求连接

$request->setUrl($link);

//发送请求获取响应

$client->send($request, $response);

if($response->getStatus() === 200) {

//输出抓取内容

echo $response->getContent();

//获取内容后的处理

}

  4) 如何加载完整的JS

  $client = Client::getInstance();

$client->isLazy(); // 让客户端等待所有资源加载完毕

$request = $client->getMessageFactory()->createRequest();

$request->setTimeout(5000); // 设置超时时间(超过这个时间停止加载并渲染输出画面)

......

  总结

  最近在看《数学之美》时,吴军博士在“图论与网络爬虫”一章中提到,如今的网页很多都是用Javascript生成的。当面对这些网页时,网络爬虫需要模拟浏览器来运行。

  看完这一章我也对这一点印象深刻,这次遇到了类似的问题,就往这个方向去解决了。希望能给大家带来一点帮助和启发。

  联络我

  如果有任何错误或建议或如果您需要询问有关此主题的相关问题

  欢迎留言与我交流讨论!

  电子邮件:

  & 我的博客:ROVERVAN

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线