PHP使用三种方法实现数据采集

目录
  • 什么叫采集?
  • PHP制作采集的技术
    • 1. 使用socket技术采集:
    • 2. 使用curl_一套函数
    • 3. 直接使用file_get_contents(最顶层的)
  • 3种方式的选择
  • 数据采集

什么叫采集?

就是使用PHP程序,把其他网站中的信息抓取到我们自己的数据库中、网站中。

PHP制作采集的技术

从底层的socket到高层的文件操作函数,一共有3种方法可以实现采集。

1. 使用socket技术采集:

socket采集是最底层的,它只是建立了一个长连接,然后我们要自己构造http协议字符串去发送请求。

例如要想获取这个页面的内容,http://tv.youku.com/?spm=a2hww.20023042.topNav.5~1~3!2~A,用socket写如下:

<?php
//连接,$error错误编号,$errstr错误的字符串,30s是连接超时时间
$fp=fsockopen("www.youku.com",80,$errno,$errstr,30);
if(!$fp) die("连接失败".$errstr);

//构造http协议字符串,因为socket编程是最底层的,它还没有使用http协议
$http="GET /?spm=a2hww.20023042.topNav.5~1~3!2~A HTTP/1.1\r\n";   //  \r\n表示前面的是一个命令
$http.="Host:www.youku.com\r\n";  //请求的主机
$http.="Connection:close\r\n\r\n";   // 连接关闭,最后一行要两个\r\n

//发送这个字符串到服务器
fwrite($fp,$http,strlen($http));
//接收服务器返回的数据
$data='';
while (!feof($fp)) {
$data.=fread($fp,4096);  //fread读取返回的数据,一次读取4096字节
}
//关闭连接
fclose($fp);
var_dump($data);
?>

打印出的结果如下,包含了返回的头信息及页面的源码:

2. 使用curl_一套函数

curl把HTTP协议都封装成了很多函数,直接传相应参数即可,降低了编写HTTP协议字符串的难度。

前提:在php.ini中要开启curl扩展。

//生成一个curl对象
$curl=curl_init();
//设置URL和相应的选项
curl_setopt($curl, CURLOPT_URL, "http://www.youku.com");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);  //将curl_exec()获取的信息以字符串返回,而不是直接输出。
//执行curl操作
$data=curl_exec($curl);
var_dump($data);

打印出的结果如下,只包含页面的源码:

3. 直接使用file_get_contents(最顶层的)

前提:在php.ini中设置允许打开一个网络的url地址。

//使用file_get_contents()
$data=file_get_contents("http://www.youku.com");
var_dump($data);

3种方式的选择

网络之间通信主要使用的是以上三种。其中后两种用的较多:如果要批量采集大量的数据时使用第二种【CURL】,性能好、稳定。

偶尔发几个请求发的频繁不密集时使用第三种。

扩展:图片的防盗链如何破?

比如7060网站上的图片做了防盗链:在他的网站中可以看到图片,把图片拿到站外就无法访问。

原理:在HTTP协议中有一个referer项,代表发这个请求的来源地址,服务器会判断如果这个请求不是这个网站发来的就会过滤掉这个请求:

解决办法:发HTTP时自己模拟referer即可:

扩展:有些要采集数据时时必须先登录,可以使用模拟的试模拟在登录状态下的采集:

a. 先用浏览登录一下,登录完,浏览器的COOKIE中就会有SESSIONID

b. 发PHP发HTTP协议时,把浏览器中的SESSIONID放到PHP的HTTP协议请求里,这样就在以登录的状态发请求。

总结:所有客户端发过来的数据都可以被模拟,所以服务器上的程序必须要必要的地方过滤客户端的数据。

什么时候用以上东西?接口开发时、采集时。

数据采集

例如我要采集这个url里的所有美国电影的信息,

http://list.youku.com/category/show/c_96_a_%E7%BE%8E%E5%9B%BD_s_1_d_1_p_3.html

则先要知道电影所在的节点的结构,我们使用firebug查看。

然后开始写代码:完整代码如下

/**
 * 发一个GET请求获取数据
 */
function get($url)
{
   global $curl;
   // 配置curl中的http协议->可配置的荐可以查PHP手册中的curl_
   curl_setopt($curl, CURLOPT_URL, $url);
   curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
   curl_setopt($curl, CURLOPT_HEADER, FALSE);
   // 执行这个请求
   return curl_exec($curl);
}

// 生成一个curl对象
$curl = curl_init();
$url='http://list.youku.com/category/show/c_96_a_%E7%BE%8E%E5%9B%BD_s_1_d_1_p_3.html';
$data=get($url);
// 匹配电影所在位置
$list_preg = '/<li class="yk-col4 mr1">.+<\/li>/Us';
// 匹配img标签上的src和alt
$img_preg = '/<img class="quic" _src="(.*)" src="(.*)" alt="(.*)" \/>/U';
//匹配电影的url
$video_preg='/<a href="(.*)" rel="external nofollow"  title="(.*)" target="(.*)"><\/a>/U';
//把所有的li存到$list里,$list是个二维数组
preg_match_all($list_preg,$data,$list);
   //var_dump($list);
foreach ($list[0] as $k => $v) {   //这里$v就是每一个li标签
/* 获取图片及电影名称
    preg_match($img_preg,$v,$img);  //把匹配到的图片的信息存到$img里
    var_dump($img);
    */
    /*获取电影地址
    preg_match($video_preg,$v,$video);  //把匹配到的电影的信息存到$video里
    var_dump($video);
*/
    preg_match($img_preg,$v,$img);
    preg_match($video_preg,$v,$video);
    echo $img[0].'<a href="'.$video[1].'" rel="external nofollow" >'.$video[2].'</a>';
}

测试:

打印$list;

打印$img

打印$video

最终效果:

如果需要把图片拷贝到硬盘上,则在foreach循环里加上以下代码:

 $imgData = get($img[1]);
    // 把图片文件写到硬盘上【下载】
    // 因为操作系统是GBK的,所以要把UTF8转成GBK
    is_dir('./youkuimg/') ? '': mkdir('./youkuimg/');
	file_put_contents('./youkuimg/'.mb_convert_encoding($img[3], 'gbk', 'utf-8').'.jpg', $imgData);

效果如下:在当前目录下的youkuimg目录下就会有下载好的图片。

以上就是PHP使用三种方法实现数据采集的详细内容,更多关于PHP使数据采集的资料请关注我们其它相关文章!

(0)

相关推荐

  • PHP使用Redis队列执行定时任务实例讲解

    Redis类: <?php namespace Utils; use Phalcon\Config\Adapter\Ini as ConfigIni; class Redis{ private static $redis1; private static $session; /** * 获取一个单例的redis对象 * @param string $name * @return \Redis */ public static function getObj($name='redis1') { t

  • PHP 对接美团大众点评团购券(门票)的开发步骤

    一.功能简要介绍 1.根据需求,用户在美团大众点评中所购买的门票在自己的系统上可以核销,同时把核销信息存储到自己的系统里. 2.美团点评API文档地址:https://open.dianping.com/document/v2?rootDocId=5000 二.开发步骤: 1.用点评管家账号登录文档,相应文档说明:https://open.dianping.com/document/v2?docId=6000136&rootDocId=1000 2 .选好自己相应的应用型,审核通过之后,就可以用

  • php微信小程序解包过程实例详解

    这个解包只能看个大概 1.找到小程序压缩包 1.1.手机root或安装模拟器(我用的是夜神) 1.2.在模拟器上安装微信(用android5系统的模拟器,低版本小程序容易打不开) 1.3.打开登陆微信后,打开小程序 1.4.打开模拟器自带的文件管理器来到目录:/data/data/com.tencent.mm/MicroMsg/{{一串32位的16进制字符串文件夹}}/appbrand/pkg/ 1.5.里面有很多wxapkg文件,找到最新修改日期的文件比如 -357038350_91.wxap

  • PHP对接阿里云虚拟号的实现(号码隐私保护)

    博主使用的fastadmin 封装框架 实现功能:AXN隐私号绑定.解绑: 场景:为店铺手机号开通虚拟号,用户联系店铺展示虚拟号码: 官方开放文档地址:https://help.aliyun.com/document_detail/59655.html?spm=a2c4g.11174283.6.661.b8365d50CKM5Ma 效果如下: 参考官网开放文档,下载SDK:解压得到 aliyun-dypls-php-sdk 文件夹: 将解压的文件夹内的 api_sdk 文件夹与 api_demo

  • php优化查询foreach代码实例讲解

    php代码优化 应避免在php foreach里面进行sql查询 以下代码示例使用了laravel的操作数据库api,eloquent orm foreach里面执行两次sql查询 // $datas 要返回的数据 foreach ($datas as $_v) { // todo 在foreach中查询了两次 **time**: 290 ms(postman) $uid = $_v->uid; $_v->user_name = User::find($uid)->username; /

  • PHP小程序后台部署运行 LNMP+WNMP的方法

    目录 一.简介: 二.环境 1.Win 2.Linux + 微擎+小程序运行调试审核发布流程 宝塔安装相关软件 一.简介: 1.微信小程序后台,通常为PHP,或者JAVA版本,以下简单说下使用LNMP(Linux+Nginx+mysql+php)与WNMP(Win+Nginx+mysql+php) 2.该博文详细介绍后台部署到小程序编码提交版本到发布版本,请看后面部分: 二.环境 1.Win 通常win操作系统使用图形化界面一键部署,通常使用集成工具XAMPP与phpstudy_pro 1.XA

  • thinkphp5redis缓存新增方法实例讲解

    找到该文件 thinkphp/library/think/cache/driver/Redis.php 进行新增方法 在这里 我就举例几个 如何添加 添加的方法查看 redis教程 /** * 返回列表中指定区间内的元素 * */ public function lrange($key,$start,$end){ return $this->handler->lrange($key,$start,$end); } /** * 在list左边新增元素 * */ public function l

  • PHP引擎php.ini参数优化深入讲解

    PHP引擎php.ini参数优化 无论是apache还是nginx,php.ini都是适合的.而php-fpm.conf适合nginx+fcgi的配置 首先选择产品环境的php.ini(php.ini-production) /home/oldboy/tools/php-5.3.27/php.ini-development /home/oldboy/tools/php-5.3.27/php.ini-production 1.打开php的安全模式 php的安全模式是个非常重要的php内嵌的安全机制

  • 深入php数据采集的详解

    这里介绍两个php采集能用到的好工具.一个是Snoopy,一个是simple_html_dom.采集还有很多方式(其实本质就2-3种,其他的都是衍生的),php自带了几个方法也能直接进行采集.但是,出于把懒惰进行到底的精神.我们还是可以通过这两个工具,让采集变得更简单. 网上有不少介绍Snoopy的,下面是别人翻译的Snoopy的SDK//////////////////////////////////////////////////////////////Snoopy是一个php类,用来模拟浏

  • php7中停止php-fpm服务的方法详解

    在PHP生命周期的各个阶段,一些与服务相关的操作都是通过SAPI接口实现. 各个服务器抽象层之间遵守着相同的约定,这里我们称之为SAPI接口. 在PHP的源码中,当需要调用服务器相关信息时,全部通过SAPI接口中对应的方法调用实现 php-fpm + nginx php + terminal ... PHP常见的四种运行模式 SAPI(Server Application Programming Interface)服务器应用程序编程接口,即PHP与其他应用交互的接口. 每个SAPI实现都是一个

  • 为PHP模块添加SQL SERVER2012数据库的步骤详解

    目录 一.系统要求 二.下载驱动 2.1下载 Microsoft Drivers for PHP for SQL Server 2.2 下载 ODBC Driver for SQL Server 三.配置PHP模块与php.ini文件 3.1从下图可以看到ODBC驱动程序11和13已经不在支持PHP5.9以上的版本,如果你下载的PHP模块是5.9以上的建议下载ODBC17以上的版本 3.2 PHP版本有线程安全问题如果你是用IIS要用线程安全否如果是APACHE版本用线程安全版本 3.3 将下载

  • 利用ajax+php实现商品价格计算

    本文实例为大家分享了商品价格计算的具体代码,利用ajax和php实现以下页面 index.php <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>商品价格计算</title> <style type="text/css"> table { border-collapse: collapse; } tr { t

  • PHP如何限制定时任务的进程数量

    前言 现在的工作中,经常要写一些脚本做一些异步的操作. 一般是大量的数据修改,或者解决部分并发问题. 为了能够稳定的做好数据处理,一般情况下会用定时脚本的方式. 那么问题来了. 可能存在的问题 当我们处理大量数据的时候,脚本的执行时间可能很长,或者重复处理某条数据(写错的情况下). 为了避免数据的重复处理.运行脚本过多导致服务器压力过大等问题,我们需要限制脚本的运行数量. 如何做 思路一 查询某种标识的进程数量,如果超过一定数量,则直接退出,不处理. 思路二 记录每次的PID,可以使用 文件.r

随机推荐