java之爬虫
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,近期研究爬虫爬取网站链接:1.需要获取所有超链接2.排除已爬取的链接,去重3.爬虫的广度和深度方向研究(ps:目前没有研究彻底)以下是实现代码:import java.io.BufferedReade
千家信息网最后更新 2026年11月02日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安全错误
数据库的锁怎样保障安全
手冲咖啡和咖啡机区别
什么是科技互联网
湖北九亚互联网络科技有限公司
广州紫鲸互联网科技有限公司
西安纸贵互联网科技有限公司
科技互联网龙头
互联网科技与金融科技
以房互联网科技
亿策互联网科技
浩特互联网科技
互联网科技股有哪些
互联网科技类展会
以后互联网后是啥科技
互联网公司科技股
广州新华互联网科技学校电竞方面
互联网科技创新的路径
互联网科技如何创业
易企秀互联网科技是做什么的
广东鹅鹅鹅互联网科技有限公司
重庆科技产业互联网有哪些
互联网科技企业
碳银互联网科技
亿人帮互联网科技
互联网前沿科技
阿大互联网科技有限公司
互联网保险科技创业
江苏互联网智能科技软件
厦门江牛科技互联网
互联网与数字科技关系
中国主要互联网科技公司