【Java爬虫】使用Jsoup爬取网页表格的分页信息

爬取网站:https://flights.ctrip.com/actualtime/arrive-sha.p1/
爬取上海浦东机场的航班信息

技术:使用Jsoup技术

jsoup 是一款Java的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
参考:Jsoup官方文档 Jsoup_Doc文档

网页获取和解析速度飞快,推荐使用。
主要功能如下:
	1. 从一个URL,文件或字符串中解析HTML;
	2. 使用DOM或CSS选择器来查找、取出数据;
	3. 可操作HTML元素、属性、文本;

难点:因为table中的数据有很多页,所以要做到翻页爬取数据

直接上代码,详细解释都在代码里:

 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
 
 import java.io.*;
 
 public class Reptile {
     public static void main(String[] args) throws Exception{
         Reptile.run();
     }
 
     public static void run() throws Exception {
         StringBuffer data = new StringBuffer();
         for (int i = 0; i < 50; i++) {
              // 因为要爬取分页信息,就通过循环重新加载网页来来实现,一般网页的分页URL都是有规律的,一般就是在后面的数字加1得到,所以利用这个规律来实现分页爬取数据的效果
             // 网页地址
             String url = "https://flights.ctrip.com/actualtime/arrive-sha.p" + (i + 1) + "/";
             try {
 		  // 根据URL获取当前URL界面的doc对象,里面存储着界面的所有元素,类似于BOM
                  Document doc = Jsoup.connect(url).get();
 		 /*这个select方法可以对Elements集合类型对象,或者Element单个类型元素对象来使用
 	  	   select方法的其中一个作用就是找到在括号里传入要找标签的名字,他就会返回调用这个select方法的标签对象所有的和要查
 		   找标签名字一样的标签对象的集合,注意这里返回的是Elements集合对象	
 	   	   后面那个last()方法和first()方法,是对集合操作的方法返回的是Element元素对象,first()就是返回元素集合的第一个元素last()
 		   就是返回的最后一个*/
                 // 获取第一个表格
                 Element table = doc.select("table").last();
                 // System.out.println(element);
                 Element tbody = table.select("tbody").first();
                 Elements trs = tbody.select("tr");
 		 // 这个就是遍历元素集合的每一个元素,来查找想要的标签对象
                 for (Element tr : trs) {
                     Elements tds = tr.select("td");
                     for (Element td : tds) {
 			// text()方法局势返回调用标签元素中的文本内容,返回的是String类型	
                         data.append(td.text() + "\t");
                     }
                     data.append("\n");
                 }
             } catch (Exception e) {
                 e.printStackTrace();
             }
         }
 		
 	//将结果写入到文件当中
         File f = new File("c:" + File.separator + "Users" + File.separator + "97307" + File.separator + "Desktop" + File.separator + "data.txt");
         OutputStream out = null;
         out = new FileOutputStream(f);
         byte b[] = data.toString().getBytes();
         out.write(b);
         out.close();
         System.out.println(data);
     }
 }

你可能感兴趣的:(Java)