php 实现简单爬虫
2016-01-30 23:32
666 查看
大部分是由他人博客转载而来, 只是根据目前自己的情况进行了部分修改.
main() 是主程序, 该程序主要是通过 输入一个起始地址, 比如 www.hao123.com 然后进行url 的搜索 ,将页面中所有url 保存到 url.txt文件中, 将所有页面的图片地址 保存到url-img.txt 中
保存到本地的方式被注销了, 即 取消 //GrabImage($url,$filename=""); 这个的注销 就是进行保存 不过目前经常只能保存30张左右, 还不知道是网络问题还是文件命名的问题.
明天可以继续尝试.
-------------------------------------------------------------------
昨天准备今天继续尝试, 结果今天做客有事 忙了一天, 所以php 的爬虫目前就完成到这, 我明天准备开始用python写爬虫.因为毕竟主流的爬虫程序还是不太用php的..
<?php /** * 爬虫程序 -- 原型 * * 从给定的url获取html内容 * * @param string $url * @return string */ function _getUrlContent($url) { $handle = fopen($url, "r"); if ($handle) { $content = stream_get_contents($handle, 1024 * 1024); return $content; } else { return false; } } /** * 从html内容中筛选链接 * * @param string $web_content * @return array */ function _filterUrl($web_content) { $reg_tag_a = '/<[a|A].*?href=[\'\"]{0,1}([^>\'\"\ ]*).*?>/'; $result = preg_match_all($reg_tag_a, $web_content, $match_result); if ($result) { return $match_result[1]; } } function _filterimg($web_content){ $reg_tag_img = "/<img[^>]*src\=\"(([^>]*)(jpg|gif|png|bmp|jpeg))\"/i"; $result = preg_match_all($reg_tag_img, $web_content, $match_result); if($result){ return $match_result[1]; } } /** * 修正相对路径 * * @param string $base_url * @param array $url_list * @return array */ function _reviseUrl($base_url, $url_list) { $url_info = parse_url($base_url); $base_url = $url_info["scheme"] . '://'; if ($url_info["user"] && $url_info["pass"]) { $base_url .= $url_info["user"] . ":" . $url_info["pass"] . "@"; } $base_url .= $url_info["host"]; if ($url_info["port"]) { $base_url .= ":" . $url_info["port"]; } $base_url .= $url_info["path"]; print_r($base_url); if (is_array($url_list)) { foreach ($url_list as $url_item) { if (preg_match('/^http/', $url_item)) { // 已经是完整的url $result[] = $url_item; } else { // 不完整的url $real_url = $base_url . '/' . $url_item; $result[] = $real_url; } } return $result; } else { return; } } /** * 爬虫 * * @param string $url * @return array */ function crawler($url) { $content = _getUrlContent($url); if ($content) { $url_list = _reviseUrl($url, _filterUrl($content)); if ($url_list) { return $url_list; } else { return ; } } else { return ; } } function crawler_img($url){ $content = _getUrlContent($url); if ($content) { $img_list = _filterimg($content);; if ($img_list) { return $img_list; } else { return ; } } else { return ; } } /** * 测试用主程序 */ function main() { $current_url = "https://hao.360.cn/"; //初始url $fp_puts = fopen("url.txt", "ab"); //记录url列表 $fp_gets = fopen("url.txt", "r"); //保存url列表 $fp_puts_img = fopen("url-img.txt", "ab"); do { $content = _getUrlContent($current_url); $img_url = _filterimg($content); foreach($img_url as $url){ fputs($fp_puts_img, $url."\r\n"); //echo $url; //echo "<br >"; //GrabImage($url,$filename=""); } $result_url_arr = crawler($current_url); if ($result_url_arr) { foreach ($result_url_arr as $url) { fputs($fp_puts, $url."\r\n"); } } } while ($current_url = fgets($fp_gets, 1024)); //不断获得url //echo "ok"; } //以下是抓取网络图片到本地 // $url 是远程图片的完整URL地址,不能为空。 // $filename 是可选变量: 如果为空,本地文件名将基于时间和日期 // 自动生成. function GrabImage($url,$filename="") { if($url==""):return false;endif; $path="download/"; //指定存储文件夹 //若文件不存在,则创建; if(!file_exists($path)){ mkdir($path); } if($filename=="") { $ext=strrchr($url,"."); if($ext!=".gif" && $ext!=".jpg" && $ext!=".bmp" && $ext!=".jpeg" && $ext!=".png"):return false;endif; $filename=$path.date("dMYHis").$ext; } ob_start(); readfile($url); $img = ob_get_contents(); ob_end_clean(); $size = strlen($img); $fp2=@fopen($filename, "a"); fwrite($fp2,$img); fclose($fp2); return $filename; } function main_1(){ $current_url = "https://hao.360.cn/"; //初始url $content = _getUrlContent($current_url); $img_url = _filterimg($content); foreach($img_url as $url){ //echo $url; //echo "<br >"; GrabImage($url,$filename=""); } } //main_1(); main(); ?>
main() 是主程序, 该程序主要是通过 输入一个起始地址, 比如 www.hao123.com 然后进行url 的搜索 ,将页面中所有url 保存到 url.txt文件中, 将所有页面的图片地址 保存到url-img.txt 中
保存到本地的方式被注销了, 即 取消 //GrabImage($url,$filename=""); 这个的注销 就是进行保存 不过目前经常只能保存30张左右, 还不知道是网络问题还是文件命名的问题.
明天可以继续尝试.
-------------------------------------------------------------------
昨天准备今天继续尝试, 结果今天做客有事 忙了一天, 所以php 的爬虫目前就完成到这, 我明天准备开始用python写爬虫.因为毕竟主流的爬虫程序还是不太用php的..
相关文章推荐
- php全局变量GLOBAL
- PHP 正则表达式
- php中数组排序
- DESTOON 配置文件config.inc.php参数说明
- php中创建关联数组,以及遍历数组
- php创建数值数组
- 分享一个PHP抽奖算法程序代码
- php如何获取远程文件内容的函数
- php验证邮箱和ip地址方法总汇
- php正则匹配文章中的远程图片地址并下载图片到本地
- php 图片操作类,支持生成缩略图,添加水印,上传缩略图
- php设计模式:值对象模式
- js 类似php 静态类的使用方法
- yii2 安装
- PHP面向对象深入研究之【了解类】与【反射API】
- php 解决8个小时时间差的方法,可以从下面三种情况考虑
- isset() 、empty()与is_null的区别
- php实现抓取淘宝商品价格人气源码
- ThinkPHP - CURD增删改查操作
- PHP面向对象深入研究之【命名空间】与【自动加载类】