大部分是由他人博客转载而来, 只是根据目前自己的情况进行了部分修改.
<?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的..