java代码实现爬虫功能

实现思路

1、首先要找到你想要抓取信息的网站地址,通过浏览器F12观察接口,如果只是抓取文本信息,只需要找到对应返回json数据的接口。

2、通过java代码发送http请求获取对应的数据进行保存即可,如果是抓取网页上的信息,就需要观察html页面元素,根据dom节点进行解析再进行保存。

其实python实现思路也是一样,只不过python代码实现起来更简洁,在这里就不做演示了,感兴趣的朋友可以自己使用python实现一个爬虫程序。

应用场景

        当需要在网页上获取大量的数据时,如果通过人工进行点击保存下载操作太费劲了,,比如获取图片素材、小说等,都可以利用代码实现。

java爬虫示例

今天就教大家利用java代码实现一段爬虫程序,获取网站上的图片。

目标网站:高清图片,堆糖,美图壁纸兴趣社区

主程序类

package com.memory.flink;

import org.apache.flink.table.expressions.E;

import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

public class MainDownLoad {

    // 地址
    private static final String URL = "http://www.tooopen.com/view/1439719.html";
    // 获取img标签正则
    private static final String IMGURL_REG = "<img.*src=(.*?)[^>]*?>";
    // 获取src路径的正则
    private static final String IMGSRC_REG = "[a-zA-z]+://[^\\s]*";

    // TODO 数据集ID
    final static long dataSetId = 85597077;

    public static void download(Long dataSetId,String resourceName,String filePath) {
        filePath = filePath +resourceName+"//"+ dataSetId + "/";
        try {
            MainDownLoad cm=new MainDownLoad();
            Set<String> imageUrls = DownloadImageFormDuiTang.getImageUrls(dataSetId);
            List<String> imageList = new ArrayList(imageUrls);
            //下载图片
            cm.Download(imageList,filePath);

        }catch (Exception e){
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        try {
            MainDownLoad cm=new MainDownLoad();
            Set<String> imageUrls = DownloadImage.getImageUrls(dataSetId);
            List<String> imageList = new ArrayList();
            for (String imageUrl : imageUrls) {
                //获得html文本内容
                String HTML = cm.getHtml(imageUrl);
                //获取图片标签
                List<String> imgUrl = cm.getImageUrl(HTML);
                // 筛选blog图片
                List<String> mainImageUrl = imgUrl.stream().filter(url -> url.indexOf("blog")!=-1).collect(Collectors.toList());
                //获取图片src地址
                List<String> imgSrc = cm.getImageSrc(mainImageUrl);
                for (String s : imgSrc) {
                    System.out.println(s);
                    imageList.add(s);
                }
//                break;
            }
            //下载图片
//            cm.Download(imageList,filePath);

        }catch (Exception e){
            e.printStackTrace();
        }

    }

    //获取HTML内容
    private String getHtml(String url)throws Exception{
        URL url1=new URL(url);
        URLConnection connection=url1.openConnection();
        InputStream in = null;
        InputStreamReader isr = null;
        BufferedReader br = null;
        try {
             in=connection.getInputStream();
             isr=new InputStreamReader(in);
             br=new BufferedReader(isr);
        }catch (Exception e){
            System.err.println("获取资源出错。" + e.getMessage());
        }
        String line;
        StringBuffer sb=new StringBuffer();
        while((line=br.readLine())!=null){
            sb.append(line,0,line.length());
            sb.append('\n');
        }
        br.close();
        isr.close();
        in.close();
        return sb.toString();
    }

    //获取ImageUrl地址
    private List<String> getImageUrl(String html){
        Matcher matcher=Pattern.compile(IMGURL_REG).matcher(html);
        List<String>listimgurl=new ArrayList<String>();
        while (matcher.find()){
            listimgurl.add(matcher.group());
        }
        return listimgurl;
    }

    //获取ImageSrc地址
    private List<String> getImageSrc(List<String> listimageurl){
        List<String> listImageSrc=new ArrayList<String>();
        for (String image:listimageurl){
            Matcher matcher=Pattern.compile(IMGSRC_REG).matcher(image);
            while (matcher.find()){
                listImageSrc.add(matcher.group().substring(0, matcher.group().length()-1));
            }
        }
        return listImageSrc;
    }

    //下载图片
    private void Download(List<String> listImgSrc, String filePath) {
        try {
            File file = new File(filePath);
            if (!file.exists()) {
                file.mkdirs();
            }
            //开始时间
            Date begindate = new Date();
            for (String url : listImgSrc) {
                if (url.indexOf(".gif_jpeg") != -1){
                    url = url.replace(".gif_jpeg",".gif");
                }
                //开始时间
                Date begindate2 = new Date();
                String imageName = url.substring(url.lastIndexOf("/") + 1, url.length());

                URL uri = new URL(url);
                InputStream in = uri.openStream();
                FileOutputStream fo = new FileOutputStream(new File(filePath+imageName));
                byte[] buf = new byte[1024];
                int length = 0;
                System.out.println("开始下载:" + url);
                while ((length = in.read(buf, 0, buf.length)) != -1) {
                    fo.write(buf, 0, length);
                }
                in.close();
                fo.close();
                System.out.println(imageName + "下载完成");
                //结束时间
                Date overdate2 = new Date();
                double time = overdate2.getTime() - begindate2.getTime();
                System.out.println("耗时:" + time / 1000 + "s");
            }
            Date overdate = new Date();
            double time = overdate.getTime() - begindate.getTime();
            System.out.println("总耗时:" + time / 1000 + "s");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 获取每个章节的图片接口信息

package com.memory.flink;

import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;

import java.util.*;

public class DownloadImage {
    static Set<Integer> imageIds = new HashSet<>();
//    static List<Integer> imageIds = new ArrayList<>();
    public static void main(String[] args) {
//        String url = "https://www.duitang.com/napi/blog/list/by_album/?album_id=108374401&limit=24&include_fields=top_comments%2Cis_root%2Csource_link%2Cbuyable%2Croot_id%2Cstatus%2Clike_count%2Clike_id%2Csender%2Creply_count&start=1&_=1648521141702";
        long dataSetId = 85597077;
        Set<Integer> imageIds = getImageIds(dataSetId);
         String baseUrl = "https://www.duitang.com/blog/?id=";
        for (Integer id : imageIds) {
            String imageUrl = baseUrl + id;
            System.out.println(imageUrl);
//            String result2 = HttpUtil.get(url, paramMap);
        }

    }

    /**
     * 根据数据集ID 获取集合
     * @param dataSetId
     * @return
     */
    public static Set<String> getImageUrls (long dataSetId) {

        Set<Integer> imageIds = getImageIds(dataSetId);
        Set<String> result = new HashSet();
        String baseUrl = "https://www.duitang.com/blog/?id=";
        for (Integer id : imageIds) {
            String imageUrl = baseUrl + id;
              // TODO  关闭打印
//            System.out.println(imageUrl);
//            String result2 = HttpUtil.get(url, paramMap);
            result.add(imageUrl);
        }
        return result;
    }
    public static Set<Integer> getImageIds (long album_id) {
        String url = "https://www.duitang.com/napi/blog/list/by_album/";
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("album_id", album_id);
        paramMap.put("include_fields", "top_comments,is_root,source_link,buyable,root_id,status,like_count,like_id,sender,reply_count");
        paramMap.put("limit", 100);
        paramMap.put("start", 0);
        paramMap.put("_", System.currentTimeMillis());
        // 无参GET请求
        //String result = HttpUtil.get(url);
        // 带参GET请求
        String result2 = HttpUtil.get(url, paramMap);
        Map map = JSONUtil.toBean(result2, Map.class);
        JSONObject data = (JSONObject)map.get("data");
        JSONArray jsonArray = (JSONArray)data.get("object_list");

        for (Object o : jsonArray) {
            JSONObject image = (JSONObject)o;
            Integer id = (Integer)image.get("id");
            imageIds.add(id);
        }
        // 第二页
        paramMap.put("start", 100);
        result2 = HttpUtil.get(url, paramMap);
        map = JSONUtil.toBean(result2, Map.class);
        data = (JSONObject)map.get("data");
        jsonArray = (JSONArray)data.get("object_list");
        for (Object o : jsonArray) {
            JSONObject image = (JSONObject)o;
            Integer id = (Integer)image.get("id");
            imageIds.add(id);
        }
        paramMap.put("start", 200);
        result2 = HttpUtil.get(url, paramMap);
        map = JSONUtil.toBean(result2, Map.class);
        data = (JSONObject)map.get("data");
        jsonArray = (JSONArray)data.get("object_list");
        for (Object o : jsonArray) {
            JSONObject image = (JSONObject)o;
            Integer id = (Integer)image.get("id");
            imageIds.add(id);
        }
        paramMap.put("start", 300);
        result2 = HttpUtil.get(url, paramMap);
        map = JSONUtil.toBean(result2, Map.class);
        data = (JSONObject)map.get("data");
        jsonArray = (JSONArray)data.get("object_list");
        for (Object o : jsonArray) {
            JSONObject image = (JSONObject)o;
            Integer id = (Integer)image.get("id");
            imageIds.add(id);
        }
        System.out.println(jsonArray.size());
        System.out.println(imageIds);
        return imageIds;
    }
}

获取图片url 

package com.memory.flink;

import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class DownloadImageFormDuiTang {


    final static String baseUrl = "https://www.duitang.com/napi/album/list/by_search/";
    static Set<Long> dataSetIds = new HashSet<>();
    static Set<String> imageUrls = new HashSet<>();
    final static String resourceName = "动漫场景";
    final static String filePath = "C://material//";
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("kw", resourceName);
        paramMap.put("include_fields", "top_comments,is_root,source_link,item,buyable,root_id,status,like_count,like_id,sender,album,reply_count,favorite_blog_id");
        paramMap.put("after_id",0);
        paramMap.put("limit",10);
        paramMap.put("type", "feed");
        paramMap.put("_type", "");
        paramMap.put("_", System.currentTimeMillis());
        // 无参GET请求
        //String result = HttpUtil.get(url);
        // 带参GET请求
        String result2 = HttpUtil.get(baseUrl, paramMap);
        Map map = JSONUtil.toBean(result2, Map.class);
        JSONObject data = (JSONObject)map.get("data");
        JSONArray jsonArray = (JSONArray)data.get("object_list");
        for (Object o : jsonArray) {
            JSONObject image = (JSONObject)o;
            Long id = Long.valueOf(image.get("id").toString());
            dataSetIds.add(id);
        }
        // 1.获取数据集ID
        // 2.根据数据集ID获取图片
        for (Long datasetId : dataSetIds) {
            MainDownLoad.download(datasetId,resourceName,filePath);
        }
        long end = System.currentTimeMillis();
        System.out.println("下载资源完成,总耗时:" + (end-start) / 1000 + "s");
    }

    /**
     * 根据数据集ID 获取集合
     * @param dataSetId
     * @return
     */
    public static Set<String> getImageUrls (long dataSetId) {

        Set<String> imageUrls = getImageIds(dataSetId);
        return imageUrls;
    }
    public static Set<String> getImageIds (long album_id) {
        Set<String> result = new HashSet<>();
        String url = "https://www.duitang.com/napi/blog/list/by_album/";
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("album_id", album_id);
        paramMap.put("include_fields", "top_comments,is_root,source_link,buyable,root_id,status,like_count,like_id,sender,reply_count");
        paramMap.put("limit", 100);
        paramMap.put("start", 0);
        paramMap.put("_", System.currentTimeMillis());
        // 无参GET请求
        //String result = HttpUtil.get(url);
        // 带参GET请求
        String result2 = HttpUtil.get(url, paramMap);
        Map map = JSONUtil.toBean(result2, Map.class);
        JSONObject data = (JSONObject)map.get("data");
        JSONArray jsonArray = (JSONArray)data.get("object_list");

        for (Object o : jsonArray) {
            JSONObject image = (JSONObject)o;
            JSONObject photo = (JSONObject)image.get("photo");
            String imgUrl = (String)photo.get("path");
            result.add(imgUrl);
        }
        // 第二页
        paramMap.put("start", 100);
        result2 = HttpUtil.get(url, paramMap);
        map = JSONUtil.toBean(result2, Map.class);
        data = (JSONObject)map.get("data");
        jsonArray = (JSONArray)data.get("object_list");
        for (Object o : jsonArray) {
            JSONObject image = (JSONObject)o;
            JSONObject photo = (JSONObject)image.get("photo");
            String imgUrl = (String)photo.get("path");
            result.add(imgUrl);
        }
        paramMap.put("start", 200);
        result2 = HttpUtil.get(url, paramMap);
        map = JSONUtil.toBean(result2, Map.class);
        data = (JSONObject)map.get("data");
        jsonArray = (JSONArray)data.get("object_list");
        for (Object o : jsonArray) {
            JSONObject image = (JSONObject)o;
            JSONObject photo = (JSONObject)image.get("photo");
            String imgUrl = (String)photo.get("path");
            result.add(imgUrl);
        }
        paramMap.put("start", 300);
        result2 = HttpUtil.get(url, paramMap);
        map = JSONUtil.toBean(result2, Map.class);
        data = (JSONObject)map.get("data");
        jsonArray = (JSONArray)data.get("object_list");
        for (Object o : jsonArray) {
            JSONObject image = (JSONObject)o;
            JSONObject photo = (JSONObject)image.get("photo");
            String imgUrl = (String)photo.get("path");
            result.add(imgUrl);
        }
        System.out.println(jsonArray.size());
        System.out.println(result);
        return result;
    }
}

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 好的,以下是一个Java实现爬虫代码示例: ``` import java.io.IOException; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; public class Spider { public static void main(String[] args) { String url = "https://www.example.com"; // 要爬取的网站的URL地址 try { Document doc = Jsoup.connect(url).get(); // 获取网站的HTML文档 Elements links = doc.select("a[href]"); // 从HTML文档中选择所有的链接元素 for (Element link : links) { String href = link.attr("href"); // 获取链接的URL地址 System.out.println(href); // 输出链接的URL地址 } } catch (IOException e) { e.printStackTrace(); // 捕获异常并输出错误信息 } } } ``` 这段代码使用了Jsoup这个Java库来实现爬虫功能。它首先通过`Jsoup.connect()`方法获取指定URL的HTML文档,然后通过选择器选择所有的链接元素,再遍历每个链接元素获取链接的URL地址并输出。需要注意的是,在实际爬取网站时需要遵守网站的爬虫协议,以免触发网站的反爬虫机制。 ### 回答2: 下面是一个使用Java实现爬虫代码示例: ```java import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.IOException; public class Spider { public static void main(String[] args) { String url = "https://example.com"; try { // 使用Jsoup库解析网页 Document doc = Jsoup.connect(url).get(); // 获取所有的链接 Elements links = doc.select("a[href]"); // 遍历链接并输出 for (Element link : links) { String href = link.attr("href"); System.out.println(href); } } catch (IOException e) { e.printStackTrace(); } } } ``` 这个示例使用了Jsoup库来解析网页,首先通过`Jsoup.connect(url)`方法连接到指定的网页,然后使用`get()`方法获取网页内容。接着,通过`doc.select("a[href]")`方法选择所有的链接元素,并使用`attr("href")`方法获取链接的URL。最后,遍历所有链接并输出。 请注意,这只是一个简单的示例,实际爬虫代码可能需要对网页内容进行更复杂的处理、进行数据存储等操作。另外,在编写爬虫时,也需要遵守相关的法律和伦理规范,尊重网站的爬取规则,并注意不要给目标服务器带来过大的负载。 ### 回答3: 下面是一个使用Java实现的简单爬虫代码示例: ```java import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.IOException; public class WebCrawler { public static void main(String[] args) { String url = "https://example.com"; // 要爬取的网页URL try { Document doc = Jsoup.connect(url).get(); // 使用Jsoup连接并获取网页内容 Elements links = doc.select("a[href]"); // 获取网页中所有的链接元素 for (Element link : links) { String linkText = link.attr("href"); // 获取链接的文本内容 String absoluteUrl = link.absUrl("href"); // 获取链接的绝对URL System.out.println("文本内容:" + linkText); System.out.println("绝对URL:" + absoluteUrl); System.out.println("-------------------"); } } catch (IOException e) { e.printStackTrace(); } } } ``` 这个爬虫程序使用了Jsoup库来处理网页内容。首先,我们指定要爬取的网页URL,并使用`Jsoup.connect()`方法连接到该URL并获取网页内容。然后,我们使用`doc.select()`方法选择出所有的链接元素。接着,我们可以使用`link.attr()`方法获取链接元素的文本内容和`link.absUrl()`方法获取链接的绝对URL。最后,我们将结果打印出来。 请注意,上述代码只是一个简单的示例,实际的爬虫程序可能需要更多的处理和异常处理。此外,网站的访问权限也需要考虑,确保你在合法的范围内进行爬取操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Memory_2020

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值