中文源码网
欢迎您!
会员登录
会员注册
发布自媒体
发布模版
发布源码
发布模版
发布酷站
推荐源码
常用源码
帮助中心
栏目导航
热门搜索:
网站首页
免费源码
精品源码
html模版
精品模版
酷站大全
技术文档
方案大全
网络教程
站长自媒体
新闻动态
帮助中心
免费源码下载
asp源码
php源码
python源码
.net源码
jsp源码
JS特效
安卓源码
IOS源码
微信小程序下载
毕业设计源码下载
模版下载
商城模版
手机wap模版
网络教程
html5教程
asp教程
php教程
jsp教程
Python语言技术文档
python入门
Python编程技巧
Python网站web
Python网络爬虫
Python自动化运维
数据挖掘/机器学习
Python人工智能
Python多媒体
Python科学计算
Python游戏开发
Python图形界面
Python数据库相关
Python与其他语言
Python库/模块大全
Python报错处理大全
微信小程序技术文档
微信小程序开发入门
微信小程序开发技巧
微信游戏开发
微信公众号开发
微信常用源码
php语言技术文档
php入门教程
php技巧
php函数/类库
php框架
php+AJAX技巧
开源系统及二次开发
PHP内核
jsp语言技术文档
jsp入门教程
jsp技巧
jsp框架
asp语言技术文档
asp入门教程
asp技巧
asp函数/类库
C#/.NET语言技术文档
C#/.NET入门教程
C#/.NET技巧
MVC/.NET框架
C#/.NET微信开发
程序报错解决方法
html5/css技术文档
html5
CSS
javascript
javascript技巧
jquery
json
ajax
js框架/js库
点击排行
总结PHP中初始化空数组的最佳方法
在PHP中输出JS语句以及乱码问题的解决方案
原生PHP实现导出csv格式Excel文件的方法示例【附源码下载】
用PHP的反射实现委托模式的讲解
详解提高使用Java反射的效率方法
详解关于php的xdebug配置(编辑器vscode)
详解php中生成标准uuid(guid)的方法
详解php中curl返回false的解决办法
详解php用static方法的原因
详解php伪造Referer请求反盗链资源
详解PHP素材图片上传、下载功能
详解PHP实现支付宝小程序用户授权的工具类
详解PHP神奇又有用的Trait
详解PHP队列的实现
详解PHP的抽象类和抽象方法以及接口总结
您现在的位置:
首页
>
技术文档
>
php入门教程
我要投稿
一个PHP实现的轻量级简单爬虫
来源:
中文源码网
浏览:136 次 日期:2024-03-27 02:31:17
【下载文档:
一个PHP实现的轻量级简单爬虫.txt
】
一个PHP实现的轻量级简单爬虫
最近需要收集资料,在浏览器上用另存为的方式实在是很麻烦,而且不利于存储和检索。所以自己写了一个小爬虫,在网上爬东西,迄今为止,已经爬了近百 万张网页。现在正在想办法着手处理这些数据。
爬虫的结构:
爬虫的原理其实很简单,就是分析下载的页面,找出其中的连接,然后再下载这些链接,再分析再下载,周而复始。在数据存储方面,数据库是首选,便于检索,而 开发语言,只要支持正则表达式就可以了,数据库我选择了mysql,所以,开发脚本我选择了php。它支持perl兼容正则表达式,连接mysql很方 便,支持http下载,而且windows系统和linux系统都可以部署。
正则表达式:
正则表达式是处理文字的基本工具,要取出html中的链接和图片,使用的正则表达式如下。
复制代码 代码如下:
"#
]+href=(['\"])(.+)\\1#isU" 处理链接
"#
]+src=(['\"])(.+)\\1#isU" 处理图片
其他问题:
写爬虫还需要注意的一个问题是,对于已经下载过的url,不能重复进行下载,而有些网页的链接会形成环路,所以需要处理这个问题,我的处理方法是计算已经 处理的url的MD5 值,并存入数据库,这样就可以检验是否已经下载过。当然还有更好的算法,有兴趣的话,可以在网上找一下。
相关协议:
爬虫也有自己的协议,有个robots.txt文件定义了那些是网站允许遍历的,但是由于我的时间有限,没有实现这个功能。
其他说明:
php支持类编程,我写的爬虫主要的类.
1.url处理web_site_info,主要用处理url,分析域名等。
2.数据库操作mysql_insert.php,处理和数据库相关的操作。
3.历史记录处理,记录已经处理的url。
4.爬虫类。
存在的问题和不足
这个爬虫在小数据量的情况下,运行良好,但是在大数据量的情况下,历史记录处理类的效率就不是很高,通过在数据库结构中,对相关字段进行了索引,速度有了 提高,但是需要不断得读取数据,可能和php本身的array实现有关系,如果一次加载10万条历史记录,速度非常慢。
不支持多线程,每次只能处理一个url。
php运行本身有内存使用量限制,有一次在抓取深度为20的页面的时候,内存用尽程序被杀。
下面的url是源码下载。
http://xiazai.zwyuanma.com/201506/other/net_spider.rar
使用的时候,先在mysql中创建net_spider数据库,然后用db.sql创建相关表。再在config.php中设置mysql 的用户名口令。
最后
复制代码 代码如下:
php -f spider.php 深度(数值) url
就可以开始工作。如
复制代码 代码如下:
php -f spider.php 20 http://news.sina.com.cn
现在感觉下来,其实做个爬虫没那么复杂,难的是数据的存储和检索。我现在的数据库,最大一个数据表已经15G,正在想办处理这些数据,mysql进 行查询已经感觉有点力不从心了。这点上还真佩服google
#加载页面
function curl_get($url){
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_HEADER,1);
$result=curl_exec($ch);
$code=curl_getinfo($ch,CURLINFO_HTTP_CODE);
if($code!='404' && $result){
return $result;
}
curl_close($ch);
}
#获取页面url链接
function get_page_urls($spider_page_result,$base_url){
$get_url_result=preg_match_all("/<[a|A].*?href=[\'\"]{0,1}([^>\'\"\]*).*?>/",$spider_page_result,$out);
if($get_url_result){
return $out[1];
}else{
return;
}
}
#相对路径转绝对路径
function xdtojd($base_url,$url_list){
if(is_array($url_list)){
foreach($url_list as $url_item){
if(preg_match("/^(http:\/\/|http:\/\/|javascript:)/",$url_item)){
$result_url_list[]=$url_item;
}else {
if(preg_match("/^\//",$url_item)){
$real_url = $base_url.$url_item;
}else{
$real_url = $base_url."/".$url_item;
}
#$real_url = 'http://www.sumpay.cn/'.$url_item;
$result_url_list[] = $real_url;
}
}
return $result_url_list;
}else{
return;
}
}
#删除其他站点url
function other_site_url_del($jd_url_list,$url_base){
if(is_array($jd_url_list)){
foreach($jd_url_list as $all_url){
echo $all_url;
if(strpos($all_url,$url_base)===0){
$all_url_list[]=$all_url;
}
}
return $all_url_list;
}else{
return;
}
}
#删除相同URL
function url_same_del($array_url){
if(is_array($array_url)){
$insert_url=array();
$pizza=file_get_contents("/tmp/url.txt");
if($pizza){
$pizza=explode("\r\n",$pizza);
foreach($array_url as $array_value_url){
if(!in_array($array_value_url,$pizza)){
$insert_url[]=$array_value_url;
}
}
if($insert_url){
foreach($insert_url as $key => $insert_url_value){
#这里只做了参数相同去重处理
$update_insert_url=preg_replace('/=[^&]*/','=leesec',$insert_url_value);
foreach($pizza as $pizza_value){
$update_pizza_value=preg_replace('/=[^&]*/','=leesec',$pizza_value);
if($update_insert_url==$update_pizza_value){
unset($insert_url[$key]);
continue;
}
}
}
}
}else{
$insert_url=array();
$insert_new_url=array();
$insert_url=$array_url;
foreach($insert_url as $insert_url_value){
$update_insert_url=preg_replace('/=[^&]*/','=leesec',$insert_url_value);
$insert_new_url[]=$update_insert_url;
}
$insert_new_url=array_unique($insert_new_url);
foreach($insert_new_url as $key => $insert_new_url_val){
$insert_url_bf[]=$insert_url[$key];
}
$insert_url=$insert_url_bf;
}
return $insert_url;
}else{
return;
}
}
$current_url=$argv[1];
$fp_puts = fopen("/tmp/url.txt","ab");//记录url列表
$fp_gets = fopen("/tmp/url.txt","r");//保存url列表
$url_base_url=parse_url($current_url);
if($url_base_url['scheme']==""){
$url_base="http://".$url_base_url['host'];
}else{
$url_base=$url_base_url['scheme']."://".$url_base_url['host'];
}
do{
$spider_page_result=curl_get($current_url);
#var_dump($spider_page_result);
$url_list=get_page_urls($spider_page_result,$url_base);
#var_dump($url_list);
if(!$url_list){
continue;
}
$jd_url_list=xdtojd($url_base,$url_list);
#var_dump($jd_url_list);
$result_url_arr=other_site_url_del($jd_url_list,$url_base);
var_dump($result_url_arr);
$result_url_arr=url_same_del($result_url_arr);
#var_dump($result_url_arr);
if(is_array($result_url_arr)){
$result_url_arr=array_unique($result_url_arr);
foreach($result_url_arr as $new_url) {
fputs($fp_puts,$new_url."\r\n");
}
}
}while ($current_url = fgets($fp_gets,1024));//不断获得url
preg_match_all("/
]+href=[\"']([^\"']+)[\"'][^>]+>/",$spider_page_result,$out);
# echo a href
#var_dump($out[1]);
?>
上一篇:
用PHP的socket实现客户端到服务端的通信实例详解
下一篇:
学习php设计模式 php实现状态模式
相关内容
•
在Ubuntu 18.04上安装PHP 7.3 7.2和7.0的方法
•
用PHP做了一个领取优惠券活动的示例代码
•
因str_replace导致的注入问题总结
•
一文掌握PHP Xdebug 本地与远程调试(小结)
•
详细对比php中类继承和接口继承
•
网站被恶意镜像怎么办 php一段代码轻松搞定(全面版)
•
通过PHP设置BugFree获取邮箱通知
•
使用PHP反射机制来构造_CREATE TABLE_的sql语句
•
实例说明js脚本语言和php脚本语言的区别
•
实例介绍PHP删除数组中的重复元素
•
实例讲解通过PHP创建数据库
•
实例讲解PHP中使用命名空间
•
实例讲解PHP验证邮箱是否合格
•
实例讲解php将字符串输出到HTML
•
实例分析10个PHP常见安全问题
•
深入理解 PHP7 中全新的 zval 容器和引用计数机制
•
如何让PHP编码更加好看利于阅读
•
浅析PHP 中move_uploaded_file 上传中文文件名失败
•
浅谈PHP无限级分类原理
•
浅谈php使用curl模拟多线程发送请求
•
浅谈PHP各环境下的伪静态配置
•
浅谈php调用python文件
•
浅谈php的TS和NTS的区别
•
浅谈php___filter的妙用
•
浅谈PHPANALYSIS提取关键字
•
浅谈PHP SHA1withRSA加密生成签名及验签
•
利用PHP如何统计Nginx日志的User Agent数据
•
简单实用的PHP文本缓存类实例
•
关于PHP虚拟主机概念及如何选择稳定的PHP虚拟主机
•
定位地理位置PHP判断员工打卡签到经纬度是否在打卡之内
•
不常用但很实用的PHP预定义变量分析
•
安装docker和docker-compose实例详解
•
Windows环境下安装PHP Pear的方法图文教程
•
vmware linux系统安装最新的php7图解
•
safari下载文件自动加了html后缀问题
•
PHP字符串中抽取子串操作实例分析
•
PHP中引用类型和值类型功能与用法示例
•
PHP中数组转换为SimpleXML教程
•
PHP中使用CURL发送get_post请求上传图片批处理功能
•
PHP中上传文件打印错误错误类型分析
•
PHP中散列密码的安全性分析
•
php中目录操作opendir()、readdir()及scandir()用法示例
•
PHP中常见的密码处理方式和建议总结
•
PHP中“=>
•
PHP中__set()实例用法和基础讲解
•
PHP中Static(静态)关键字功能与用法实例分析
•
PHP中soap用法示例【SoapServer服务端与SoapClient客户端编写】
•
PHP智能识别收货地址信息实例
•
PHP支付宝当面付2.0代码
•
php原生数据库分页的代码实例
•
PHP与Perl之间知识点区别整理
•
PHP一个简单的无需刷新爬虫
•
PHP压缩图片功能的介绍
•
php学习笔记之字符串常见操作总结
•
PHP信号处理机制的操作代码讲解
•
PHP下载大文件失败并限制下载速度的实例代码
•
PHP文件上传小程序 适合初学者学习!
•
PHP文件类型检查及fileinfo模块安装使用详解
•
PHP文件操作实例总结【文件上传、下载、分页】
•
PHP微商城开源代码实例
•
php往mysql中批量插入数据实例教程
•
PHP图像处理技术实例总结【绘图、水印、验证码、图像压缩】
•
PHP通过文件路径获取文件名的实例代码
•
PHP添加文字水印或图片水印的水印类完整源代码与使用示例
•
PHP添加PNG图片背景透明水印操作类定义与用法示例
•
php数组遍历类与用法示例
•
PHP数字金额转换成中文大写显示
•
PHP数据对象映射模式实例分析
•
PHP树形结构tree类用法示例
•
PHP示例演示发送邮件给某个邮箱
•
php使用socket调用http和smtp协议实例小结
•
PHP使用SOAP调用API操作示例
•
php使用pecl方式安装扩展操作示例
•
PHP使用mysqli同时执行多条sql查询语句的实例
•
PHP使用mongoclient简单操作mongodb数据库示例
•
PHP使用HTML5 FormData对象提交表单操作示例
•
PHP使用ajax的post方式下载excel文件简单示例
•
PHP使用 Pear 进行安装和卸载包的方法详解
•
PHP实时统计中文字数和区别
•
PHP时间戳和日期相互转换操作实例小结
•
PHP生成指定范围内的N个不重复的随机数
•
php生成word并下载代码实例
•
php如何利用pecl安装mongodb扩展详解
•
PHP如何将图片文件上传到另外一台服务器上
•
php如何计算两坐标点之间的距离
•
PHP如何根据文件头检测文件类型实例代码
•
PHP如何防止XSS攻击与XSS攻击原理的讲解
•
PHP如何搭建百度Ueditor富文本编辑器
•
php如何把表单内容提交到数据库
•
PHP去除空数组且数组键名重置的讲解
•
PHP配置ZendOpcache插件加速
•
PHP模糊查询技术实例分析【附源码下载】
•
php面试中关于面向对象的相关问题
•
PHP利用DWZ.CN服务生成短网址
•
PHP里的$_GET数组介绍
•
PHP结合Ffmpeg快速搭建流媒体服务的实践记录
•
PHP将整数数字转换为罗马数字实例分享
•
PHP将英文数字转换为阿拉伯数字实例讲解
•
PHP集成环境XAMPP的安装与配置
•
PHP基础之输出缓冲区基本概念、原理分析
•
php获取用户真实IP和防刷机制的实例代码
•
php获取手机端的号码以及ip地址实例代码
•
PHP回调函数简单用法示例
•
PHP后台备份MySQL数据库的源码实例
•
PHP后期静态绑定之self__限制实例分析
•
PHP后期静态绑定实例浅析
•
php和asp语法上的区别总结
•
PHP观察者模式实例分析【对比JS观察者模式】
•
PHP观察者模式定义与用法实例分析
•
PHP关于foreach复制知识点总结
•
PHP根据key删除数组中指定的元素
•
PHP各种常见经典算法总结【排序、查找、翻转等】
•
php防止表单重复提交实例讲解
•
PHP二维索引数组的遍历实例分析【2种方式】
•
PHP调用全国天气预报数据接口查询天气示例
•
PHP递归算法的简单实例
•
PHP递归的三种常用方式
•
PHP登录验证功能示例【用户名、密码、验证码、数据库、已登陆验证、自动登录和注销登录等】
•
php的优点总结 php有哪些优点
•
php的扩展写法总结
QQ客服
公众号
手机版
帮助中心