java之爬虫
发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,近期研究爬虫爬取网站链接:1.需要获取所有超链接2.排除已爬取的链接,去重3.爬虫的广度和深度方向研究(ps:目前没有研究彻底)以下是实现代码:import java.io.BufferedReade
千家信息网最后更新 2025年01月31日java之爬虫
近期研究爬虫爬取网站链接:
1.需要获取所有超链接
2.排除已爬取的链接,去重
3.爬虫的广度和深度方向研究(ps:目前没有研究彻底)
以下是实现代码:
import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.net.URL;import java.net.URLConnection;import java.util.ArrayList;import java.util.HashMap;import java.util.HashSet;import java.util.List;import java.util.Map;import java.util.Set;import java.util.regex.Matcher;import java.util.regex.Pattern;import javax.swing.plaf.synth.SynthSpinnerUI;public class study { private static List waitforUrl=new ArrayList<>();//存储抓取出来的url,等待爬 private static Set goforUrl=new HashSet<>();//存储爬过的url private static Map allUrldepth=new HashMap<>();//对所有url进行爬去深度判断 private static int Maxdepth=2; public static void main(String[] args) { String urlstr="............"; study.gourl(urlstr, 1); } public static void gourl(String urlstr,int depath) { if(!(goforUrl.contains(urlstr)||depath>Maxdepth)) { goforUrl.add(urlstr); try { URL url=new URL(urlstr); URLConnection urlConn=url.openConnection();//建立url链接 InputStream is=urlConn.getInputStream();//通过链接获取页面内容,为字节流 InputStreamReader isr=new InputStreamReader(is,"utf-8");//将字节流转化为字符流 BufferedReader br=new BufferedReader(isr);//读取字节流 StringBuffer sb=new StringBuffer();//实例化StringBuffer用来存储读取数据 String line=null; while((line=br.readLine())!=null) { sb.append(line); //System.out.println(line); Pattern p = Pattern.compile(""); Matcher m=p.matcher(line); while(m.find()) { String href=m.group(); href=href.substring(href.indexOf("href=")); if(href.charAt(5)=='\"'||href.charAt(5)=='\''){ href=href.substring(6); }else{ href=href.substring(5); } try { href=href.substring(0,href.indexOf("\"")); }catch(Exception e) { href=href.substring(0,href.indexOf("\'")); } waitforUrl.add(href); allUrldepth.put(href, depath+1); } } is.close();//关闭输出流 isr.close();//关闭字节流读取 br.close(); System.out.println(urlstr); System.out.println("链接总数:"+waitforUrl.size()+",已爬去链接数:"+goforUrl.size()); }catch(Exception e){ e.printStackTrace(); } } //用递归的方法继续爬取其他链接 String nexturl=waitforUrl.get(0); waitforUrl.remove(0); gourl(nexturl,allUrldepth.get(nexturl)); }}
遇到的问题:allUrldepth作为hashmap,当key值即url一样时存在value值即depath被覆盖问题
解决办法:通过判断hashmap里key值是否包含,包含就把原有depath添加进去
if(allUrldepth.containsKey(href)) {
allUrldepth.put(href,depath);
}else {
allUrldepth.put(href, depath+1);
}
问题:通过一个线程执行速度太慢,通过多线程解决
解决办法:
private static int MAX_THREAD=5;//记录总线程数5条private static Object obj=new Object();//Object对象,帮助进行线程的等待操作public class myThread extends Thread{ @Override public void run() { while(true) { if(waitforUrl.size()>0) { String url=waitforUrl.get(0); waitforUrl.remove(0); gourl(url, allUrldepth.get(url)); }else { System.out.println("当前线程准备就绪,等待连接爬取:"+this.getName()); //建立一个对象,让线程进入等待状态,即wait() synchronized(obj){ try{ obj.wait(); }catch(Exception e){ } } } } }
问题:由于截取的部分a标签之间同时存在单双引号,例如www.baidu.com' > 很赞哦!
链接
线程
问题
办法
存储
研究
爬虫
对象
标签
深度
贪婪
之间
代码
内容
前半部
同时
字符
字节
实例
广度
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
电子商务网络技术基础下载
山西小型软件开发技术
存储过程是数据库优化吗
数据库文件未记录号
剑桥晶体数据库怎么搜晶胞
直录播服务器 在线播放
关闭服务器自动分配内存
思悦智能数据库
苹果服务器在中国有什么用
mysql数据库图形界面
什么是数据库系统
蓝羽石院士网络安全
项目追踪软件开发
服务器安全隔离中
数据库中的规则是什么
网络安全影响业务
经信局网络安全周活动总结
广州数据网络技术开发分类
平凉市开展网络安全周宣传活动
服务器上的硬盘支持热插拔吗
软件开发 内存映射 大数据
数据库国产替代概念股一览
找回相机数据库文件
期货跨期套利软件开发
网络安全和网络意识形态关系
将数据库的数据转成json
计算机网络技术学生适合用电脑吗
网络安全综合分析报告
网络安全自查报告 银监
电脑打开服务器命令