获取首页全部链接
- 这里我们使用jsoup框架(框架本身比较轻)
public void getPageUrl(String url){
Document doc = Jsoup.connect(url).get();
Elements aList = doc.select("a");
for (Element ele: aList) {
String href = ele.attr("href");
System.out.println(href);
}
}
递归每个页面中的链接
private ArrayList<String> listUrl = new ArrayList<String>();
public void getPageUrl(String url){
Document doc = Jsoup.connect(url).get();
Elements aList = doc.select("a");
for (Element ele: aList) {
String href = ele.attr("href");
String endUrl = url + href;
if (!listUrl.contains(endUrl)){ //避免重复的地址录入
listUrl.add(endUrl); //将每次获取的链接存储到数组中
this.getPageUrl(endUrl);
}
}
}
获取页面内容
- 下面的代码将只是简单伪代码
//获取页面内容,此处去除换行符是为了数据保存到文件中时单条数据只能是单行的
String html = doc.body().text().trim().replaceAll("\n", "");
refresh(页面地址, 页面标题, 页面内容); //控制数据刷新的数量
使用线程池去控制数据的存储
//此处线程池中线程的数量根据系统当前情况而定
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(Runtime.getRuntime()
.availableProcessors());
private String count = 0;
private String str = "";
public void refresh(String endUrl, String title, String html){
if (count == 30){
//每个线程控制30个网页内容的存储
fixedThreadPool.execute(new Thread(文件路径, str));
count = 0;
str = "";
}
str += html + "\r\n";
count++;
}
需要考虑的情况
- a标签中的链接是否可以获取到内容
- 是否考虑reboot.txt
- 不是同一域的链接是否需要存储
- 如果遇到反爬虫机制应该如何应对
完整代码
编写:武杰