初识PHP爬虫(1)-抓取网页所有超链接

作者: pengpeng 分类: 所有文章 发布时间: 2017-12-02 13:49

最近在学习thinkphp并且尝试写出一个独立的博客程序,途中,突发奇想想试一试PHP爬虫,我的想法的无限递归抓取所有网页超链接,然后就开始搞了。早在之前免费领取了京东云的云主机,正好可以拿来实验。利用phpstudy装了PHP5.4.5和apache环境。然后开始写PHP脚本

数据库设计
数据库的话,没有什么,就一个表,里面两个字段,没打算储存那么多数据,就一个id一个url链接就好了
PHP代码:e.php

<?php
ignore_user_abort();
set_time_limit(0);
header("content-type:text/html;charset=utf-8");
$sql = mysql_connect('127.0.0.1','root','root') or die("数据库链接失败");
$select  = mysql_select_db('curls');
if(!$select){
die("选择错误");
}
$id = 0;
do{
//id随循环自增
$id++;
//准备sql
$sql = "select * from sogouwx where id = '{$id}'";
//执行sql
$result = mysql_query($sql);
//开始循环读取超链接
while($row = mysql_fetch_array($result)){
if(!file_exists('1.txt')){
echo "停止执行";
break;
exit;
}
$url = $row['url'];
$htmls = file_get_contents($url);
$patten = "/http:\/\/[\.|\s|\w\d|\=|\-|\_|\/|\&|\?|\:|\?|\&|\%|\=|\*]*/i";
preg_match_all($patten, $htmls, $linkArr);
$linkArr = $linkArr[0];
foreach($linkArr as $key=>$value){
$str = $linkArr[$key];
//  去除无效的
if($str == "http://"){
unset($linkArr[$key]);
}
//  去除静态资源
if(strstr($str,'.dtd') || strstr($str,'.ltd') || strstr($str,' ') || strstr($str,'w3.org') || strstr($str,'.js') || strstr($str,'.css') || strstr($str,'.jpg') || strstr($str,'.jpeg') || strstr($str,'.png') || strstr($str,'.gif') || strstr($str,'woff') || strstr($str,'.ttf') || strstr($str,'.woff2') || strstr($str,'.json') || strstr($str,'.txt') || strstr($str,'.xml') || strstr($str,'.ico') || strstr($str,'.cab') || strstr($str,'.swf')){
unset($linkArr[$key]);
}
//去除最后一个/符号防止重复
$strLen = strlen($str);
$strR = strripos($str,'/');
if($strLen-1 == $strR){
$linkArr[$key] = substr($linkArr[$key],0,$strLen-1);
}
}
foreach($linkArr as $key=>$value){
//插入
$selectSql = "select * from sogouwx where url = '{$linkArr[$key]}'";
$selectQuery = mysql_query($selectSql);
$selectNum = mysql_num_rows($selectQuery);
//var_dump($selectNum);
if($selectNum == 0){
$insertSql = "insert into sogouwx(url)values('{$linkArr[$key]}')";
$insertQuery = mysql_query($insertSql);
}	
}
}
// sleep(2);
}while($id);
?>

大概从昨天夜里1点开始跑,忘了加上时间参数,今天中午一点半的时候打开发现已经停止了,我也不知道是什么时候停止的,数据库跑了233596条数据,昨天跑的时候我大概计算了一下,一个小时大概跑7w条数据左右,这样一算也就跑了三个多小时。
给出了一行错误代码:Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 131072000 bytes) in C:\webs\WWW\e.php on line 31
大概的意思是:已经没有内存可以分配,大概是内存跑完了,就这样终止了,今天准备再加上时间参数,服务器

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注