jsoup虽然不是一个很强大的爬虫工具,但是它对于网页html文档的各种处理确实是很强大的,同时自身也是个非常好用的爬虫,也许无法去做较大难度的数据的抓取,但我认为它是个非常优良的文档处理助手
<dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.7.3</version> </dependency>
这里我以百度数据为例:
搜索 “互联网” 相关数据,
获取如上网页中所显示的信息,
下面就开始编写jsoup爬虫代码;
/** * 准备抓取的目标地址,%E4%BA%92%E8%81%94%E7%BD%91 为utf-8格式的 互联网 */ private static String url = "https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=互联网"; public static void main(String[] args) throws Exception { //链接到目标地址 Connection connect = Jsoup.connect(url); //设置useragent,设置超时时间,并以get请求方式请求服务器 Document document = connect.userAgent("Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)").timeout(6000).ignoreContentType(true).get(); Thread.sleep(1000); //获取指定标签的数据 Element elementById = document.getElementById("content_left"); //输出文本数据 System.out.println(elementById.text()); //输出html数据 System.out.println(elementById.html()); }
/** * 准备抓取的目标地址,%E4%BA%92%E8%81%94%E7%BD%91 为utf-8格式的 互联网 */ private static String url = "https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=互联网"; public static void main(String[] args) throws Exception { //链接到目标地址 Connection connect = Jsoup.connect(url); //设置useragent,设置超时时间,并以get请求方式请求服务器 Document document = connect.userAgent("Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)").timeout(6000).ignoreContentType(true).get(); Thread.sleep(1000); //获取指定标签的数据 Element elementById = document.getElementById("content_left"); //输出文本数据 //System.out.println(elementById.text()); //输出html数据 //System.out.println(elementById.html()); //获取所有图片链接 Elements imgtag = document.getElementsByTag("img"); List<String> imgurlList = new ArrayList<String>(); for (int i = 0; i < imgtag.size(); i++) { if (StringUtils.isNotEmpty(imgtag.get(i).attr("src"))&&imgtag.get(i).attr("src").startsWith("http")) { System.out.println(imgtag.get(i).attr("src")); } } }
输出如下:
/** * 下载图片到指定目录 * * @param filePath 文件路径 * @param imgUrl 图片URL */ public static void downImages(String filePath, String imgUrl) { // 若指定文件夹没有,则先创建 File dir = new File(filePath); if (!dir.exists()) { dir.mkdirs(); } // 截取图片文件名 String fileName = imgUrl.substring(imgUrl.lastIndexOf('/') + 1, imgUrl.length()); try { // 文件名里面可能有中文或者空格,所以这里要进行处理。但空格又会被URLEncoder转义为加号 String urlTail = URLEncoder.encode(fileName, "UTF-8"); // 因此要将加号转化为UTF-8格式的%20 imgUrl = imgUrl.substring(0, imgUrl.lastIndexOf('/') + 1) + urlTail.replaceAll("\\+", "\\%20"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } // 写出的路径 File file = new File(filePath + File.separator + fileName); try { // 获取图片URL URL url = new URL(imgUrl); // 获得连接 URLConnection connection = url.openConnection(); // 设置10秒的相应时间 connection.setConnectTimeout(10 * 1000); // 获得输入流 InputStream in = connection.getInputStream(); // 获得输出流 BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file)); // 构建缓冲区 byte[] buf = new byte[1024]; int size; // 写入到文件 while (-1 != (size = in.read(buf))) { out.write(buf, 0, size); } out.close(); in.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } 预览
有问题欢迎交流与指正,谢谢