当前位置:   article > 正文

Java爬虫翻页

Java爬虫翻页

编写一个Java爬虫以进行翻页通常涉及到使用HTTP客户端(如Apache HttpClient或OkHttp)来发送请求,解析HTML页面(如使用Jsoup库),以及处理分页逻辑(如通过URL参数或页面内的链接进行翻页)。

1. 使用Jsoup和Apache HttpClient的Java爬虫示例

以下是一个使用Jsoup和Apache HttpClient的Java爬虫示例,该爬虫从一个假设的博客网站抓取文章标题,该网站具有分页功能(例如,通过URL中的page=参数控制)。

首先,请确保在项目的pom.xml文件中添加必要的依赖项(如果我们使用的是Maven):

  1. <dependencies>  
  2.    <dependency>  
  3.        <groupId>org.jsoup</groupId>  
  4.        <artifactId>jsoup</artifactId>  
  5.        <version>1.14.3</version>  
  6.    </dependency>  
  7.    <dependency>  
  8.        <groupId>org.apache.httpcomponents</groupId>  
  9.        <artifactId>httpclient</artifactId>  
  10.        <version>4.5.13</version>  
  11.    </dependency>  
  12. </dependencies>

接下来是爬虫的实现代码:

  1. import org.apache.http.client.methods.CloseableHttpResponse;  
  2. import org.apache.http.client.methods.HttpGet;  
  3. import org.apache.http.impl.client.CloseableHttpClient;  
  4. import org.apache.http.impl.client.HttpClients;  
  5. import org.apache.http.util.EntityUtils;  
  6. import org.jsoup.Jsoup;  
  7. import org.jsoup.nodes.Document;  
  8. import org.jsoup.nodes.Element;  
  9. import org.jsoup.select.Elements;  
  10.  
  11. public class BlogSpider {  
  12.  
  13.    private static final String BASE_URL = "http://example.com/blog?page=";  
  14.  
  15.    public static void main(String[] args) {  
  16.        int maxPages = 5; // 假设我们只爬取前5页  
  17.  
  18.        for (int i = 1; i <= maxPages; i++) {  
  19.            String url = BASE_URL + i;  
  20.            System.out.println("Fetching page: " + url);  
  21.            fetchAndParsePage(url);  
  22.       }  
  23.   }  
  24.  
  25.    private static void fetchAndParsePage(String url) {  
  26.        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {  
  27.            HttpGet request = new HttpGet(url);  
  28.            try (CloseableHttpResponse response = httpClient.execute(request)) {  
  29.                if (response.getStatusLine().getStatusCode() == 200) {  
  30.                    String html = EntityUtils.toString(response.getEntity(), "UTF-8");  
  31.                    Document doc = Jsoup.parse(html);  
  32.  
  33.                    // 假设每个文章标题都在<h2>标签内  
  34.                    Elements articleTitles = doc.select("h2.post-title"); // 可能需要根据实际情况调整选择器  
  35.                    for (Element title : articleTitles) {  
  36.                        System.out.println(title.text());  
  37.                   }  
  38.               }  
  39.           }  
  40.       } catch (Exception e) {  
  41.            e.printStackTrace();  
  42.       }  
  43.   }  
  44. }

代码解释:

(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解析错误等)和进行性能优化(如设置合理的请求头、连接超时时间等)。

2. 完整的代码示例

下面是一个完整的Java代码示例,它使用Apache HttpClient和Jsoup库来从一个假设的博客网站抓取文章标题。这个示例包括了必要的异常处理和一些基本的HTTP请求配置。

首先,确保我们已经将Apache HttpClient和Jsoup作为依赖项添加到我们的项目中。如果我们使用的是Maven,可以在pom.xml中添加以下依赖:

  1. <dependencies>  
  2.    <dependency>  
  3.        <groupId>org.jsoup</groupId>  
  4.        <artifactId>jsoup</artifactId>  
  5.        <version>1.14.3</version>  
  6.    </dependency>  
  7.    <dependency>  
  8.        <groupId>org.apache.httpcomponents</groupId>  
  9.        <artifactId>httpclient</artifactId>  
  10.        <version>4.5.13</version>  
  11.    </dependency>  
  12. </dependencies>

接下来是完整的Java代码示例:

  1. import org.apache.http.client.methods.CloseableHttpResponse;
  2. import org.apache.http.client.methods.HttpGet;
  3. import org.apache.http.impl.client.CloseableHttpClient;
  4. import org.apache.http.impl.client.HttpClients;
  5. import org.apache.http.util.EntityUtils;
  6. import org.jsoup.Jsoup;
  7. import org.jsoup.nodes.Document;
  8. import org.jsoup.nodes.Element;
  9. import org.jsoup.select.Elements;
  10. public class BlogSpider {
  11. private static final String BASE_URL = "http://example.com/blog?page=";
  12. public static void main(String[] args) {
  13. int maxPages = 5; // 假设我们只爬取前5页
  14. for (int i = 1; i <= maxPages; i++) {
  15. String url = BASE_URL + i;
  16. System.out.println("Fetching page: " + url);
  17. try {
  18. fetchAndParsePage(url);
  19. } catch (Exception e) {
  20. System.err.println("Error fetching and parsing page " + i + ": " + e.getMessage());
  21. }
  22. }
  23. }
  24. private static void fetchAndParsePage(String url) throws Exception {
  25. try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
  26. HttpGet request = new HttpGet(url);
  27. // 我们可以在这里设置请求头,比如User-Agent
  28. // 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");
  29. try (CloseableHttpResponse response = httpClient.execute(request)) {
  30. if (response.getStatusLine().getStatusCode() == 200) {
  31. String html = EntityUtils.toString(response.getEntity(), "UTF-8");
  32. Document doc = Jsoup.parse(html);
  33. // 假设每个文章标题都在<h2 class="post-title">标签内
  34. Elements articleTitles = doc.select("h2.post-title");
  35. for (Element title : articleTitles) {
  36. System.out.println(title.text());
  37. }
  38. } else {
  39. System.err.println("Failed to fetch page: HTTP status code " + response.getStatusLine().getStatusCode());
  40. }
  41. }
  42. } catch (Exception e) {
  43. throw e; // 或者我们可以在这里处理特定的异常,比如IOException
  44. }
  45. }
  46. }

在这个示例中,我添加了一个try-catch块来捕获fetchAndParsePage方法中可能抛出的任何异常,并将其错误消息打印到标准错误输出。同时,我添加了一个注释掉的请求头设置示例,我们可以根据需要取消注释并修改它。

请注意,这个示例中的BASE_URL和选择器h2.post-title是假设的,我们需要根据我们要爬取的实际网站的HTML结构来修改它们。

此外,这个示例使用了try-with-resources语句来自动关闭CloseableHttpClientCloseableHttpResponse资源,这是一种更简洁且安全的资源管理方式。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/811430
推荐阅读
相关标签
  

闽ICP备14008679号