3. 定向采集

定向采集,指我们已经有了明确的采集目标与采集规则,比如我们要采集一个新闻站点,那么首先取得新闻列表中全部详情页面的链接地址,再通过链接请求详情页面的内容,这就是一个标准的定向采集爬虫。
定向采集在大数据分析、商业情报、网络安全等领域有着广泛的应用。

在 Java 中,可以使用 Jsoup、HttpClient、Selenium 等工具来实现定向采集。

3.1 下载网页

我们要了解到,web网页其实是一种超文本标记语言,它通常存储为文本文档,我们的目的就是把这个文本文档下载到本地。

3.2 下载图片与文件

在网页内容中,可能会存在一些图片或者是文件等资源,这些内容如果不同时采集到本地,那么我们保存的内容就是不完全的,所以我们还有能够下载图片与文件。图片与文件通常存储为二进制的流,我们的目的就是把这个流读取到本地并创建为二进制文件。

3.3 HttpClient

HttpClient 是一个强大的 HTTP 客户端库,支持发送 HTTP 请求、处理 HTTP 响应等多种功能。在采集网页内容时,可以使用 HttpClient 发送 HTTP 请求并获取响应,然后通过解析响应数据来获取需要的信息。

以下是使用 HttpClient 进行网页采集的示例代码:

import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import java.io.IOException;

public class WebCrawler {
    public static void main(String[] args) {
        HttpClient client = HttpClientBuilder.create().build();
        HttpGet request = new HttpGet("https://www.example.com/");
        try {
            // 发送 HTTP 请求并获取响应
            HttpResponse response = client.execute(request);

            // 处理响应数据
            String content = EntityUtils.toString(response.getEntity());
            System.out.println("Content: " + content);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在上面的示例代码中,我们使用 HttpClient 发送 HTTP 请求并获取响应,然后通过 EntityUtils 工具类将响应数据转换为字符串,并输出字符串内容。

3.4 Selenium

Selenium是一个用于测试web应用的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。我们可以通过Java调用Selenium执行逻辑,模拟人工操作。

我们为什么要用Selenium呢? 由于互联网应用越来越复杂,新上线的很多网站已经不是静态站点了,有很多单页应用,所谓单页应用就是整个站点仅有一个网页,网站上的所有内容通过http请求动态加载,这样的网站通过上面下载网页的形式已经不能正常读取了,所以我们借由Selenium访问并进行采集。

下面是一个用Selenium进行采集任务的代码示例:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import java.util.List;

public class WebCrawler {
    public static void main(String[] args) {
        // 设置浏览器驱动路径
        System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");

        // 创建 Chrome 浏览器实例
        WebDriver driver = new ChromeDriver();

        // 打开网页
        driver.get("https://www.example.com/");

        // 获取需要的元素
        List<WebElement> links = driver.findElements(By.tagName("a"));
        for (WebElement link : links) {
            System.out.println("Link: " + link.getAttribute("href"));
        }

        // 关闭浏览器实例
        driver.quit();
    }
}

在上面的示例代码中,我们使用 Selenium 创建 Chrome 浏览器实例,并打开指定的网页,然后通过定位链接元素的方式获取所有的链接,并输出链接的地址。

除了上述工具之外,还有一些其他的 Java 网络爬虫框架,例如 WebMagic、Crawler4j 等,可以帮助我们更方便地实现定向采集功能。

以上全部工具,我们可以根据实际情况任意组合使用,最终目的就是帮助我们顺利采集到数据即可。