最近写了一个简单的搜索引擎,将网易首页中的新闻扒下来进行整理,并能够进行搜索。
以下使用的开发环境是eclipse。
上工程结构图:
首先讲解网络爬虫部分。
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。
在这里,用到了jsoup 。jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
jsoup开发手册 http://www.open-open.com/jsoup/
jsoup下载地址 http://jsoup.org/download
jsoup的jar包下载之后,导入我们的工程里就行了。
以下是获取首页中社会新闻的超链接以及插入数据库的代码。
import java.sql.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class getURL{
public static void main(String[] args) {
try{
Document doc = Jsoup.connect("http://www.163.com").get();
Elements link=doc.select("a[href^=http://news.163.com/15]");
System.out.println("Links: "+link.size());
for (Element links : link) {
String url=links.attr("href");
System.out.println( url);
Class.forName("com.mysql.jdbc.Driver");
Connection conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/search?useUnicode=true&characterEncoding=utf-8","root","123456");
System.out.println(url);
PreparedStatement pstmt=conn.prepareStatement("insert into geturl(url)values(?)");
pstmt.setString(1,url);
pstmt.executeUpdate();
}
}catch(Exception e){
System.out.print("错误:"+e.getMessage());
}
}
}
程序运行结果如下
Links: 69
http://news.163.com/15/1018/10/B6714LQS00011229.html#f=resyswwwrank
http://news.163.com/15/1018/10/B6714LQS00011229.html#f=resyswwwrank
http://news.163.com/15/1018/01/B663HA6D00014Q4P.html#f=resyswwwrank
http://news.163.com/15/1018/01/B663HA6D00014Q4P.html#f=resyswwwrank
http://news.163.com/15/1018/00/B65VL94N00014AED.html#f=resyswwwrank
http://news.163.com/15/1018/00/B65VL94N00014AED.html#f=resyswwwrank
http://news.163.com/15/1018/09/B66S1BLF00011229.html#f=resyswwwrank
http://news.163.com/15/1018/09/B66S1BLF00011229.html#f=resyswwwrank
http://news.163.com/15/1018/11/B674F41400011229.html#f=resyswwwrank
获取了链接地址后,就开始到网页中扒取具体的新闻标题和内容了,并且要插入数据库。
import java.sql.*;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
public class getArtical {
public static void main(String[] args) {
Connection conn= null;
PreparedStatement pstmt = null;
ResultSet rs=null;
try{
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/search?useUnicode=true&characterEncoding=utf-8","root","123456");
pstmt=conn.prepareStatement("select url from geturl ");
rs=pstmt.executeQuery();
while(rs.next()){
Document doc = Jsoup.connect(rs.getString("url")).get();
Elements head=doc.select("h1");
Elements pageContent=doc.select("p");
String title=head.text();
String content=pageContent.text();
System.out.println(title);
pstmt=conn.prepareStatement("insert into artical(title,content,url)values(?,?,?)");
pstmt.setString(1,title);
pstmt.setString(2,content);
pstmt.setString(3,rs.getString("url"));
pstmt.executeUpdate();
}
}catch(Exception e){
System.out.print("错误:"+e.getMessage());
}
}
}
运行结果如下
广州晒天价采购预算:U盘千元 办公室1平米140万
男子说"他妈的"被起诉 法官引鲁迅文章判其无罪
媒体揭少林师徒反目史:亿元武校背后的权钱博弈
"海天盛筵"女主角涉卖淫被抓 曾被曝3天赚60万
海天盛筵外围女涉嫌组织卖淫被抓 名企老总涉案
昆明航空多名空姐被恶搞塞进行李架(图)
以上两段程序的运行结果,行数还有很多,为了节省篇幅,我只截取了其中的一部分。这是因为,扒取网页内容的输出,只是为了更方便的知道我们扒取网页成功了。
但不论是否输出,对于搜索引擎的后续工作是没有影响的。
那么,现在网页内容已经扒取完毕,接下来该做什么呢?请见后续文章,[搜索引擎——http://www.jianshu.com/p/3e84e02626fd
此项目的完整代码可以到我的github,search-engine进行下载。
网友评论