java 常用API 爬虫示例


下面是一个简单的Java爬虫示例,用于爬取百度首页的HTML源码:

import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Scanner;

public class SimpleWebCrawler {
    public static void main(String[] args) {
        String urlString = "https://www.baidu.com/";
        try {
            URL url = new URL(urlString);
            URLConnection conn = url.openConnection();
            Scanner scanner = new Scanner(conn.getInputStream());
            scanner.useDelimiter("\\Z");
            String html = scanner.next();
            System.out.println(html);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这个示例中,我们使用了Java的URL类和URLConnection类,创建一个连接到百度首页的URL,并通过URLConnection类获取该URL的输入流,然后使用Scanner类读取输入流中的数据,并打印出来。

当然,这个示例只是一个最基础的爬虫示例,没有任何的异常处理和优化,也没有考虑到反爬机制等问题。在实际的爬虫开发中,我们需要更加完善和复杂的爬虫程序来应对各种挑战。

下面是一个稍微复杂一些的Java爬虫示例,用于爬取知乎上关于Python的问题和答案:

import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ZhihuPythonCrawler {
    private static final String QUESTION_URL = "https://www.zhihu.com/api/v4/search_v3?t=general&q=python&correction=1&offset=%d&limit=%d";

    public static void main(String[] args) {
        int limit = 10;
        int offset = 0;
        List<String> questions = new ArrayList<>();
        while (offset < limit) {
            String url = String.format(QUESTION_URL, offset, limit);
            try {
                String json = getJsonFromUrl(url);
                List<String> qids = getQuestionIdsFromJson(json);
                for (String qid : qids) {
                    String question = getQuestionFromQid(qid);
                    questions.add(question);
                }
                offset += limit;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        for (String question : questions) {
            System.out.println(question);
        }
    }

    private static String getJsonFromUrl(String urlString) throws IOException {
        URL url = new URL(urlString);
        URLConnection conn = url.openConnection();
        conn.setRequestProperty("user-agent", "Mozilla/5.0");
        Scanner scanner = new Scanner(conn.getInputStream());
        scanner.useDelimiter("\\Z");
        return scanner.next();
    }

    private static List<String> getQuestionIdsFromJson(String json) {
        List<String> qids = new ArrayList<>();
        Pattern pattern = Pattern.compile("\"object\":{\"id\":\"(.*?)\",\"type\":\"question\"");
        Matcher matcher = pattern.matcher(json);
        while (matcher.find()) {
            String qid = matcher.group(1);
            qids.add(qid);
        }
        return qids;
    }

    private static String getQuestionFromQid(String qid) throws IOException {
        String url = "https://www.zhihu.com/question/" + qid;
        String html = getHtmlFromUrl(url);
        Pattern pattern = Pattern.compile("<h1 class=\"QuestionHeader-title\">(.*?)</h1>");
        Matcher matcher = pattern.matcher(html);
        if (matcher.find()) {
            String question = matcher.group(1);
            return question;
        }
        return null;
    }

    private static String getHtmlFromUrl(String urlString) throws IOException {
        URL url = new URL(urlString);
        URLConnection conn = url.openConnection();
        conn.setRequestProperty("user-agent", "Mozilla/5.0");
        Scanner scanner = new Scanner(conn.getInputStream());
        scanner.useDelimiter("\\Z");
        return scanner.next();
    }
}

这个示例中,我们使用了Java的URL类和URLConnection类,通过知乎的API获取关于Python的问题的JSON数据,然后从JSON数据中解析出问题的ID,再通过问题的ID获取问题的HTML源码,从HTML源码中解析出问题的标题。注意,我们在发送HTTP请求时,设置了User-Agent头,模拟真实浏览器的请求。

这个示例中还使用了正则表达式,用于从JSON数据和HTML源码中提取数据。正则表达式是一种强大的字符串匹配工具,在爬虫中也经常

被使用。不过需要注意的是,正则表达式的使用需要谨慎,因为它容易被网站的反爬机制所识别,从而导致爬虫被封禁。

此外,这个示例中还演示了爬虫的分页处理。在爬取知乎的问题时,我们使用了知乎的API,并通过offset和limit参数控制了分页,从而可以一次性获取多个问题的信息。

需要注意的是,这个示例只是一个演示用的爬虫程序,并没有考虑到反爬机制、异常处理等问题,实际开发中需要更加完善的程序来应对各种情况。


原文链接:codingdict.net