Jsoup爬虫出现的常见问题:
1.爬去链接出现404问题
解决方法:
加上.ignoreHttpErrors(true)属性
例如:
2.通过class爬取是出现class中有空格的形式
解决方法:
将空格用“.”来代替
例如:
3.jsoup出现UnknownHostException问题
java.net.UnknownHostException: bbs.ew86.com
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:195)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:529)
at sun.net.NetworkClient.doConnect(NetworkClient.java:158)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:411)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:525)
at sun.net.www.http.HttpClient.<init>(HttpClient.java:208)
解决方法:
使用try....catch方法
4.Jsoup分页爬虫
带有尾页的情况,可以根据尾页来进行获取前面的页面链接
代码示例:
// 获取分页的其他疾病
// 获取尾页的链接
Elements elements3 = Jsoup.connect(KeYiUrl).userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31").get().select("div.art_page").select("span").select("a");//获取所有分页的链接
for (Element element1 : elements3) {
if(element1.text().toString().equals("尾页")){
String[] strarray=element1.attr("abs:href").toString().split("-");
pageList.add(strarray[0]+"-"+strarray[1]); // 当前页
int endPage = Integer.parseInt(strarray[2]); // 获取总页数
if(strarray[2].equals("2")){
pageList.add(strarray[0]+"-"+strarray[1]+"-"+"2");// 如果就两页获取第二页
}
if(Integer.parseInt(strarray[2])>2){
for(int j=2;j<=endPage;j++){
pageList.add(strarray[0]+"-"+strarray[1]+"-"+j);//页数数量大于2获取其他页
}
}
}
// 遍历所有其它疾病链接取得疾病名和疾病链接
for(int i=0;i<pageList.size();i++){
Elements elements4=Jsoup.connect(pageList.get(i)).userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31").get().select("div.leftPinBox").select("div.leftPinBoxUL.a_02").select("li").select("a");//获取所有二级科室的链接
System.out.println(pageList.get(i));
for (Element element2 : elements4) {
System.out.println(element2.text());
}
for (Element element2 : elements4) {
String KeErUrl=element2.attr("abs:href");//遍历二级科室链接
String jiBingName=element2.text();//遍历每个(疾病名+链接)的集合取出疾病名(text()方法取出集合中的中文字符,toString()方法取出集合中所有字符,包含网页源代码的标签)
if(jiBingName.contains("/")){//置换疾病名中可能出现的非法字符(文件命名不允许出现的字符)
jiBingName=jiBingName.replace("/", "/");
}
JiBingObject bingObject=new JiBingObject(jiBingName, KeErUrl);//疾病名和链接存入写好的结构体中
System.out.println(jiBingName);
Helper.writeToFile(bingObject.toString(), "E:/网站原始数据/医网/链接列表2.txt", true);//将疾病名和链接存入本地(更改为自己电脑上的地址)
}
}