以前:
按F12,看一下各个标题的url藏在哪个标签里,记一下标签名,class或者id是什么,处于什么结构层次。再打开具体章节,再按一下F12,看看正文在哪个标签下,想想怎么定位。
然后开始写代码。针对这个网站的爬虫,搞定了。
碰到另一个网站,再重复一遍以上操作
现在:
只需要传入目录页网址就可以用了
我看上谁,我就复制一下网址当参数传进去,就ok了
哪有空细看它具体结构是怎样的?这么简单的东西当然让程序自己判断了。
程序可以自动解析html,定位章节标题的位置
同时,可以自动定位正文的位置,抽取出正文
适用于大部分小说网站,不再需要为检测网页结构苦恼
public class NovelSpider {
public static void main(String[] args) {
String indexurl="https://www.shuyuewu.co/80039_80039538/";
int id = NovelUtil.newId(db, indexurl, "人在修仙世界,和谁都能五五开", "春风要开心");
//自动获取目录
Map<String, String> catalog = getCatalog(indexurl);
List<String> urls=new ArrayList<String>();
List<String> titles=new ArrayList<String>();
for(String k:catalog.keySet()){
urls.add(k);
titles.add(catalog.get(k));
}
//获取各章节
for (int i = 0; i < urls.size(); i++) {
String cururl=urls.get(i);
String article="";
if(i!=urls.size()-1) article=getChapter(cururl,urls.get(i+1));
else article= getChapter(cururl,"");
NovelUtil.saveChapter(id, titles.get(i), article, i+1);
}
}
private static Map<String,String> getCatalog(String indexurl, Map<String, String> allpageurls, String html,
Tree<HtmlNode> tree) {
Map<Integer,List<Integer>> area=new HashMap<Integer,List<Integer>>();
int prekey=-1;
for(int key:ListUtil.order(tree.getAllNodeKeys())){
HtmlNode leaf = tree.getNodeEntity(key);
if(leaf.getLabel().toLowerCase().equals("a")){
if(prekey!=-1){
int sameTopKey = sameTopKey(tree, prekey, key);
area=MapUtil.putMapList(area, sameTopKey, prekey);
area=MapUtil.putMapList(area, sameTopKey, key);
}
prekey=key;
}
}
int max=0;
List<Integer> chapterurls=new ArrayList<Integer>();
for(Integer key:area.keySet()){
List<Integer> list = area.get(key);
list=ListUtil.killSame(list);
area.put(key, list);
if(list.size()>max){
max=list.size();
chapterurls=list;
}
}
for (int i:ListUtil.order(chapterurls)){
HtmlNode node = tree.getNodeEntity(i);
String str = html.substring(node.getStart(),node.getEnd()+1);
String httpurl=SpiderUtil.urljoin(indexurl,HtmlUtil.propertyValue(str,"href"));
String v = HtmlUtil.getValue(str);
if(allpageurls.containsKey(httpurl)){
allpageurls.remove(httpurl);
}
allpageurls.put(httpurl,v);
}
return allpageurls;
}
}