爬虫思路:
1. 获取网页源代码
2. 分析源代码,从源代码中提取有用的信息(可以用正则,也可以用文档节点获取)
所以根据以上思路在我们的类中应该有两个函数,一个用来获取源代码,另一个用来提取有用的信息。
爬取的是39健康网
获取网页源代码的代码如下:
public static String getHtmlInfoFromUrl(String url, String encoding) {
StringBuffer sb = new StringBuffer();
InputStreamReader isr = null;
try{
URL urlObj = new URL(url);
URLConnection uc = urlObj.openConnection();
isr = new InputStreamReader(uc.getInputStream(), encoding);
BufferedReader br = new BufferedReader(isr);
String line = null;
while ((line = br.readLine()) != null) {
sb.append(line + "\n");
}
}catch (Exception e) {
e.printStackTrace();
}finally {
try {
isr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
String str = sb.toString();
//System.out.println(str);
return str;
}
获取了网页源代码之后,我们就应该提取有用的信息了
按F12
可以发现每一个医院的所有信息都对应一个li标签,所以我们只需要找到这里面所有的li标签,也就找到了所有我们需要的信息,当然源代码中可能还有其他的li标签,所以当我们的爬取结果出来了之后还需要对其进行一个筛选
要获取所有li标签,就需要使用以下代码
org.jsoup.nodes.Document document = Jsoup.parse(html);
Elements elementList = document.getElementsByTag("li");
这样所有的li标签就在这个elementList里面了。只需要对这个elementList进行遍历就可以取出每一个医院的信息。
接着分析每一个li标签里面的内容,我们要获取的是医院的图片,和医院的名称。
上图可以看到,每一个li标签里面都有一个img标签,这个img标签就是需要获取的图片的信息,包括图片的路径,class,只需要获取到这个图片对象,我们就可以得到他的路径,从而得到图片
同样对与标题每一个医院的标题都包含在yy-msg这个class对应的div下的div下的a标签里面,所以我们只需要根据这个a标签的class=yy-name就可以获得每一个a标签对象,从而获得他的title信息。
所以提取有用信息的函数的代码如下:
/**
* @param url 网址
* @param encoding 解码方式
*/
public static List<HashMap<String, String>> getHospitalInfo(String url, String encoding) {
String html = getHtmlInfoFromUrl(url, encoding);
org.jsoup.nodes.Document document = Jsoup.parse(html);
Elements elementList = document.getElementsByTag("li");
List<HashMap<String, String>> maps = new ArrayList<HashMap<String, String>>();
for(org.jsoup.nodes.Element element: elementList){
String img = element.getElementsByClass("yy-img").attr("src");
String title = element.getElementsByClass("yy-name").attr("title");
if(img != "" && title != "") {//筛选li标签
HashMap<String, String> map = new HashMap<String, String>();
map.put("img", img);
map.put("title", title);
maps.add(map);
}
}
return maps;
}
需要导入的包有:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.jsoup.Jsoup;
import org.jsoup.select.Elements;
主函数测试:
public static void main(String[] args) {
List<HashMap<String, String>> list = getHospitalInfo("http://yyk.39.net/shanxi2/hospitals/", "gbk");
for(HashMap<String, String> map: list) {
System.out.println("图片 :" + map.get("img"));
System.out.println("医院名称:" + map.get("title"));
System.out.println("------------------------------------");
}
}
jsp页面测试:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import = "com.baidu.parse.util.ParseData" %>
<%@ page import = "java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
List<HashMap<String, String>> list = new ParseData().getHospitalInfo("http://yyk.39.net/shanxi2/hospitals/", "gbk");
for(HashMap<String, String> map: list) {
out.print("<img src = " + map.get("img")+">");
out.print("<p>" + map.get("title") + "</p>");
}
%>
</body>
</html>