php curl 自定义get方法抓取网页

假设我们使用get方法请求一个网页,得到网页内容后可以匹配出对应的内容。

我们可以使用curl封装一个函数,假设函数名就为get。传入url就能请求指定的网页,将指定网页的HTML代码返回回来。代码如下:

function get($url) {
    //初使化curl
    $ch = curl_init();
    //请求的url,由形参传入
    curl_setopt($ch, CURLOPT_URL, $url);
    //将得到的数据返回
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    //不处理头信息
    curl_setopt($ch, CURLOPT_HEADER, 0);
    //连接超过10秒超时
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    //执行curl
    $output = curl_exec($ch);
    //关闭资源
    curl_close($ch);
    //返回内容
    return $output;
}

我们现在使用我们所写的get方法,请求网易的一个列表,将标题和url抓取出来。

我们可以先用get方法中传入一个URL。得到这个网址所对应网页的html。

网址为新媒体观察网的新闻列表页:http://www.xmtnews.com/events 。

将红色区域采集下来:

1.png

一、得到采红色区间的html 

这个区间从下面的HTML代码开始:

<section class="ov">

在以下代码结束:

<div class="hr-10"></div>

使用preg_match写一个正则表达示就匹配就得到了红色区间的HTML。将匹配到的HTML赋值给变量$area。

匹配的正则表达示如下:

<section class="ov">(.*?)<div class="hr-10"><\/div>/mis'

二、在红色区域匹配标题和标题的URL

我们发现所有的标题都在<h3>标签里面。我们使用preg_match_all写一个正则表达示。

preg_match_all('/<h3><a href="(.*?)" title=".*?" class="headers" target="_blank">(.*?)<\/a><\/h3>/mis', $area, $find);

将url和内容匹配出来的内容放置到$find中,将$find数组,打印出来就可以看到匹配的结果了。

如果需要,也可以循环读取显示每一行标题和每一行URL。

全部代码演示如下:

<?php

$content = get('http://www.xmtnews.com/events');

preg_match('/<section class="ov">(.*?)<div class="hr-10"><\/div>/mis', $content, $match);

//将正则匹配到的内容赋值给$area
$area = $match[1];

preg_match_all('/<h3><a href="(.*?)" title=".*?" class="headers" target="_blank">(.*?)<\/a><\/h3>/', $area, $find);


var_dump($find);

function get($url) {

   //初使化curl
   $ch = curl_init();

   //请求的url,由形参传入
   curl_setopt($ch, CURLOPT_URL, $url);

   //将得到的数据返回
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

   //不处理头信息
   curl_setopt($ch, CURLOPT_HEADER, 0);

   //连接超过10秒超时
   curl_setopt($ch, CURLOPT_TIMEOUT, 10);

   //执行curl
   $output = curl_exec($ch);

   //关闭资源
   curl_close($ch);

   //返回内容
   return $output;
}
?>


继续学习
||
<?php $content = get('http://www.xmtnews.com/events'); preg_match('/<section class="ov">(.*?)<div class="hr-10"><\/div>/mis', $content, $match); //将正则匹配到的内容赋值给$area $area = $match[1]; preg_match_all('/<h3><a href="(.*?)" title=".*?" class="headers" target="_blank">(.*?)<\/a><\/h3>/', $area, $find); var_dump($find); function get($url) { //初使化curl $ch = curl_init(); //请求的url,由形参传入 curl_setopt($ch, CURLOPT_URL, $url); //将得到的数据返回 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //不处理头信息 curl_setopt($ch, CURLOPT_HEADER, 0); //连接超过10秒超时 curl_setopt($ch, CURLOPT_TIMEOUT, 10); //执行curl $output = curl_exec($ch); //关闭资源 curl_close($ch); //返回内容 return $output; } ?>
提交重置代码
章节
笔记
提问
课件
反馈
捐赠

php入门教程之一周学会PHP

高并发千万级数据库系统解决方案
  • 推荐课程
  • 评论
  • 问答
  • 笔记
  • 课件下载

金华郭德纲

请问在第一个正则的定界符后面为什么要加mis?急急急!

5年前    添加回复 2

移动用户-9942965

这套课程真的不错,重点内容讲的很透彻,而且强调的次数也够,几乎上下来就能记住重点,不用在复习太多

移动用户-9942965 · 2021-10-25 17:24
移动用户-9942965

讲的很透彻

移动用户-9942965 · 2021-10-25 17:27
移动用户-9942965

课程讲的清晰,语速和缓.

移动用户-9942965 · 2021-10-26 14:15

金华郭德纲

大家这段代码不要用ie浏览器来看那个网页的html代码,ie的html和chrome的不一样的

5年前    添加回复 2

wolf

在浏览器中汉字乱码解决办法,header('content-type:text/html;charset=utf-8');复制到<? php后面.即<? php header('content-type:text/html;charset=utf-8');

5年前    添加回复 2

移动用户-9942965

不错,讲的很透彻

移动用户-9942965 · 2021-10-25 17:20
测试_silence

不想你的年代

测试_silence · 2021-11-18 14:18

金华郭德纲

为什么我用edge打开的f12里面的html代码和这段里面正则表达式表达的不一样啊?

5年前    添加回复 1

y的小公举

自学的困难只有自己知道,如何让学习不再困难让学习提高效率

5年前    添加回复 1

风的季节

mmpmmp

6年前    添加回复 0

/mis是什么意思

[最新 猪哥 的回答] 正则表达式的修饰符

时间:6年前

课件暂不提供下载,工作人员正在整理中,后期请多关注该课程~