赞
踩
编写一个Java爬虫以进行翻页通常涉及到使用HTTP客户端(如Apache HttpClient或OkHttp)来发送请求,解析HTML页面(如使用Jsoup库),以及处理分页逻辑(如通过URL参数或页面内的链接进行翻页)。
以下是一个使用Jsoup和Apache HttpClient的Java爬虫示例,该爬虫从一个假设的博客网站抓取文章标题,该网站具有分页功能(例如,通过URL中的page=
参数控制)。
首先,请确保在项目的pom.xml
文件中添加必要的依赖项(如果我们使用的是Maven):
- <dependencies>
- <dependency>
- <groupId>org.jsoup</groupId>
- <artifactId>jsoup</artifactId>
- <version>1.14.3</version>
- </dependency>
- <dependency>
- <groupId>org.apache.httpcomponents</groupId>
- <artifactId>httpclient</artifactId>
- <version>4.5.13</version>
- </dependency>
- </dependencies>
接下来是爬虫的实现代码:
- import org.apache.http.client.methods.CloseableHttpResponse;
- import org.apache.http.client.methods.HttpGet;
- import org.apache.http.impl.client.CloseableHttpClient;
- import org.apache.http.impl.client.HttpClients;
- import org.apache.http.util.EntityUtils;
- import org.jsoup.Jsoup;
- import org.jsoup.nodes.Document;
- import org.jsoup.nodes.Element;
- import org.jsoup.select.Elements;
-
- public class BlogSpider {
-
- private static final String BASE_URL = "http://example.com/blog?page=";
-
- public static void main(String[] args) {
- int maxPages = 5; // 假设我们只爬取前5页
-
- for (int i = 1; i <= maxPages; i++) {
- String url = BASE_URL + i;
- System.out.println("Fetching page: " + url);
- fetchAndParsePage(url);
- }
- }
-
- private static void fetchAndParsePage(String url) {
- try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
- HttpGet request = new HttpGet(url);
- try (CloseableHttpResponse response = httpClient.execute(request)) {
- if (response.getStatusLine().getStatusCode() == 200) {
- String html = EntityUtils.toString(response.getEntity(), "UTF-8");
- Document doc = Jsoup.parse(html);
-
- // 假设每个文章标题都在<h2>标签内
- Elements articleTitles = doc.select("h2.post-title"); // 可能需要根据实际情况调整选择器
- for (Element title : articleTitles) {
- System.out.println(title.text());
- }
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
代码解释:
(1)依赖项:我们使用Jsoup来解析HTML,使用Apache HttpClient来发送HTTP请求。
(2)基础URL:设置要爬取的网站的URL基础部分,这里假设分页通过URL中的page=
参数控制。
(3)主函数:设置要爬取的最大页数,并在循环中调用fetchAndParsePage
方法。
(4)fetchAndParsePage:
使用HttpClient发送GET请求到指定的URL。
检查响应状态码是否为200(成功)。
使用Jsoup解析HTML字符串。
选择页面上的文章标题元素(这里假设标题在<h2 class="post-title">
中,我们可能需要根据实际情况调整选择器)。
打印出每个找到的标题。
注意:
请确保我们遵守目标网站的robots.txt
规则和版权政策。
本示例中的URL和选择器是假设的,我们需要根据目标网站的实际结构进行调整。
在实际应用中,我们可能还需要处理异常(如网络错误、HTML解析错误等)和进行性能优化(如设置合理的请求头、连接超时时间等)。
下面是一个完整的Java代码示例,它使用Apache HttpClient和Jsoup库来从一个假设的博客网站抓取文章标题。这个示例包括了必要的异常处理和一些基本的HTTP请求配置。
首先,确保我们已经将Apache HttpClient和Jsoup作为依赖项添加到我们的项目中。如果我们使用的是Maven,可以在pom.xml
中添加以下依赖:
- <dependencies>
- <dependency>
- <groupId>org.jsoup</groupId>
- <artifactId>jsoup</artifactId>
- <version>1.14.3</version>
- </dependency>
- <dependency>
- <groupId>org.apache.httpcomponents</groupId>
- <artifactId>httpclient</artifactId>
- <version>4.5.13</version>
- </dependency>
- </dependencies>
接下来是完整的Java代码示例:
- import org.apache.http.client.methods.CloseableHttpResponse;
- import org.apache.http.client.methods.HttpGet;
- import org.apache.http.impl.client.CloseableHttpClient;
- import org.apache.http.impl.client.HttpClients;
- import org.apache.http.util.EntityUtils;
- import org.jsoup.Jsoup;
- import org.jsoup.nodes.Document;
- import org.jsoup.nodes.Element;
- import org.jsoup.select.Elements;
-
- public class BlogSpider {
-
- private static final String BASE_URL = "http://example.com/blog?page=";
-
- public static void main(String[] args) {
- int maxPages = 5; // 假设我们只爬取前5页
-
- for (int i = 1; i <= maxPages; i++) {
- String url = BASE_URL + i;
- System.out.println("Fetching page: " + url);
- try {
- fetchAndParsePage(url);
- } catch (Exception e) {
- System.err.println("Error fetching and parsing page " + i + ": " + e.getMessage());
- }
- }
- }
-
- private static void fetchAndParsePage(String url) throws Exception {
- try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
- HttpGet request = new HttpGet(url);
- // 我们可以在这里设置请求头,比如User-Agent
- // request.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");
-
- try (CloseableHttpResponse response = httpClient.execute(request)) {
- if (response.getStatusLine().getStatusCode() == 200) {
- String html = EntityUtils.toString(response.getEntity(), "UTF-8");
- Document doc = Jsoup.parse(html);
-
- // 假设每个文章标题都在<h2 class="post-title">标签内
- Elements articleTitles = doc.select("h2.post-title");
- for (Element title : articleTitles) {
- System.out.println(title.text());
- }
- } else {
- System.err.println("Failed to fetch page: HTTP status code " + response.getStatusLine().getStatusCode());
- }
- }
- } catch (Exception e) {
- throw e; // 或者我们可以在这里处理特定的异常,比如IOException
- }
- }
- }
在这个示例中,我添加了一个try-catch块来捕获fetchAndParsePage
方法中可能抛出的任何异常,并将其错误消息打印到标准错误输出。同时,我添加了一个注释掉的请求头设置示例,我们可以根据需要取消注释并修改它。
请注意,这个示例中的BASE_URL
和选择器h2.post-title
是假设的,我们需要根据我们要爬取的实际网站的HTML结构来修改它们。
此外,这个示例使用了try-with-resources语句来自动关闭CloseableHttpClient
和CloseableHttpResponse
资源,这是一种更简洁且安全的资源管理方式。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。