1.工具准备
开发环境:Eclipse+Httpclient+Jsoup
jar包:
httpclient下的所有jar包(我不清楚哪些jar包是不需要的,以防万一,把所有jar包加上)
jsoup-1.10.3.jar
2.了解并阅读相关文档
HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。
jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
这里不过多介绍,想要了解的可以自己去官网翻看,我们用httpclient模拟浏览器请求,用jsoup解析httpclient返回的实体的文档对象。
3.开始编写代码
package com.ff.jsoup; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.util.HashMap; import java.util.Map; import org.apache.http.HttpEntity; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; public class JsoupHelloWorld { public Elements getRequestMethod(String url) throws Exception { CloseableHttpClient client = HttpClients.createDefault(); HttpGet httpGet = new HttpGet(url); //setConnectTimeout(10000)连接超时时间(单位豪秒) //setSocketTimeout(10000)读取超时时间(单位豪秒) RequestConfig config=RequestConfig.custom().setConnectTimeout(10000).setSocketTimeout(10000).build(); httpGet.setConfig(config); httpGet.setHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64)" + " AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"); CloseableHttpResponse response = client.execute(httpGet); HttpEntity entity = response.getEntity(); //获取返回实体 String html = ""; if(entity!=null) { html = EntityUtils.toString(entity); } response.close(); //关闭流和和释放资源 Document doc = Jsoup.parse(html); //解析网页得到文档对象 /** * getElementById(String id) 根据id来查询DOM * getElementsByTag(String tagName) 根据tag名称来查询DOM * getElementsByClass(String className) 根据样式名称来查询DOM * getElementsByAttribute(String key) 根据属性名来查询DOM * getElementsByAttributeValue(String key,String value) 根据属性名和属性值来查询DOM */ Elements tags = doc.select("#ip_list > tbody > tr"); // Element element = tags.get(0); // System.out.println(element.text()); // System.out.println(tags); return tags; } public Map<Integer,String> getElementsByTags(Elements tags) { Map<Integer,String> ipAddress = new HashMap<Integer,String>(); int count = 0; //遍历tbody子节点 for (Element element : tags) { //取得ip地址节点 Elements tdChilds = element.select("tr > td:nth-child(2)"); //取得端口号节点 Elements tcpd = element.select("tr > td:nth-child(3)"); ipAddress.put(++count, tdChilds.text()+"."+tcpd.text()); } System.out.println(ipAddress); return ipAddress; } public void saveToText(Map<Integer,String> map) { try { BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File("D:\\cc\\IpAddress.txt")), "UTF-8")); for (int i = 2; i < map.size(); i++) { String ipAddess = map.get(i); // FileUtils.writeStringToFile(new File("D:\\cc\\IpAddress.txt"), ipAddess, "utf-8"); bw.write(ipAddess); bw.newLine(); } bw.close(); } catch (IOException e) { e.printStackTrace(); } System.out.println("ip地址爬取保存完毕"); } public static void main(String[] args) { JsoupHelloWorld ht = new JsoupHelloWorld(); String url = "http://www.xicidaili.com/nn/"; try { Elements elements = ht.getRequestMethod(url); Map<Integer, String> elementsByTags = ht.getElementsByTags(elements); ht.saveToText(elementsByTags); } catch (Exception e) { e.printStackTrace(); } } }
4.流程分析
1.首先通过httpclient请求页面返回实体
2.然后通过jsoup解析得到Document对象
3.分析西刺网站的ip地址和端口号所在位置
4.用select选择器提取要爬取的ip地址和端口号
5.将ip地址和端口号拼接成一个完整的地址,再用Map集合封装地址
6.遍历Map,通过IO流的输出流将Map封装的地址输出到本地文件,每写入一行换行
7.关闭流,控制台输出结束语
5.样图
6.总结
昨天才开始学的Java爬虫,并不难,很容易上手,除了httpclient和jsoup架包的操作剩下的就是html、css分析及IO流的操作了。并且tdChilds.text()和tdChilds.toString()区别还是要说一下:前者提取标签内容,后者提取整个标签。初次用Java写出了一个爬虫,也是很有成就感的,哈哈哈
。