dtcms wordpress Quartz VBA 莱斯分布 javascript ajax bash canvas build layer flowjs vue教程入门 bootstrap管理模板 支付网站建设 传智播客python vue教学视频 网络营销视频教程 ps视频教程全集完整版 php抽奖源码 git下载代码到本地命令 bootstrap单选按钮 jquery validate python学习 python练习 python实例 destoon python正则表达式语法 java日期 java初级入门教程 java获取ip地址 html实例教程 typemonkey 路由器有没有辐射 脚本之家官网 给视频加字幕的软件 流水账软件 spss22安装教程 迅雷单机游戏下载 内存条有什么用
当前位置: 首页 > 学习教程  > 编程学习

PHP抓取网页内容

2021/1/9 1:58:31 文章标签: php抓取网页内容

首先,放一些比较小巧的程序,但是功能和实际效果有待完善。 ①、使用php获取网页内容http://hi.baidu.com/quqiufeng/blog/item/7e86fb3f40b598c67d1e7150.htmlheader("Content-type: text/html; charsetutf-8");1、$xhr new COM("MSXML2…

首先,放一些比较小巧的程序,但是功能和实际效果有待完善。

①、使用php获取网页内容
http://hi.baidu.com/quqiufeng/blog/item/7e86fb3f40b598c67d1e7150.html
header("Content-type: text/html; charset=utf-8");
1、
$xhr = new COM("MSXML2.XMLHTTP");
$xhr->open("GET","http://localhost/xxx.php?id=2",false);
$xhr->send();
echo $xhr->responseText

2、file_get_contents实现
<?php
$url="http://www.blogjava.net/pts";
echo file_get_contents( $url );
?>

3、fopen()实现
<?
if ($stream = fopen('http://www.sohu.com', 'r')) {
    // print all the page starting at the offset 10
    echo stream_get_contents($stream, -1, 10);
    fclose($stream);
}

if ($stream = fopen('http://www.sohu.net', 'r')) {
    // print the first 5 bytes
    echo stream_get_contents($stream, 5);
    fclose($stream);
}
?>

②、使用php获取网页内容
http://www.blogjava.net/pts/archive/2007/08/26/99188.html
简单的做法:
<?php
$url="http://www.blogjava.net/pts";
echo file_get_contents( $url );
?>
或者:
<?
if ($stream = fopen('http://www.sohu.com', 'r')) {
    // print all the page starting at the offset 10
    echo stream_get_contents($stream, -1, 10);
    fclose($stream);
}

if ($stream = fopen('http://www.sohu.net', 'r')) {
    // print the first 5 bytes
    echo stream_get_contents($stream, 5);
    fclose($stream);
}
?>

③、PHP获取网站内容,保存为TXT文件源码
http://blog.chinaunix.net/u1/44325/showart_348444.html
<?
$my_book_url='http://book.yunxiaoge.com/files/article/html/4/4550/index.html';
ereg("http://book.yunxiaoge.com/files/article/html/[0-9]+/[0-9]+/",$my_book_url,$myBook);
$my_book_txt=$myBook[0];
$file_handle = fopen($my_book_url, "r");//读取文件
unlink("test.txt");
while (!feof($file_handle)) { //循环到文件结束
    $line = fgets($file_handle); //读取一行文件
    $line1=ereg("href=/"[0-9]+.html",$line,$reg); //分析文件内部书的文章页面
       $handle = fopen("test.txt", 'a');
   if ($line1) {
     $my_book_txt_url=$reg[0]; //另外赋值,给抓取分析做准备
   $my_book_txt_url=str_replace("href=/"","",$my_book_txt_url);
      $my_book_txt_over_url="$my_book_txt$my_book_txt_url"; //转换为抓取地址
      echo "$my_book_txt_over_url</p>"; //显示工作状态
      $file_handle_txt = fopen($my_book_txt_over_url, "r"); //读取转换后的抓取地址
      while (!feof($file_handle_txt)) {
       $line_txt = fgets($file_handle_txt);
       $line1=ereg("^&nbsp.+",$line_txt,$reg); //根据抓取内容标示抓取
       $my_over_txt=$reg[0];
       $my_over_txt=str_replace("&nbsp;&nbsp;&nbsp;&nbsp;","    ",$my_over_txt); //过滤字符
       $my_over_txt=str_replace("<br />","",$my_over_txt);
       $my_over_txt=str_replace("<script. language=/"javascript/">","",$my_over_txt);
       $my_over_txt=str_replace("&quot;","",$my_over_txt);
       if ($line1) {
         $handle1=fwrite($handle,"$my_over_txt/n"); //写入文件
       }
      }
    }
}
fclose($file_handle_txt);
fclose($handle);
fclose($file_handle); //关闭文件
echo "完成</p>";
?>

下面是比较嚣张的方法。
这里使用一个名叫Snoopy的类。
先是在这里看到的:
PHP中获取网页内容的Snoopy包
http://blog.declab.com/read.php/27.htm
然后是Snoopy的官网:
http://sourceforge.net/projects/snoopy/
这里有一些简单的说明:
代码收藏-Snoopy类及简单的使用方法
http://blog.passport86.com/?p=161
下载:http://sourceforge.net/projects/snoopy/

今天才发现这个好东西,赶紧去下载了来看看,是用的parse_url
还是比较习惯curl

snoopy是一个php类,用来模仿web浏览器的功能,它能完成获取网页内容和发送表单的任务。
下面是它的一些特征:
1、方便抓取网页的内容
2、方便抓取网页的文字(去掉HTML代码)
3、方便抓取网页的链接
4、支持代理主机
5、支持基本的用户/密码认证模式
6、支持自定义用户agent,referer,cookies和header内容
7、支持浏览器转向,并能控制转向深度
8、能把网页中的链接扩展成高质量的url(默认)
9、方便提交数据并且获取返回值
10、支持跟踪HTML框架(v0.92增加)
11、支持再转向的时候传递cookies

具体使用请看下载文件中的说明。


<?php
include“Snoopy.class.php“;
$snoopy=newSnoopy;
$snoopy->fetchform(“http://www.phpx.com/happy/logging.php?action=login“);
print$snoopy->results;
?>
<?php
include“Snoopy.class.php“;
$snoopy=newSnoopy;
$submit_url=“http://www.phpx.com/happy/logging.php?action=login“;$submit_vars["loginmode"]=“normal“;
$submit_vars["styleid"]=“1“;
$submit_vars["cookietime"]=“315360000“;
$submit_vars["loginfield"]=“username“;
$submit_vars["username"]=“********“;//你的用户名
$submit_vars["password"]=“*******“;//你的密码
$submit_vars["questionid"]=“0“;
$submit_vars["answer"]=“”;
$submit_vars["loginsubmit"]=“提 &nbsp; 交“;
$snoopy->submit($submit_url,$submit_vars);
print$snoopy->results;
?>

<?php
/**
* 实现从指定url抓取页面回来,自己修改url_info可以随意抓取别的页面
* 使用方法1: 从浏览器上输入本php文件的路径可以执行
* 使用方法2: 采用命令行方式执行 比如 c:/php5/php -f c:/getpage.php
* 抓取结果: 会在当前目录下生成一个抓取结果页面test.html
*
* Author: Michael <lee@toplee.com>
* HomePage:http://www.toplee.com
*/
$url_info = array(
       'timeout' => 5,
       'hostname'   => 'www.1caipiao.com',
       'port'    => 80,
       'uri'    => '/zoushi/ln35x7.asp',
       );
    
$status_line = '';
$fp = openUrl($url_info,$status_line);
if ($status_line == "200 OK") {
$content = getUrlData($fp);
writeToFile('test.html',$content);
echo "Get page ok! Please open test.html to see the result!/r/n";
echo "Any question, ask Michael<lee@toplee.com> For help!/r/n";
} else {
echo "Get page failed! Please check your url_info paramters and try again!/r/n";
}
/// 下面是用到的三个函数
function openUrl($url_data,&$status_line)
{
if (!isset($url_data['hostname']) || !$url_data['hostname'] || !isset($url_data['uri']) || !$url_data['uri'])
       return false;
if (!isset($url_data['port']))
       $url_data['port'] = 80;
if (!isset($url_data['timeout']))
       $url_data['timeout'] = 5;
$errno = '';
$errstr = '';
if (isset($url_data['proxy_host']) && $url_data['proxy_host']) {
       if (!isset($url_data['proxy_port']))
         $url_data['proxy_port'] = 80;
       $fp = @fsockopen($url_data['proxy_host'],$url_data['proxy_port'], $errno,$errstr,$url_data['timeout']);
       $uri = 'http://'.$url_data['hostname'].':'.$url_data['port'].$url_data['uri'];
       $hostname = $url_data['hostname'];
} else {
       $fp = @fsockopen($url_data['hostname'], $url_data['port'], $errno, $errstr, $url_data['timeout']);
       $uri = $url_data['uri'];
       $hostname = $url_data['hostname'];
}
if (!$fp)
       return false;
$method = ((isset($url_data['method']) && $url_data['method']) ? strtoupper($url_data['method']) : 'GET');
if ($method == 'GET') {
       fputs($fp, "GET $uri HTTP/1.0/r/nHost: $hostname/r/nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows 98)/r/nConnection: close/r/n/r/n");
} elseif ($method == 'POST') {
       $len = strlen($url_data['content']);
       $post = "POST $uri HTTP/1.0/r/nHost: $hostname/r/nContent-Type: application/x-www-form-urlencoded/r/nContent-Encoding: chunked/r/nContent-Length: $len/r/nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows 98)/r/nConnection: close/r/n/r/n";
       //echo $post;
       fputs($fp, $post);
       if (isset($url_data['content']))
         fputs($fp, $url_data['content']);
}
$status_line = '';
$count = 0;
while (!feof($fp)) {
       $count ++;
       $data = trim(fgets($fp,4096));
       if ($count == 1) {
         ereg("^HTTP/[0-9].[0-9] ([^/r/n]+)", $data, $regs);
         $status_line = $regs[1];
       }
       if ($data == "") break;
}
return $fp;
}
function getUrlData(&$fp, $code=0)
{
if ( !$fp ) return '';
$data = "";
while ( !feof($fp) ) $data .= fgets($fp, 4096);
fclose($fp);
if ($code < 0)
       return base64_decode($data);
elseif ($code == 0)
       return $data;
else
       return chunk_split(base64_encode($data));
}
function writeToFile($file,$content,$mode='w')
{
$oldmask = umask(0);
$fp = fopen($file, $mode);
if (!$fp) return false;
@fwrite($fp,$content);
@fclose($fp);
@umask($oldmask);
return true;
}
?>
这个程序实际上还是不错的,试了一下,代码也大致看了眼,感觉不错,只是不能过滤掉HTML标记。
======================================================================
http://hi.baidu.com/leaf2006/blog/item/edfe104cfe5a41fdd72afc04.html
抓取和分析一个文件是非常简单的事。这个教程将通过一个例子带领你一步一步地去实现它。让我们开
始吧!
  首先,我首必须决定我们将抓取的URL地址。可以通过在脚本中设定或通过$QUERY_STRING传递。为了简
单起见,让我们将变量直接设在脚本中。
<? $url = 'http://www.php.net'; ?>
  第二步,我们抓取指定文件,并且通过file()函数将它存在一个数组里。
<? $url = 'http://www.php.net'; $lines_array = file($url); ?>
  好了,现在在数组里已经有了文件了。但是,我们想分析的文本可能不全在一行里面。为了解决这个文
件,我们可以简单地将数组$lines_array转化成一个字符串。我们可以使用implode(x,y)函数来实现它。如
果在后面你想用explode(将字符串变量数组),将x设成"|"或"!"或其它类似的分隔符可能会更好。但是出于
我们的目的,最好将x设成空格。y是另一个必要的参数,因为它是你想用implode()处理的数组。
<? $url = 'http://www.php.net'; $lines_array = file($url); $lines_string = implode('', $lines_array); ?>
  现在,抓取工作就做完了,下面该进行分析了。出于这个例子的目的,我们想得到在<head>到</head>
之间的所有东西。为了分析出字符串,我们还需要叫做正规表达式的东西。
<? $url = 'http://www.php.net'; $lines_array = file($url); $lines_string = implode('', $lines_array); eregi("<head>(.*)</head>", $lines_string, $head); ?>
  让我们看一下代码。正如你所见,eregi()函数按下面的格式执行:
eregi("<head>(.*)</head>", $lines_string, $head);
  "(.*)"表示所有东西,可以解释为,"分析在<head>和</head>间的所以东西"。$lines_string是我们正
在分析的字符串,$head是分析后的结果存放的数组。
  最后,我们可以输数据。因为仅在<head>和</head>间存在一个实例,我们可以安全的假设数组中仅存
在着一个元素,而且就是我们想要的。让我们把它打印出来吧。
<? $url = 'http://www.php.net'; $lines_array = file($url); $lines_string = implode('', $lines_array); eregi("<head>(.*)</head>", $lines_string, $head); echo $head[0]; ?>

  这就是全部的代码了。
PS: 如果要抓整个页面 将上边代码中的《HEAD》修改成 html
这篇文章基本上是一步一步的讲解,所用的代码和网上流传的一样。
只是对于截取head这部分,我一直没有测试成功,不知道是怎么回事。
======================================================================
http://hi.baidu.com/prestohuan/blog/item/091195ca5bcaaa80c9176872.html
使用PHP简单网页抓取和内容分析
没事的时候想抓取点网页看看,也不太懂,只是玩玩,写了点代码,聊以娱乐。
稍微有点意义的函数是:get_content_by_socket(), get_url(), get_content_url(), get_content_object 几个函数,也许能够给你点什么想法。


<?php
//获取所有内容url保存到文件
function get_index($save_file, $prefix="index_"){
    $count = 68;
    $i = 1;
    if (file_exists($save_file)) @unlink($save_file);
    $fp = fopen($save_file, "a+") or die("Open ". $save_file ." failed");
    while($i<$count){
        $url = $prefix . $i .".htm";
        echo "Get ". $url ."...";
        $url_str = get_content_url(get_url($url));
        echo " OK/n";
        fwrite($fp, $url_str);
        ++$i;
    }
    fclose($fp);
}
//获取目标多媒体对象
function get_object($url_file, $save_file, $split="|--:**:--|"){
    if (!file_exists($url_file)) die($url_file ." not exist");
    $file_arr = file($url_file);
    if (!is_array($file_arr) || empty($file_arr)) die($url_file ." not content");
    $url_arr = array_unique($file_arr);
    if (file_exists($save_file)) @unlink($save_file);
    $fp = fopen($save_file, "a+") or die("Open save file ". $save_file ." failed");
    foreach($url_arr as $url){
        if (empty($url)) continue;
        echo "Get ". $url ."...";
        $html_str = get_url($url);
        echo $html_str;
        echo $url;
        exit;
        $obj_str = get_content_object($html_str);
        echo " OK/n";
        fwrite($fp, $obj_str);
    }
    fclose($fp);
}
//遍历目录获取文件内容
function get_dir($save_file, $dir){
    $dp = opendir($dir);
    if (file_exists($save_file)) @unlink($save_file);
    $fp = fopen($save_file, "a+") or die("Open save file ". $save_file ." failed");
    while(($file = readdir($dp)) != false){
        if ($file!="." && $file!=".."){
            echo "Read file ". $file ."...";
            $file_content = file_get_contents($dir . $file);
            $obj_str = get_content_object($file_content);
            echo " OK/n";
            fwrite($fp, $obj_str);
        }
    }
    fclose($fp);
}
//获取指定url内容
function get_url($url){
    $reg = '/^http:[^//].+$/';
    if (!preg_match($reg, $url)) die($url ." invalid");
    $fp = fopen($url, "r") or die("Open url: ". $url ." failed.");
    while($fc = fread($fp, 8192)){
        $content .= $fc;
    }
    fclose($fp);
    if (empty($content)){
        die("Get url: ". $url ." content failed.");
    }
    return $content;
}
//使用socket获取指定网页
function get_content_by_socket($url, $host){
    $fp = fsockopen($host, 80) or die("Open ". $url ." failed");
    $header = "GET /".$url ." HTTP/1.1/r/n";
    $header .= "Accept: */*/r/n";
    $header .= "Accept-Language: zh-cn/r/n";
    $header .= "Accept-Encoding: gzip, deflate/r/n";
    $header .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; InfoPath.1; .NET CLR 2.0.50727)/r/n";
    $header .= "Host: ". $host ."/r/n";
    $header .= "Connection: Keep-Alive/r/n";
    //$header .= "Cookie: cnzz02=2; rtime=1; ltime=1148456424859; cnzz_eid=56601755-/r/n/r/n";
    $header .= "Connection: Close/r/n/r/n";
    fwrite($fp, $header);
    while (!feof($fp)) {
        $contents .= fgets($fp, 8192);
    }
    fclose($fp);
    return $contents;
}
//获取指定内容里的url
function get_content_url($host_url, $file_contents){
    //$reg = '/^(#|javascript.*?|ftp:.+|http:.+|.*?href.*?|play.*?|index.*?|.*?asp)+$/i';
    //$reg = '/^(down.*?/.html|/d+_/d+/.htm.*?)$/i';
    $rex = "/([hH][rR][eE][Ff])/s*=/s*['/"]*([^>'/"/s]+)[/"'>]*/s*/i";
    $reg = '/^(down.*?/.html)$/i';
    preg_match_all ($rex, $file_contents, $r);
    $result = ""; //array();
    foreach($r as $c){
        if (is_array($c)){
            foreach($c as $d){
                if (preg_match($reg, $d)){ $result .= $host_url . $d."/n"; }
            }
        }
    }
    return $result;
}
//获取指定内容中的多媒体文件
function get_content_object($str, $split="|--:**:--|"){  
    $regx = "/href/s*=/s*['/"]*([^>'/"/s]+)[/"'>]*/s*(<b>.*?<//b>)/i";
    preg_match_all($regx, $str, $result);
    if (count($result) == 3){
        $result[2] = str_replace("<b>多媒体: ", "", $result[2]);
        $result[2] = str_replace("</b>", "", $result[2]);
        $result = $result[1][0] . $split .$result[2][0] . "/n";
    }
    return $result;
}
?>
时间关系,以后再测试这些代码。大致看了下,应该不错,看上去有过滤HTML标记的功能,只是还不知道效果如何。

 


本文链接: http://www.dtmao.cc/news_show_1100157.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?