php访问url

117 阅读4分钟

访问网页获取数据

curl的使用步骤

我们将curl的步骤分为以下7步:

  1. 初使化curl资源
  2. 参数设置请求的协议地址
  3. 参数设置是否返回请求结果
  4. 设置发送数据(无发送数据可不设置)
  5. 其他的参数信息设置(按实际工作需要决定)
  6. 执行或执行得到返回结果
  7. 关闭curl资源

我们为了更好的让大家学习和入门,将第2步至第5步本应该归为一步的插成了4个步骤。

第二步至第五步本质上,应该统成为curl参数设置。

所有curl设置参数设置都是通过curl_setopt都完成

####curl_setopt这一步最为重要,一切玄妙均在此。

curl_setopt这一步完成了包括连接、参数和一切请求的细节设置。要一次性全部看完并理解可能比较困难,所以我们只试一下那些更常用也更有用的选项。

我们为了更好的入门。并且在php中我们用的最多的是http请求。因此,我们将一些不需要大家使用到的全部不作讲解。

如果感兴趣的朋友可以参考curl_setopt中复杂的参数设置。

地址如下:qqpc.939338.com

###一、初使化curl资源

这只有一句话,就是使用的是curl_init函数。这个参数法面要传入任何参数。返回curl的操作资源。

因为,我们在后面是通过curl_setopt向curl的操作资源变量压入数据的。

例:

$ch = curl_init();

###二、参数设置请求的协议地址

curl_setopt函数的详细使用如下:

类型说明
函数curl_setopt
参数1curl资源变量
参数2curl参数选项
参数3curl参数值

CURLOPT_URL 这个参数选项规定了请求的url地址。

curl_setopt($ch, CURLOPT_URL, "http://qqpc.939338.com");

###三、参数设置是否返回请求结果

我们希望curl请求后返回对应的结果。我们要得到对应的结果,也需要设置一个参数,这个参数名为:CURLOPT_RETURNTRANSFER。

若需要返回值即为1。不需请求后返回的结果可设置为0。

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

###四、设置发送数据

如果是get请求,我们不需要设置发送的参数。在post等请求的时候,我们需要设置发送方法为post方法。并设置发送的数据。

CURLOPT_POST 值设为1是使用POST方法,0为不使用POST方法

CURLOPT_POSTFIELDS设置传递的数据

//声明使用POST方式来进行发送
    curl_setopt($ch, CURLOPT_POST, 1);
​
//发送什么数据呢
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

###五、其他的参数信息设置

如果是https,有的时候我们需要忽略https的安全证书。

CURLOPT_SSL_VERIFYPEER和CURLOPT_SSL_VERIFYHOST 两个参数改为false即忽略了证书。

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

CURLOPT_HEADER这个参数又决定是是否处理http的头信息,我们不想接收处理的话可将这个值设置为0。

curl_setopt($ch, CURLOPT_HEADER, 0);

此外,我们还可以设置请求的超时时间,参数为:CURLOPT_TIMEOUT。

curl_setopt($ch, CURLOPT_TIMEOUT, 10);

其他参数非常多,我们在之前讲过,如果你想了解更多的内容可以访问: 地址如下:php.net/manual/zh/f…

###六、执行或执行得到返回结果

我们第三步中,将CURLOPT_RETURNTRANSFER 参数中将值设为1。如果执行的结果有数据。使用curl_exec执行后,会将结果返回给$output变量。

$output = curl_exec($ch);

###七、关闭curl资源

关闭curl资源。因为资源类型,我们反复强调过,有打开就有关闭。

如果不需要使用,使用curl_close关闭后立刻释放内存。

curl_close($ch);

只可访问http协议

只可访问http协议

<?php$url="http://xxxxx";
​
$ch = curl_init();
​
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$html = curl_exec($ch);
curl_close($ch);
​
// echo strip_tags($html);
$pattern='/正则表达式代码/';
$num=preg_match_all($pattern, $html, $cid,PREG_PATTERN_ORDER);
​
if (sizeof($cid[0])>=1) {
    for ($i=0; $i <sizeof($cid[0]) ; $i++) { 
        echo $cid[0][$i];
    }
​
}

可访问获取https协议

可访问获取https协议

<?php
header('Content-Type:text/html; charset=gb2312');
$url="https://www.hkshu.com/l4_1/";
​
$ch = curl_init();
​
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$html = curl_exec($ch);
curl_close($ch);
​
// echo strip_tags($html);
$pattern='/title="(.*?)">(.*?)</a><i>/';
​
$num=preg_match_all($pattern, $html, $cid,PREG_PATTERN_ORDER);
var_dump($cid);
​

自定义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。

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

将红色区域采集下来: img

一、得到彩红色区间的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中,将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;
}

使用post发送数据

如果我们是要发送POST数据怎么办?又需要使用curl帮我们来发送数据。

按照步骤我们自定义了一个函数,函数名为:post。post这个方法中需要传入两个参数:

  1. 请求的URL地址
  2. 发送的数据

发送的数据全为数组,以键值对的形式用POST方法发送给指定的接口地址即可。

我们只需要把《15.1 curl的使用步骤组合一下》就可以完成对应的代码。

在开发微信公众号创建自定义菜单的时候就需要使用到POST方法向微信的自定义菜单接口发送自定义菜单数据。

post的自定义函数,全部代码如下:

function post($url, $data) {   
    //初使化init方法
    $ch = curl_init();
    //指定URL
    curl_setopt($ch, CURLOPT_URL, $url);
    //设定请求后返回结果
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    //声明使用POST方式来进行发送
    curl_setopt($ch, CURLOPT_POST, 1);
    //发送什么数据呢
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    //忽略证书
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    //忽略header头信息
    curl_setopt($ch, CURLOPT_HEADER, 0);
    //设置超时时间
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    //发送请求
    $output = curl_exec($ch);
    //关闭curl
    curl_close($ch);
    //返回数据
    return $output;
}

以后在调用微信公众平台或者其他第三方API系统。它们需要使用POST方法要求你发送数据的时候。 你需要使用POST来发送数据的时候,只需要调一下这个post方法就可以了。