分享好友 最新动态首页 最新动态分类 切换频道
人工智能-项目实践-搜索引擎-基本的垂直搜索引擎,实现了基本的网络爬虫功能以及用Luence实现检索
2024-12-26 08:45
package download;

人工智能-项目实践-搜索引擎-基本的垂直搜索引擎,实现了基本的网络爬虫功能以及用Luence实现检索

import java.io.IOException; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.ArrayList; import org.jsoup.Connection.Response; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import utils.MySQL; import java.util.concurrent.Callable; public class Download implements Callable<Boolean> { private MaintainLinks maintainQueue = new MaintainLinks(); private Db db = new Db(); private boolean full = false; private static final int expextedLinks = 150000; private static String ua = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36"; public static void main(String[] args) { String start = "http://www.zol.com.cn/"; Document doc = null; try { Response res = Jsoup.connect(start).response(); // res.header(""); doc = res.parse(); } catch (IOException e) { e.printStackTrace(); } getAllLinks(doc); } @Override public Boolean call() throws Exception { while (!maintainQueue.isWaitEmpty()) { maintainQueue.addWait(cachedWait); cachedWait.clear(); ArrayList<String> currentQueue = maintainQueue.getOptWait(); for (String url : currentQueue) { if (!maintainQueue.hasDownloaded(url)) { download(url); } } System.out.println("线程:" + Thread.currentThread().getId() + ";当前队列链接数:" + maintainQueue.waitSize() + "已下载:" + maintainQueue.downloadSize()); // if (!full) { full = maintainQueue.waitSize() > expextedLinks; } } db.commit(); db.finalise(); maintainQueue.persistence(); return true; } // private HashSet<String> cachedSuccess = new HashSet<String>(); private ArrayList<String> cachedWait = new ArrayList<String>(); public void download(String url) { WrapDownload result = null; try { result = Download.getPage(url); // db.addBatch(result); db.addBatch(result); // 下载队列里面只保存前100w个网页 if (!full) { cachedWait.addAll(result.getLinkList()); } maintainQueue.addSuccess(url); } catch (IOException e) { // e.printStackTrace(); maintainQueue.addFailed(url); System.err.println(url + "下载失败"); } } public static WrapDownload getPage(String url) throws IOException { Document doc = null; doc = Jsoup.connect(url).userAgent(ua).timeout(10000).get(); return new WrapDownload(getAllLinks(doc), getText(doc), url); } public static ArrayList<String> getAllLinks(Document doc) { ArrayList<String> linkList = new ArrayList<String>(); String url = ""; int temp = 0; Elements elements = doc.select("a[href]"); for (Element e : elements) { String attr = e.attr("href"); if (attr.startsWith(".")) { url = e.baseUri() + e.attr("href").substring(1); url = url.replace("//", "/").replace("http:/", "http://"); if((temp=url.indexOf("#"))!=-1){ url = url.substring(0,temp); } if(url.endsWith("/")){ url = url.substring(0,url.length()-1); } linkList.add(url); } else if (attr.startsWith("http")) { url = e.attr("href"); if((temp=url.indexOf("#"))!=-1){ url = url.substring(0,temp); } if(url.endsWith("/")){ url = url.substring(0,url.length()-1); } linkList.add(url); } } return linkList; } public static String getText(Document doc) { return doc.html(); } public class Db { public PreparedStatement ps = null; public int count = 0; private int fail = 0; private MySQL mysql; public Db() { String sql = "INSERT INTO html(url,html_text) VALUES(?,?)"; mysql = new MySQL(); try { mysql.conn.setAutoCommit(false); ps = mysql.conn.prepareStatement(sql); } catch (SQLException e) { e.printStackTrace(); } } public void addBatch(WrapDownload data) { try { ps.setString(1, data.getUrl()); ps.setString(2, data.getHtml()); ps.addBatch(); count++; if (count % 20 == 0) { ps.executeBatch(); mysql.conn.commit(); } } catch (SQLException e) { e.printStackTrace(); System.out.println(data.getUrl() + "存储失败" + (++fail)); } } public void commit() { try { ps.executeBatch(); mysql.conn.commit(); } catch (SQLException e) { e.printStackTrace(); } } public void finalise() { try { mysql.conn.close(); } catch (SQLException e) { e.printStackTrace(); } System.out.println("共失败" + fail); } public void insert(WrapDownload data) { String sql = "INSERT INTO html(url,html_text) VALUES(?,?)"; try { PreparedStatement ps = mysql.conn.prepareStatement(sql); ps.setString(1, data.getUrl()); ps.setString(2, data.getHtml()); ps.executeBatch(); } catch (SQLException e) { System.out.println(data.getUrl()); e.printStackTrace(); } } }
最新文章
GPTsApp官网体验入口 GPTs人工智能应用商店在线使用地址
GPTs App是一个创新的人工智能应用商店,专注于提供定制的 ChatGPT 应用。通过集成 OpenAI 的先进技术,GPTs App致力于推荐和排名各类GPTs,以满足用户在内容创作、教育、效率提升、讲故事、搜索引擎优化和数据分析等多种场景的需求。GPTs
cydia队列?sileo怎么安装cydia插件啊
完成后点击页面底部的队列选项,打开后会看到正在安装插件,点击确定即可,安装成功之后点击退出sileo,然后就可以在桌面看到cydia了。不过需要注意的是,手机越狱是具有一定风险的,尤其是在越狱后手机就不在保修范围了,对于这一点还是需
147SEO-免费采集工具
147SEO-免费采集工具市面上常见非常多的采集工具,例如147SEO、水淼、火车头等,那么众多采集工具我们该如何选择以及使用呢。首先,如果建一个网站,一定是要不断的完善内容,那么问题来了,网站内容的日常更新成为了网站可持续发展的一个
3D15日连号走势图近1000期带连线
功能类福彩3D显示遗漏:显示/隐藏遗漏值,遗漏值是指自上期开出到本期间隔的期数。福彩3D遗漏分层:是将当前遗漏值用柱状图形标注。福彩3D分段线:是每五期使用分隔线,使横向导航更加清晰。福彩3D显示断区:在分区走势中使用,将开出0个号
G2O详解与曲线拟合示例
在了解SLAM的原理、流程后,个人经常实时困惑该如何去从零开始去设计编写一套能够符合我们需求的SLAM框架。作者认为Ceres、Eigen、Sophus、G2O这几个函数库无法避免,尤其是Ceres函数库在激光SLAM和V-SLAM的优化中均有着大量的
2025中国企业出海洞察及全球趋势展望
(一)中国企业,走向全球不论行业还是市场,中国企业辐射圈边界正在不断扩大。2024年前10个月,我国货物贸易出口总值达到20.8万亿元,同比增长6.7%。从传统制造业到新兴科技领域,从小家电到服饰行业,中国品牌的足迹如今已经遍布全球。早
2024年热门手游排行榜 必玩的手机游戏推荐
的便捷性令它们很受年轻玩家的偏爱,也因此缔造出了不少爆款之作,所以本次要奉上的就是2024年热门手游排行榜,带各位去认识下那些人气非常夸张的高质量手游,它们虽然在风格和玩法上都各不相同,但都能为玩家们提供不错的游戏乐趣,是喜欢
2023杭州普洱茶权威榜单:精选推荐与消费者指南
普洱茶作为中国茶文化的必不可少组成部分以其独到的醇厚口感和丰富的养生功效深受广大茶友的喜爱。近年来随着人们生活水平的增强和对健康生活形式的追求普洱茶在中国茶界的地位日益提升。特别是在杭州这座充满韵味的城市不仅是中国著名的丝
AI算力芯片板块再创新高:润欣科技领涨,市场热度持续攀升
2024年12月12日,AI算力芯片板块再度发力,整体上涨2.17%,其中润欣科技以亮眼的表现成为板块领涨者。这一动态无疑再次点燃了投资者对AI行业的热情。当天,上证指数报收于3461.5点,涨幅为0.85%;深证成指则报收于10957.13点,涨幅达到1.0%
2025年山东省职业院校技能大赛高职组信息安全管理与评估 (样题)
2、下列数据类型不属于静态数据提取的数据类型()。A、系统日志B、系统进程C、网络数据包D、文件元数据3、安全评估的方法不包括( )。A、风险评估B、威胁建模C、减少扫描D、渗透测试4、以下不属于入侵监测系统的是()。A、AAFID系统B、SNORT系
相关文章
推荐文章
发表评论
0评