简单的分了几个步骤:
网站建设哪家好,找成都创新互联公司!专注于网页设计、网站建设、微信开发、小程序定制开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了富县免费建站欢迎大家使用!
1、确定采集目标
2、获取目标远程页面内容(curl、file_get_contents)
3、分析页面html源码,正则匹配你需要的内容(preg_match、preg_match_all),这一步最为重要,不同页面正则匹配规则不一样
4、入库
?php
/*
* 如下: 方法有点笨
* 抓取网页内容用 PHP 的正则
* 用JS每隔5分钟刷新当前页面---即重新获取网页内容
*
* 注: $mode中--title/title-更改为所需内容(如 $mode = "#a(.*)/a#";获取所有链接)
*
* window.location.href="";中的
* 更改为自己的URL----作用:即刷新当前页面
*
* setInterval("ref()",300000);是每隔300000毫秒(即 5 * 60 *1000 毫秒即5分钟)执行一次函数 ref()
*
* print_r($arr);输出获得的所有内容 $arr是一个数组 可根据所需输出一部分(如 echo $arr[1][0];)
* 若要获得所有内容 可去掉
* $mode = "#title(.*)/title#";
if(preg_match_all($mode,$content,$arr)){
print_r($arr);
echo "br/";
echo $arr[1][0];
}
再加上 echo $content;
*/
$url = ""; //目标站
$fp = @fopen($url, "r") or die("超时");
$content=file_get_contents($url);
$mode = "#title(.*)/title#";
if(preg_match_all($mode,$content,$arr)){
//print_r($arr);
echo "br/";
echo $arr[1][0];
}
?
script language="JavaScript" type="text/javascript"
--
function ref(){
window.location.href="";
}
setInterval("ref()",300000);
//--
/script
比如有一个网址为
http://域名/goods.php?u=59id=24#pinglun
我想得到这个id值
可以用正则,也可以用php函数解析到数组中
用正则可以这样
preg_match('/id=(\d+)/',$_SERVER["REQUEST_URI"],$m);//$_SERVER 这个表示当前网址url
print_r($m[1]);exit;
或者用parse_url()及parse_str()函数
$cur_q=parse_url($_SERVER["REQUEST_URI"],PHP_URL_QUERY);
parse_str($cur_q,$myArray);
print_r($myArray["id"]);exit;
拓展资料
PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。PHP 独特的语法混合了C、Java、Perl以及PHP自创的语法。它可以比CGI或者Perl更快速地执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML(标准通用标记语言下的一个应用)文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;PHP还可以执行编译后代码,编译可以达到加密和优化代码运行,使代码运行更快。
PHP的特性包括:
1. PHP 独特的语法混合了 C、Java、Perl 以及 PHP 自创新的语法。
2. PHP可以比CGI或者Perl更快速的执行动态网页——动态页面方面,与其他的编程语言相比,
PHP是将程序嵌入到HTML文档中去执行,执行效率比完全生成htmL标记的CGI要高许多;
PHP具有非常强大的功能,所有的CGI的功能PHP都能实现。
3. PHP支持几乎所有流行的数据库以及操作系统。
4. 最重要的是PHP可以用C、C++进行程序的扩展!
参考资料:百度百科 PHP
什么网页数据?
是打开 本地网页还是打开网上网页
如果是本地网页的话 在浏览器上输入127.0.0.1或者localhost进行访问
如果是外网我理解的是你要获取外网的一个网页,可以用代码或者程序来实现
(一般称为采集程序,或者小偷程序)
//个人认为curl好一点,因为curl可以模拟浏览器,有的网站会过滤机器人
//1.php代码
//把网页读入一个字符串
$contone = file_get_contents('url');
print_r($contone);
//curl采集
#初始化curl (true/false)
$ch=curl_init();
#请求url地址
$params[CURLOPT_URL]='网址';
#是否返回响应头信息
$params[CURLOPT_HEADER] = true;
#是否将结果返回
$params[CURLOPT_RETURNTRANSFER] = true;
#是否重定向
$params[CURLOPT_FOLLOWLOCATION] = true;
#伪造浏览器
$params[CURLOPT_USERAGENT] = 'Mozilla/5.0 (Windows NT 5.1; rv:9.0.1) Gecko/20100101 Firefox/9.0.1';
curl_setopt_array($ch, $params);
$content=curl_exec($ch);
//输出网页内容
print_r($content);
//下面是整个curl采集类
class Curl{
#采集的地址
public $url;
#匹配的正则
public $preg;
#模拟登录需要的用户名
public $username;
#模拟登录需要的密码;
public $pwd;
#cookie存储的路径
private $cookie_path;
#采集数据的字符集
public $charset;
/**
* 构造方法,初始化采集基本信息
* @param $url 采集的url
* @param $preg 匹配的正则
* @param string $username 用户名
* @param string $pwd 密码
* @param string $charset 字符集
*/
public function __construct($info){
extract($info);
$this-url=$url;
$this-preg=$preg;
if(isset($charset)){
header("content-type:text/html;charset=".$this-charset);
}else{
header("content-type:text/html;charset=utf-8");
}
if(isset($username)){
$this-username=$username;
}
if(isset($pwd)){
$this-pwd=$pwd;
}
}
/*
* 采集数据,非表单提交方式,直接采集的
*/
public function get_info(){
#初始化curl
$ch=curl_init();
#请求url地址
$params[CURLOPT_URL]=$this-url;
#是否返回响应头信息
$params[CURLOPT_HEADER] = true;
#是否将结果返回
$params[CURLOPT_RETURNTRANSFER] = true;
#是否重定向
$params[CURLOPT_FOLLOWLOCATION] = true;
#伪造浏览器
$params[CURLOPT_USERAGENT] = 'Mozilla/5.0 (Windows NT 5.1; rv:9.0.1) Gecko/20100101 Firefox/9.0.1';
//判断是否有cookie,有的话直接使用
//if (isset($_COOKIE['cookie_jar']) ($_COOKIE['cookie_jar'] || is_file($_COOKIE['cookie_jar']))){
// $params[CURLOPT_COOKIEFILE] = $_COOKIE['cookie_jar']; //这里判断cookie
//} else {
// $cookie_jar = tempnam($this-cookie_path, 'cookie'); //产生一个cookie文件
// $params[CURLOPT_COOKIEJAR] = $cookie_jar; //写入cookie信息
// setcookie('cookie_jar', $cookie_jar); //保存cookie路径
//}
#开始发送请求,传入curl参数
curl_setopt_array($ch, $params);
$content=curl_exec($ch);
preg_match_all($this-preg,$content,$arr);
return $arr;
}
/**
* 采集远程图片
* @param $img 图片路径 是一个数组
* @param $save_path 图片保存在你本地的路径
* @return bool
*/
public function get_img($img,$save_path){
for($i=0;$icount($img);$i++) {
$res=@file_get_contents($img[$i]);
$img_type=substr($img[$i], strrpos($img[$i], "."));
$path=$save_path.time().rand(1,9999999).mt_rand() .$img_type;
$img[$i] = $path;
file_put_contents($path,$res);
}
return $img;
}
//登录后采集
public function register_info(){
//采集的信息需要先登录的就要先模拟登录
//设置cookie保存路径
$ch = curl_init();
//组装用户名和密码
$info['username'] = $this-username;
$info['password'] = $this-pwd;
//模拟表单提交
$params[CURLOPT_URL] = $this-url; //请求url地址
$params[CURLOPT_HEADER] = true; //是否返回响应头信息
$params[CURLOPT_RETURNTRANSFER] = true; //是否将结果返回
$params[CURLOPT_FOLLOWLOCATION] = true; //是否重定向
$params[CURLOPT_USERAGENT] = 'Mozilla/5.0 (Windows NT 5.1; rv:9.0.1) Gecko/20100101 Firefox/9.0.1';
$postfields = '';
//将表单要提交的数据编程URL拼接方式
foreach ($info as $key = $value){
$postfields .= urlencode($key) . '=' . urlencode($value) . '';
}
$params[CURLOPT_POST] = true;
$params[CURLOPT_POSTFIELDS] = $postfields;
//判断是否有cookie,有的话直接使用
if (isset($_COOKIE['cookie_jar'])($_COOKIE['cookie_jar']||is_file($_COOKIE['cookie_jar']))){
$params[CURLOPT_COOKIEFILE] = $_COOKIE['cookie_jar']; //这里判断cookie
}else{
$cookie_jar = tempnam($this-cookie_path, 'cookie'); //产生一个cookie文件
$params[CURLOPT_COOKIEJAR] = $cookie_jar; //写入cookie信息
setcookie('cookie_jar', $cookie_jar); //保存cookie路径
}
curl_setopt_array($ch, $params); //传入curl参数
$content = curl_exec($ch); //执行
return $content;
}
}
$url = "网站地址目录";
$queryServer = curl_init();
curl_setopt($queryServer, CURLOPT_URL, $url);
curl_setopt($queryServer, CURLOPT_HEADER, 0);
curl_setopt($queryServer, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($queryServer, CURLOPT_RETURNTRANSFER, true);
curl_setopt($queryServer, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($queryServer, CURLOPT_TIMEOUT, 30);
$html = curl_exec($queryServer);
$html = iconv('UTF-8','GBK//IGNORE',$html); //如果你需要是的数据是utf-8编码的,这一行可以注销,如果需要gbk编码的,请保留.如果出现乱码,就是一行的问题,你自己调着试吧
//echo $holder;exit; 此处可以输出来测试.
$html = str_replace(array("\n","\r","\t"),"",$html);
$preg = '/table\s+width=\"800\"[^]+(.*?)\/table/';
preg_match_all($preg,$html,$out);
//匹配每行
preg_match_all('/tr[^]+(.*?)\/tr/',$out[1][0],$tr);
//匹配每个td
$result = array();
$match = '/td.+([^]+)\/td/U';
foreach( $tr[0] as $key = $value ){
preg_match_all($match,$value,$arr);
$result[] = $arr[1];
}
//输出测试,$result就是你要的数据,至于你要怎么输出显示格式,那就随心调就好了。
foreach( $result as $key = $value ){
echo implode("\t",$value);
echo "br";
}
exit;
PHP Simple HTML DOM或者phpQuery可以直接取得某些div中的内容,里面有几个例子专门针对于网页抓取,调整好抓取频次,舍去已经存在的数据,你可以参考下
;id=57class=2