可以用以下4个方法来抓取网站 的数据:
我们提供的服务有:网站设计制作、网站设计、微信公众号开发、网站优化、网站认证、黄石ssl等。为上1000家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的黄石网站制作公司
1. 用 file_get_contents 以 get 方式获取内容:
?
$url = '';
$html = file_get_contents($url);
echo $html;
2. 用fopen打开url,以get方式获取内容
?
$url = '';
$fp = fopen($url, 'r');
stream_get_meta_data($fp);
$result = '';
while(!feof($fp))
{
$result .= fgets($fp, 1024);
}
echo "url body: $result";
fclose($fp);
3. 用file_get_contents函数,以post方式获取url
?
$data = array(
'foo'='bar',
'baz'='boom',
'site'='',
'name'='nowa magic');
$data = http_build_query($data);
//$postdata = http_build_query($data);
$options = array(
'http' = array(
'method' = 'POST',
'header' = 'Content-type:application/x-www-form-urlencoded',
'content' = $data
//'timeout' = 60 * 60 // 超时时间(单位:s)
)
);
$url = "";
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
echo $result;
4、使用curl库,使用curl库之前,可能需要查看一下php.ini是否已经打开了curl扩展
$url = '';
$ch = curl_init();
$timeout = 5;
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$file_contents = curl_exec($ch);
curl_close($ch);
echo $file_contents;
1、建议你读写数据和下载图片分开,各用不同的进程完成。
比如说,取数据用get-data.php,下载图片用get-image.php。
2、多进程的话,php可以简单的用pcntl_fork()。这样可以并发多个子进程。
但是我不建议你用fork,我建议你安装一个gearman worker。这样你要并发几个,就启几个worker,写代码简单,根本不用在代码里考虑thread啊,process等等。
3、综上,解决方案这样:
(1)安装gearman worker。
(2)写一个get-data.php,在crontab里设置它每5分钟执行一次,只负责读数据,然后把读回来的数据一条一条的扔到 gearman worker的队列里;
然后再写一个处理数据的脚本作为worker,例如叫process-data.php,这个脚本常驻内存。它作为worker从geraman 队列里读出一条一条的数据,然后跟你的数据库老数据比较,进行你的业务逻辑。如果你要10个并发,那就启动10个process-data.php好了。处理完后,如果图片地址有变动需要下载图片,就把图片地址扔到 gearman worker的另一个队列里。
(3)再写一个download-data.php,作为下载图片的worker,同样,你启动10个20个并发随便你。这个进程也常驻内存运行,从gearman worker的图片数据队列里取数据出来,下载图片
4、常驻进程的话,就是在代码里写个while(true)死循环,让它一直运行好了。如果怕内存泄露啥的,你可以每循环10万次退出一下。然后在crontab里设置,每分钟检查一下进程有没有启动,比如说这样启动3个process-data worker进程:
* * * * * flock -xn /tmp/process-data.1.lock -c '/usr/bin/php /process-data.php /dev/null 21'
* * * * * flock -xn /tmp/process-data.2.lock -c '/usr/bin/php /process-data.php /dev/null 21'
* * * * * flock -xn /tmp/process-data.3.lock -c '/usr/bin/php /process-data.php /dev/null 21'
不知道你明白了没有
本项目需要php+mysql来实现。
首先需要分析数据库:
需要建立用户表(user)
表中字段:编号(id int primary key auto_increment),昵称(nickname varchar(255)),性别(sex int(1) 男为1,女为0),邮箱(email varchar(255)),注册时间(reg_time varchar(255) 时间戳)
还需要建立留言表(leaveword)
表中字段:编号(id int primary key auto_increment),留言用户编号(user_id int),留言内容(content text),留言时间(leaveword_time varchar(255))
建完表并插入一些测试数据后,就开始设计页面了。
当用户登录后,需要把用户的id存入session中$_SESSION['user_id'],以便用来验证用户是否登录,是否有权限发表留言。
用户进入到留言页面中以后,需要分页展示其他(包括自己)的留言。这是本人写的分页函数给你作为参考:
function getPageNum($table,$pagesize=10,$where="1=1"){ //这个函数用来获得总记录数
global $db;
$html="";
$sql="select * from ".$table." where ".$where;
$re=$db-sql_query($sql);
$num=$db-sql_numrows($re);
$pageNum=ceil($num/$pagesize);
return $pageNum;
}
function paging($table,$pagesize=10,$nowpage=1,$where="1=1",$url=""){ //这个函数用来获得分页字符串
global $db;
$html="";
$sql="select * from ".$table." where ".$where;
$re=$db-sql_query($sql);
$num=$db-sql_numrows($re);
$pageNum=ceil($num/$pagesize);
if($nowpage-2=2){
$start=1;
}else if($nowpage=$pageNum-2){
$start=$pageNum-4;
}else{
$start=$nowpage-2;
}
$end=($start+4=$pageNum)?$pageNum:$start+4;
$html.="a href='?page=1'首页/a";
for($i=$start;$i=$end;$i++){
if($url==""){
$html.="a href='?page=".$i."'".$i."/a";
}else{
$html.="a href='?page=".$i."".$url."'".$i."/a";
}
}
$html.="a href='?page=".$pageNum."'尾页/a";
return $html;
}
当用户提交留言时,应该就不用多说了。当用户点击提交(submit)后,以$_POST或以$_GET来接提交的值,然后写个插入语句
insert into leaveword values();这个不用我多说,你应该会吧。
说实在的留言确实没多少东西,惟一的难点就是,如何把用户的留言以分页的形式显示。
再难一点,就是在提交留言时,用ajax来做,达到页面无刷新的效果。
这是本人的一点心得,希望可以对你写项目描述有帮助。
PHP Simple HTML DOM或者phpQuery可以直接取得某些div中的内容,里面有几个例子专门针对于网页抓取,调整好抓取频次,舍去已经存在的数据,你可以参考下
;id=57class=2