下面是一个简单的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