java-网络爬虫 1

Java中的网络爬虫

1. 网络爬虫的基本概念

网络爬虫(Web Crawler)是一种自动化程序,通常用于遍历网页并提取所需数据。网络爬虫广泛应用于搜索引擎、数据采集、信息监控等领域。它通过模拟浏览器的行为,访问网页、解析内容、提取数据并存储到本地或数据库中。

2. 网络爬虫的基本流程

一个简单的网络爬虫通常包括以下几个步骤:

  1. 1. 发送HTTP请求:向目标网页发送HTTP请求,获取网页内容。
  2. 2. 解析HTML内容:解析返回的HTML内容,提取所需的数据。
  3. 3. 处理数据:对提取的数据进行处理和存储。
  4. 4. 处理链接:提取网页中的链接,继续爬取其他网页。

3. 使用Java进行网络爬虫开发

Java提供了多种库和工具,可以用来开发网络爬虫。常用的包括:

  • • java.net:提供基本的网络通信功能。
  • • JSoup:一个强大的HTML解析库,用于解析、操作和清理HTML。
  • • HttpClient:Apache的HTTP客户端库,用于发送HTTP请求。

4. 使用java.net包开发简单爬虫

以下示例展示了如何使用Java内置的java.net包发送HTTP请求并获取网页内容。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class SimpleCrawler {
    public static void main(String[] args) {
        String url = "http://example.com";
        try {
            URL obj = new URL(url);
            HttpURLConnection connection = (HttpURLConnection) obj.openConnection();
            connection.setRequestMethod("GET");

            int responseCode = connection.getResponseCode();
            System.out.println("Response Code : " + responseCode);

            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String inputLine;
            StringBuilder response = new StringBuilder();

            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }
            in.close();

            // 打印响应内容
            System.out.println(response.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在上述代码中,通过HttpURLConnection发送HTTP GET请求,并读取响应内容。

5. 使用JSoup解析HTML内容

JSoup是一个用于解析、操作和清理HTML的Java库。它提供了强大的选择器语法,类似于jQuery,用于提取HTML文档中的数据。

5.1 解析网页内容

以下示例展示了如何使用JSoup解析网页内容并提取特定的元素。

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class JsoupExample {
    public static void main(String[] args) {
        String url = "http://example.com";
        try {
            Document doc = Jsoup.connect(url).get();

            // 获取网页标题
            String title = doc.title();
            System.out.println("Title: " + title);

            // 获取所有的链接
            Elements links = doc.select("a[href]");
            for (Element link : links) {
                System.out.println("Link: " + link.attr("href"));
                System.out.println("Text: " + link.text());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在上述代码中,使用Jsoup.connect(url).get()获取网页内容,并使用选择器提取所有的链接。

5.2 处理表格数据

以下示例展示了如何使用JSoup提取网页中的表格数据。

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class TableParser {
    public static void main(String[] args) {
        String url = "http://example.com/table";
        try {
            Document doc = Jsoup.connect(url).get();
            Element table = doc.select("table").first();
            Elements rows = table.select("tr");

            for (Element row : rows) {
                Elements cells = row.select("td");
                for (Element cell : cells) {
                    System.out.print(cell.text() + "\t");
                }
                System.out.println();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在上述代码中,使用选择器提取网页中的表格数据,并逐行打印。

6. 使用HttpClient发送HTTP请求

Apache HttpClient是一个功能强大的HTTP客户端库,用于发送HTTP请求和处理HTTP响应。它支持高级功能,如代理、认证、重定向等。

6.1 发送GET请求

以下示例展示了如何使用HttpClient发送HTTP GET请求并获取响应内容。

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
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;

public class HttpClientExample {
    public static void main(String[] args) {
        String url = "http://example.com";
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            HttpGet request = new HttpGet(url);
            try (CloseableHttpResponse response = httpClient.execute(request)) {
                HttpEntity entity = response.getEntity();
                if (entity != null) {
                    String result = EntityUtils.toString(entity);
                    System.out.println(result);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在上述代码中,使用HttpGet对象发送HTTP GET请求,并使用EntityUtils.toString方法读取响应内容。

6.2 发送POST请求

以下示例展示了如何使用HttpClient发送HTTP POST请求。

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

public class HttpClientPostExample {
    public static void main(String[] args) {
        String url = "http://example.com/api";
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            HttpPost post = new HttpPost(url);
            String json = "{\"key1\":\"value1\",\"key2\":\"value2\"}";
            StringEntity entity = new StringEntity(json);
            post.setEntity(entity);
            post.setHeader("Accept", "application/json");
            post.setHeader("Content-type", "application/json");

            try (CloseableHttpResponse response = httpClient.execute(post)) {
                HttpEntity responseEntity = response.getEntity();
                if (responseEntity != null) {
                    String result = EntityUtils.toString(responseEntity);
                    System.out.println(result);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在上述代码中,通过HttpPost对象发送HTTP POST请求,并设置请求头和请求体。

7. 处理Cookie和Session

在一些网站上,爬虫需要处理Cookie和Session来模拟用户的登录状态和会话。HttpClient提供了相关的功能来处理Cookie和Session。

import org.apache.http.client.CookieStore;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.cookie.BasicClientCookie;

public class CookieExample {
    public static void main(String[] args) {
        String url = "http://example.com";
        CookieStore cookieStore = new BasicCookieStore();
        BasicClientCookie cookie = new BasicClientCookie("sessionid", "123456");
        cookie.setDomain("example.com");
        cookie.setPath("/");
        cookieStore.addCookie(cookie);

        RequestConfig globalConfig = RequestConfig.custom().setCookieSpec("standard").build();
        try (CloseableHttpClient httpClient = HttpClients.custom()
                .setDefaultCookieStore(cookieStore)
                .setDefaultRequestConfig(globalConfig)
                .build()) {
            HttpGet request = new HttpGet(url);
            try (CloseableHttpResponse response = httpClient.execute(request)) {
                System.out.println("Response Code : " + response.getStatusLine().getStatusCode());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在上述代码中,通过CookieStore管理Cookie,并在请求中携带这些Cookie。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值