首页 > 编程技术 > php

php file_get_contents数据采集与常用见问题解决

发布时间:2016-11-25 17:08

在批量的数据采集在php中很少会使用file_get_contents函数来操作,但是如果是小量的我们可以使用file_get_contents函数操作,因为它不但好用而且简单易学,下面我来介绍file_get_contents用法与使用过程中的问题解决办法。

先来看问题

file_get_contents不能获取带端口的网址

例如:

 代码如下 复制代码
file_get_contents('http://localhost:12345');

没有任何获取。

解决方法是 :关闭selinux

1 永久方法 – 需要重启服务器

修改/etc/selinux/config文件中设置SELINUX=disabled ,然后重启服务器。

2 临时方法 – 设置系统参数

使用命令setenforce 0

附:
setenforce 1 设置SELinux 成为enforcing模式
setenforce 0 设置SELinux 成为permissive模式


file_get_contents超时

 代码如下 复制代码

function _file_get_contents($url)
{
  $context = stream_context_create(array(
     'http' => array(
      'timeout' => 180 //超时时间,单位为秒
     )
  ));  
  return @file_get_contents($url, 0, $context);

}

好了上面的问题得到解决之后我们可以开始采集了。

 

 代码如下 复制代码
<?php
//全国,判断条件是$REQUEST_URI是否含有html
if (!strpos($_SERVER["REQUEST_URI"],".html"))
{
$page="http://qq.ip138.com/weather/";
$html = file_get_contents($page,'r');
$pattern="/<B>全国主要城市、县当天和未来五天天气趋势预报在线查询</B>(.*?)<center style="padding:3px">/si";
//正则匹配之间的html
preg_match($pattern,$html,$pg);
echo "";
//正则替换远程地址为本地地址
$p=preg_replace('//weather/(w+)/index.htm/', 'tq.php/$1.html', $pg[1]);
echo $p;
}
//省,判断条件是$REQUEST_URI是否含有?
else if(!strpos($_SERVER["REQUEST_URI"],"?")){
//yoyo推荐的使用分割获得数据,这里是获得省份名称
$province=explode("/",$_SERVER["REQUEST_URI"]);
$province=explode(".",$province[count($province)-1]);
$province=$province[0];
//被注释掉的是我自己写出来的正则,感觉写的不好,但效果等同上面
//preg_match('/[^/]+[.(html)]$/',$_SERVER["REQUEST_URI"],$pro);
//$province=preg_replace('/.html/','',$pro[0]);
$page="http://qq.ip138.com/weather/".$province."/index.htm";
//获取html数据之前先尝试打开页面,防止恶意输入地址导致出错
if (!@fopen($page, "r")) {
die("对不起,该地址不存在!<a href=javascript:history.back(1)>点击这里返回</a>");
exit(0);
}
$html = file_get_contents($page,'r');
$pattern="/五天天气趋势预报</B>(.*?)请输入输入市/si";
preg_match($pattern,$html,$pg);
echo "";
//正则替换,获取省份,城市
$p=preg_replace('//weather/(w+)/(w+).htm/', '$2.html?pro=$1', $pg[1]);
echo $p;
}
else {
//市,通过get传递省份
$pro=$_REQUEST['pro'];
$city=explode("/",$_SERVER["REQUEST_URI"]);
$city=explode(".",$city[count($city)-1]);
$city=$city[0];
//preg_match('/[^/]+[.(html)]+[?]/',$_SERVER["REQUEST_URI"],$cit);
//$city=preg_replace('/.html?/','',$cit[0]);
$page="http://qq.ip138.com/weather/".$pro."/".$city.".htm";
if (!@fopen($page, "r")) {
die("对不起,该地址不存在!<a href=javascript:history.back(1)>点击这里返回</a>");
exit(0);
}
$html = file_get_contents($page,'r');
$pattern="/五天天气趋势预报</B>(.*?)请输入输入市/si";
preg_match($pattern,$html,$pg);
echo "";
//获取真实的图片地址
$p=preg_replace('//image//', 'http://qq.ip138.com/image/', $pg[1]);
echo $p;
}
?>

如果上面办法无法采集到数据我们可以使用来处理

 

 代码如下 复制代码
<?php
$url = "http://www.111cn.net ";
$ch = curl_init();
$timeout = 5;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
//在需要用户检测的网页里需要增加下面两行
//curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
//curl_setopt($ch, CURLOPT_USERPWD, US_NAME.":".US_PWD);
$contents = curl_exec($ch);
curl_close($ch);
echo $contents;
?>
本文章来给各位php 初学者介绍一篇关于php中全局变量session会话的基本使用方法,有需要了解的朋友可进入参考参考。

Session是什么

Session是指有始有终的一系列动作或信息,比如去看电影从进入影院到走出影院的整个过程可以称为一个Session。Cookie将数据存储在客户端计算机上,而Session将不定量的变量存储在服务器端。

每一个用户链接网站服务器后便会产生一个Session,所以首先要告诉服务器使用Session功能来存储数据。启用Session功能的方式有两种:

1、使用session_start()函数启动会话,其结构形式如下:

session_start()
函数不能带参数,其返回值为布尔型。

2、在php.ini中设置参数 session.auto_start,将此参数设为1,即当有连接到服务器后Session功能将自动启用。

启动Session后,在使用Session变量之前首先要注册变量,之后才能使用,反之不使用某个变量时就要取消注册。Session_register(变量名)可以注册一个Session变量;Session_unregister(变量名)可以取消注册一个Session变量,例如:

 代码如下 复制代码

session_start(); /* 启动session变量 */
session_register('user') /* 注册user变量 */
session_unregister('user') /* 注销user变量 */

调用session变量

php session使用方法:用函数$_SESSION[]可以创建一个函数变量,其格式如下:

 代码如下 复制代码

$_SESSION['$string']=$str;

参数$string是要定义的变量名,$str是变量值。在调用时使用$_SESSION[$string]的格式。

实例:

 代码如下 复制代码

<?php
 session_start();
 $_SESSION['name']="Jane";
 $_SESSION['password']="888888";
 echo "用户名是: " .$_SESSION['name'] ."<br>";
 echo "密码是: " .$_SESSION['password'] ."<br>";
?>

session的使用

本站前面介绍了session的一些概念以及基本操作,这里通过实例介绍php session使用的方法。

实例代码:

 代码如下 复制代码

<?php
 session_start(); /* 启动session */
 $_SESSION['name']="LIMing";
 $_SESSION['password']="888888";
 $_SESSION['time']=time();
 echo "<a href='session.php' target='_blank'>传递session</a><br />"
?>

session.php代码:

 代码如下 复制代码
<?php
 session_start();
 echo "用户名是:" .$_COOKIE['name'] ."<br>";
 echo "密码是:" .$_SESSION['password'] ."<br>";
 echo "访问时间是:" .date('Y m d H:i:s', $_SESSION['time']) ."<br>";
?>

 

获取session_id的值

每一个session都有会被指定一个特定的id,用session_id来标识。我们可以通过session_id()函数查看当前session_id的值,其结构形式如下:

session_id()

实例:

 代码如下 复制代码

<?php
 session_start(); /* 启动session */
 $id=session_id(); /* 获取当前session_id */
 echo "当前sessionID是: " .$id;
?>

cookie与session的区别

session和cookie都是重要的会话管理应用,在许多的php开发项目都会用到。它们的作用是能够给不同的用户创建不同的值,从而让不同的用户返回的结果都不相同。

那么session cookie区别在哪里呢?

cookie是利用客户端来创建,当用户用浏览器打开网站时就会给用户创建一个cookie,这个过程是由用户的电脑执行的,网站的服务器只是发送一些指令。因此如果用户禁止了cookie功能,则无法利用cookie来实现相关功能。

session则是利用服务端来创建,整个过程都由服务器来执行,用户无权干预。

在运用时,如果你希望节约服务器的资源,可以选用cookie来进行会话管理;如果你希望所有的浏览者都能使用会话管理,则应该选用session。

静态页面中看上去好你是不能直接调用php文件了,但是有可以使用js调用方式来调用php文件,当然还可以使用ajax 调用php文件哦,下面我来给大家介绍

举一个简单的例子来说明:
 
如在页面a.html中用下面这句调用,可以将action=test的参数传递到b.php。

Javascript代码

 代码如下 复制代码

<script type="text/javascript"" width=100% src="b.php?action=test"></script> 

在b.php中有这样一段PHP代码:

PHP代码

 代码如下 复制代码

<? $action=$_GET['action'];   
echo "document.write('".$action."');n";  
?> 

当执行a.html文件时,就会调用b.php文件,并将b.php文件的输出作为JS语句来执行,内容为JS传递的参数action的值,也就是在PHP文件中接受过来的action的值.


jquery的load函数是请求另一个文件并加载到当前DOM里的调用


1、加载一个php文件,该php文件不含传递参数

 代码如下 复制代码
$("#myID").load("test.php");

2、加载一个php文件,该php文件含有一个传递参数

 代码如下 复制代码
$("#myID").load("test.php",{"name" : "Adam"});

 
3. 加载一个php文件,该php文件含有多个传递参数。注:参数间用逗号分隔

 代码如下 复制代码
$("#myID").load("test.php",{"name" : "Adam" ,"site":www.111cn.net});
//导入的php文件含有一个传递参数,类似于:test.php?name=Adam&site=www.111cn.net

 

4. 加载一个php文件,该php文件以数组作为传递参数

 代码如下 复制代码

$("#myID").load("test.php",{‘myinfo[]‘, ["Adam", www.111cn.net});
//导入的php文件含有一个数组传递参数。

在php中数组分类很多种,如一维数组,二维数组,三维或多维数组,下面我来给大家介绍php 遍历多维数组,有需要的朋友可参考。

在php遍历数组有三个函数foreach、each、list & each下面我们看它们是如何遍历多维数组的。

先看一个遍历二维数组

 代码如下 复制代码

<?php 
$sports = array( 
    'football' => 'good', 
    'swimming' => 'very well', 
    'running'  => 'not good' 
    ); 
     
foreach ($sports as $key => $value) { 
    echo $key.": ".$value."<br />"; 

?>

下面看遍历三维数组

例1

 代码如下 复制代码

 function arr_fun($arr){
       if(is_array($arr)){
         foreach($arr as $v){
            if(is_array($v)){
            arr_fun($v);
            }else{
            echo $v."<br>";
            }
         }
       }else{
         echo $arr."<br>";
       }
   }

例2

 代码如下 复制代码

<?php
/*
*  -------------------------------------------------
*   Url    : www.111cn.net
*   Date   : 2011-03-09
*  -------------------------------------------------
*/
function arr_foreach ($arr)
{
 if (!is_array ($arr))
 {
  return false;
 }
 
 foreach ($arr as $key => $val )
 {
  if (is_array ($val))
  {
   arr_foreach ($val);
  }
  else
  {
   echo $val.'<br/>';
  }
 }
}
$arr1 = array (1=>array(11,12,13,14=>array(141,142)),2,3,4,5);
echo '<pre>';
print_r($arr1);
echo '<pre>';
arr_foreach ($arr1);
?>

输出结果

Array
(
    [1] => Array
        (
            [0] => 11
            [1] => 12
            [2] => 13
            [14] => Array
                (
                    [0] => 141
                    [1] => 142
                )
        )
    [2] => 2
    [3] => 3
    [4] => 4
    [5] => 5
)
11
12
13
141
142
2
3
4
5

利用list与each遍历二维数组

 代码如下 复制代码

<?php
$sports = array(
    'football' => 'good',
    'swimming' => 'www.111cn.net',
    'running'  => 'not good'
);

while (list($key, $value) = each($sports)) {
    echo $key.": ".$value."<br />";
}
?>

在php中要利用正则来匹配中文汉字的话我们需要了解字符串编码然后还有汉字的内码这样才可以方便快速的实现精确的匹配中文汉字出来,下面我来给大家介绍介绍。


在php中来判断字符串是否为中文,就会沿袭这个思路:

 代码如下 复制代码
<?php
$str = "php编程";
if (preg_match("/^[u4e00-u9fa5]+$/",$str)) {
print("该字符串全部是中文");
} else {
print("该字符串不全部是中文");
}
?>

不过,很快就会发现,php并不支持这样的表达,报错:
Warning: preg_match() [function.preg-match]: Compilation failed: PCRE does not support L, l, N, U,

or u at offset 3 in test.php on line 3

刚开始从google上查了很多次,想从php正则表达式对于十六进制数据的

表达方式上进行突破,发现在php中,是用x表示十六进制数据的。于是,

变换成如下的代码:

 代码如下 复制代码
$str = "php编程";
if (preg_match("/^[x4e00-x9fa5]+$/",$str)) {
print("该字符串全部是中文");
} else {
print("该字符串不全部是中文");
}

貌似不报错了,判断的结果也正确,不过把$str换成“编程”两字,结果却还是显示“该字符串不全部是中文”,看

来这样的判断还是不够准确。


如果要精准匹配中文,即匹配纯中文字符,或匹配中文字符加上全角标点,则需要根据不同编码环境使用不同方法。

下面以两种常用的编码(gb2312,utf-8)

下面给两个例子:

 代码如下 复制代码

(1)     ANSI编程环境下:

$strtest = “yyg中文字符yyg”;

$pregstr = "/([".chr(0xb0)."-".chr(0xf7)."][".chr(0xa1)."-".chr(0xfe)."])+/i";

if(preg_match($pregstr,$strtest,$matchArray)){

echo $matchArray[0];

}

//output:中文字符

(2)     Utf-8编程环境下:

$strtest = “yyg中文字符yyg”;

$pregstr = "/[x{4e00}-x{9fa5}]+/u";

if(preg_match($pregstr,$strtest,$matchArray)){

echo $matchArray[0];

}

//output:中文字符

标签:[!--infotagslink--]

您可能感兴趣的文章: