[PHP] 广度优先搜索匹配网站所有链接
<?php
define('PRE_DOMAIN','www');
define('DOMAIN','sina.com.cn');
define('PROTOCOL','https');
define('ROOT',PROTOCOL.'://'.PRE_DOMAIN.'.'.DOMAIN.'/'); foreach (spider() as $key => $value) {
echo $value."\r\n";
} function spider(){
$headers=array(
'user-agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
);
$oUrls=parseURL(get(ROOT,$headers));
$result=array();
$queue=array();
foreach($oUrls as $u){
$result[$u]=true;
array_push($queue,$u);
while(!empty($queue)){
$v=array_pop($queue);
$temp=parseURL(get($v,$headers));
foreach($temp as $j){
if(!isset($result[$j])){
yield $j;
$result[$j]=true;
array_push($queue,$j);
}
}
}
}
}
function get($url,$header=null){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
if (!empty($header)){
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
}
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 3);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($curl); $h = curl_getinfo($curl);
if(!empty($h) && $h['http_code']==200 && stripos($h['content_type'],'text/html')===false){
return "";
}
curl_close($curl);
return $output; }
function parseURL($content){
preg_match_all('/<a.*href=["\']([^"\'>]*)["\'].*>/', $content,$matchs);
if(empty($matchs[1])) return array();
$match=$matchs[1];
foreach ($match as $key => $value) {
$flag=false;
if(stripos($value, 'http')!==false && stripos($value,DOMAIN)===false){
$flag=true;
}
if(stripos($value, '//')===0 && stripos($value,DOMAIN)!==false){
$match[$key]='https:'.$value;
continue;
}
if(stripos($value, '//')===0 && stripos($value,DOMAIN)===false){
$flag=true;
}
if(stripos($value, 'javascript')===0||stripos($value, '#')===0){
$flag=true;
}
if($flag){
unset($match[$key]);
continue;
}
if(stripos($value,DOMAIN)!==false){
continue;
}
$match[$key]=ROOT.trim($value,'/');
}
return $match;
}
[PHP] 广度优先搜索匹配网站所有链接的更多相关文章
- 【算法导论】图的广度优先搜索遍历(BFS)
图的存储方法:邻接矩阵.邻接表 例如:有一个图如下所示(该图也作为程序的实例): 则上图用邻接矩阵可以表示为: 用邻接表可以表示如下: 邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表: ...
- 数据结构和算法总结(一):广度优先搜索BFS和深度优先搜索DFS
前言 这几天复习图论算法,觉得BFS和DFS挺重要的,而且应用比较多,故记录一下. 广度优先搜索 有一个有向图如图a 图a 广度优先搜索的策略是: 从起始点开始遍历其邻接的节点,由此向外不断扩散. 1 ...
- js图的数据结构处理----邻链表,广度优先搜索,最小路径,深度优先搜索,探索时间拓扑
//邻居连表 //先加入各顶点,然后加入边 //队列 var Queue = (function(){ var item = new WeakMap(); class Queue{ construct ...
- python 实现图的深度优先和广度优先搜索
在介绍 python 实现图的深度优先和广度优先搜索前,我们先来了解下什么是"图". 1 一些定义 顶点 顶点(也称为"节点")是图的基本部分.它可以有一个名称 ...
- (转)广度优先搜索BFS和深度优先搜索DFS
1. 广度优先搜索介绍 广度优先搜索算法(Breadth First Search),又称为"宽度优先搜索"或"横向优先搜索",简称BFS. 它的思想是:从图中 ...
- 搜索类网站记录 && 代理服务器
搜索类网站记录 && 代理服务器 技巧 1.使用site 我们在搜索的时候,其实不全依赖搜索引擎也是可以的, 比如我们要搜索一个 “中国” ,可以在搜索框输入 中国 site ...
- CF1272E. Nearest Opposite Parity 题解 广度优先搜索
题目链接:http://codeforces.com/contest/1272/problem/E 题目大意: 有一个长度为n的数组 \(a\) ,数组坐标从 \(1\) 到 \(n\) . 假设你现 ...
- 0算法基础学算法 搜索篇第二讲 BFS广度优先搜索的思想
dfs前置知识: 递归链接:0基础算法基础学算法 第六弹 递归 - 球君 - 博客园 (cnblogs.com) dfs深度优先搜索:0基础学算法 搜索篇第一讲 深度优先搜索 - 球君 - 博客园 ( ...
- 【数据结构与算法Python版学习笔记】图——词梯问题 广度优先搜索 BFS
词梯Word Ladder问题 要求是相邻两个单词之间差异只能是1个字母,如FOOL变SAGE: FOOL >> POOL >> POLL >> POLE > ...
随机推荐
- .gitignore 文件没起作用
场景 修改了.gitignore文件, 但是查看状态还是没有忽略 解决 *. 清除git缓存, 注意最后有一个点 git rm -r --cache . 再之后就可以正常使用了, 基本恢复正常, 被忽 ...
- lua 13 模块(类似class)与包
转自: http://www.runoob.com/lua/lua-modules-packages.html 模块类似于一个封装库,从 Lua 5.1 开始,Lua 加入了标准的模块管理机制,可以把 ...
- git相关2
初学备忘: git安装好后,目录右键 => Git Bash here _________________________ 初始化仓库 git init 仓库名 配置仓库 git config ...
- hdu6492 暴力预处理 + 枚举
http://acm.hdu.edu.cn/showproblem.php?pid=6492 题意 他们一共有 n+m+2k 个人,包括 n+k 个男生,m+k 个女生,其中 k 对男女生为异性情侣, ...
- vue 路由跳转到本页面,ts 监听路由变化
@Watch('$route') routechange(to: any, from: any) { //参数不相等 if (to.query.name!=from.query.name) { //t ...
- vue中mode hash 和 history的区别
对于 Vue 这类渐进式前端开发框架,为了构建 SPA(单页面应用),需要引入前端路由系统,这也就是 Vue-Router 存在的意义.前端路由的核心,就在于 —— 改变视图的同时不会向后端发出请求. ...
- SpringDataRedis简单入门介绍
1:问题引入 在实际开发中,开发的每一个项目,每天都有大量的人访问,对数据库造成很大的访问压力,甚至是瘫痪.那如何解决呢?我们通常的做法有两种:一种是数据缓存.一种是网页静态化.我们今天讨论第一种解决 ...
- SpringBoot入门-SpringBoot性能优化
SpringBoot启动优化 显示声明扫包范围: 即不使用@SpringBootApplication默认扫包,使用@ComponentScan(basePackages = { "com. ...
- C# 中一个限制 Task 并发执行的数量的示例
直接贴代码了: using System; using System.Linq; using System.Threading; using System.Threading.Tasks; class ...
- Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'jdbc.username' in string value "${jdbc.username}"
1.启动dubbo的引用dubbo服务时候报下面这个错误,这是由于去找dubbo的发布服务未找到报的错误,所以先启动dubbo的发布服务即可. [INFO] Scanning for projects ...