这篇文章,可能比较长,如果你觉得写得好可以把它看完,希望对你有所帮助。
写搜索引擎先整理下思路大致分为三步:
从网上爬取数据,对拿到的数据进行整理即分词,然后通过关键字匹配拿到数据。我会详细介绍这三步。
先讲讲我要实现的效果,从网上拿到标题包括对应的地址,对标题进行分词,通过输入的关键字匹配分词,返回对应的网址。
一,爬取数据:
开始的时候对网站进行的一个垂直爬取,拿到它的个标题,A标签,后面发现在处理数据的时候,速度太慢了,就简化了操作,只对单个页面进行爬取。
1,爬取用到的包:
2,通过模拟浏览器,去访问网站,如果返回的code为200,说明访问成功,就可以将这个网页的数据进行下载。
3,拿到爬取后的数据,即将网页转化成一个String的形式,存下来了。然后通过正则表达式,选取我们所需要的标签,这里取的是a标签,这里会对A标签进行过滤和分组,只取到有连接的,在写正则时写多个分组,有利于后面拿到,标题,跟对应的地址。
4,拿到标题跟地址后,将地址中的“/”等进行替换,因为后面要将地址作为文件的名字,标题作为内容存到hdfs中。
爬取代码展示:
下载页面代码:
import java.io.BufferedInputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;
public class DownLoadTool {
//下载页面内容
public String downLoadUrl(String addr){
StringBuffer sb=new StringBuffer();
try {
URL url=new URL(addr);
HttpURLConnection con= (HttpURLConnection) url.openConnection();
con.setConnectTimeout(5000);
con.connect();
if(con.getResponseCode()==200){
BufferedInputStream bis=new BufferedInputStream(con.getInputStream());
Scanner sc=new Scanner(bis,"GBK");
while(sc.hasNextLine()){
sb.append(sc.nextLine());
}
}
} catch (Exception e) {
e.printStackTrace();
}
return sb.toString();
}
}
正则表达式匹配代码:
import java.io.File;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//标题下载类
public class TiltelDownLoad {
//取出图片的html标记<a[^>]*? href=[""'](?<url>[^""']*?)[""'][^>]*?>(?<text>[\w\W]*?)</a>
//<\\s*a\\s+([^>]*)\\s*></a>
//<\\s*a\\s+([^>]*)\\s*>([^>]*)</a>";
//<\\s*a\\s+([^>]*)\\s*>([^>]*)</a>
//<\\s*a\\s+href\\s*=\\s*\"?http://(.*?)(\"|>|\\s+)([^>]*)\\s*>([^>]*)</a>
static String a_url="<\\s*a\\s+href\\s*=\\s*\"?http://(.*?)(\"|>|\\s+)([^>]*)\\s*>(.+?)</a>";
//取出图片中的src内容
static String href_url="href\\s*=\\s*\"?(.*?)(\"|>|\\s+)";
//取出图片中的alt内容
static String alt_url="alt\\s*=\\s*\"?(.*?)(\"|>|\\s+)";
//取出图片的标签
public Set<String> getTilteLink(String html){
Set<String> result=new HashSet<String&