Java爬虫 信息抓取的实现

Java爬虫可以通过模拟浏览器的行为,自动化地访问网页并抓取所需信息,主要分为以下几个步骤:

1. 简述Web爬虫的基本工作流程

1.1 网页访问

要抓取的信息一般都在网页中,因此第一步是访问目标网站。由于Java爬虫需要模拟浏览器的行为,因此一般使用java.net.HttpURLConnectionorg.apache.http.client.HttpClient等工具类进行网络请求。

1.2 网页内容解析

访问到网页后,就需要对其内容进行解析。HTML网页内容一般使用org.jsoup.Jsoup等工具进行解析,而JSON格式的内容可以使用com.alibaba.fastjson.JSONObject进行解析。

1.3 数据提取

解析到了网页中的内容,就需要从中提取出我们所需的数据,这个过程一般使用正则表达式或XPath表达式进行匹配。

1.4 数据保存

提取到所需数据后,需要把它保存下来,这可以使用Java中提供的文件操作API或者数据库进行保存。

2. 爬虫实现的具体细节

2.1 构造URL

访问Web页面需要构造URL,而构造URL需要了解目标网站的URL规则。根据目标网页的URL规律,可以利用Java中提供的java.net.URL类将构造出来的URL转换为URL对象,从而方便地进行后续的处理。

2.2 模拟浏览器

模拟浏览器行为是爬虫实现的核心,一般要做到以下几点:

  1. 伪装User-Agent头

为了让目标网站以为我们是一个正常的浏览器,需要在请求头中添加User-Agent,一般使用MozillaChrome

connection.setRequestProperty("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");
  1. 保存Cookie

大部分网站需要登录才能访问其它页面,这就需要保存Cookie。可以使用Java中提供的java.net.CookieManager类来管理Cookie。

CookieManager cookieManager = new CookieManager();
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
CookieHandler.setDefault(cookieManager);
  1. 处理重定向

有些页面会重定向到其它页面,这就需要处理重定向。可以使用Java中HttpURLConnection.getResponseCode()方法判断返回码是否为302,如果是,就取出重定向的URL再次进行请求。

if (httpConnection.getResponseCode() == HttpURLConnection.HTTP_MOVED_TEMP) {
    String redirectUrl = httpConnection.getHeaderField("Location");
    // 对重定向的URL再次进行请求
}

2.3 解析网页内容

Java爬虫主要针对HTML和JSON两种格式的数据进行爬取。

  1. 解析HTML

可以使用org.jsoup.Jsoup类进行HTML的解析,它可以简单地定位到指定的标签并获取其中的内容:

Document document = Jsoup.parse(htmlString);
Elements links = document.select("#div_id .a_class");
for (Element link : links) {
    String href = link.attr("href");
    String text = link.text();
}
  1. 解析JSON

可以使用阿里巴巴的com.alibaba.fastjson.JSONObject类实现对JSON数据的解析:

JSONObject jsonObject = JSONObject.parseObject(jsonString);
String name = jsonObject.getString("name");
int age = jsonObject.getIntValue("age");
JSONObject companyJson = jsonObject.getJSONObject("company");

2.4 数据提取

在解析到网页内容后,就需要从中提取出我们想要的数据。这可以使用正则表达式或XPath表达式进行匹配。

  1. 正则表达式

Java中提供的java.util.regex包提供了对正则表达式的支持,可以通过正则表达式来提取目标数据。

Pattern pattern = Pattern.compile("正则表达式");
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
    String result = matcher.group();
}
  1. XPath表达式

XPath是一种在XML文档中选取内容的语言,可以通过XPath来提取HTML文档中的数据。

XPath xpath = XPathFactory.newInstance().newXPath();
Node node = (Node) xpath.evaluate("XPath表达式", new InputSource(new StringReader(content)), XPathConstants.NODE);
String result = node.getTextContent();

3.示例说明

下面给出两个Java爬虫的示例说明:

3.1 爬取百度搜索结果

public static void main(String[] args) throws IOException {
    String keyword = "Java爬虫";
    String url = "https://www.baidu.com/s?wd=" + keyword;
    HttpURLConnection httpConnection = (HttpURLConnection) new URL(url).openConnection();
    httpConnection.setRequestMethod("GET");
    httpConnection.setRequestProperty("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");
    httpConnection.setInstanceFollowRedirects(false);
    Map<String, List<String>> headers = httpConnection.getHeaderFields();
    if (headers.get("Location") != null) {
        url = headers.get("Location").get(0);
        httpConnection = (HttpURLConnection) new URL(url).openConnection();
        httpConnection.setRequestMethod("GET");
        httpConnection.setRequestProperty("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");
    }
    InputStream inputStream = httpConnection.getInputStream();
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
    String line;
    StringBuilder stringBuilder = new StringBuilder();
    while ((line = bufferedReader.readLine()) != null) {
        stringBuilder.append(line + "\n");
    }
    bufferedReader.close();
    inputStream.close();
    Document document = Jsoup.parse(stringBuilder.toString());
    Elements elements = document.select("#content_left h3.t a");
    for (Element element : elements) {
        String title = element.text();
        String link = element.attr("href");
        System.out.println(title + " -> " + link);
    }
}

3.2 爬取豆瓣图书信息

public static void main(String[] args) throws IOException, XPathExpressionException {
    String url = "https://book.douban.com/subject/1084336/";
    HttpURLConnection httpConnection = (HttpURLConnection) new URL(url).openConnection();
    httpConnection.setRequestMethod("GET");
    httpConnection.setRequestProperty("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");
    InputStream inputStream = httpConnection.getInputStream();
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
    String line;
    StringBuilder stringBuilder = new StringBuilder();
    while ((line = bufferedReader.readLine()) != null) {
        stringBuilder.append(line);
    }
    bufferedReader.close();
    inputStream.close();
    String content = stringBuilder.toString();
    XPath xpath = XPathFactory.newInstance().newXPath();
    Node node = (Node) xpath.evaluate("//div[@id='info']", new InputSource(new StringReader(content)), XPathConstants.NODE);
    NodeList children = node.getChildNodes();
    for (int i = 0; i < children.getLength(); i++) {
        Node child = children.item(i);
        if (child.getNodeType() == Node.ELEMENT_NODE && child.getNodeName().equals("span")) {
            if (child.getTextContent().contains("出版社")) {
                String publisher = child.getNextSibling().getTextContent();
                System.out.println("出版社:" + publisher);
            }
            if (child.getTextContent().contains("原作名")) {
                String originName = child.getNextSibling().getTextContent();
                System.out.println("原作名:" + originName);
            }
        }
    }
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java爬虫 信息抓取的实现 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • javascript对JSON数据排序的3个例子

    JavaScript对JSON数据排序的3个例子 在JavaScript中,我们可以使用sort()方法对JSON数据进行排序。sort()方法是数组的一个原生方法,可以按照一定规则对数组进行排序。本文将通过三个例子详细讲解如何使用sort()方法对JSON数据进行排序。 例子1:按照数字大小排序 var data = [ { name: ‘John’, a…

    C 2023年5月23日
    00
  • VS2022实现VC++打包生成安装文件图文详细历程

    下面将为你详细讲解“VS2022实现VC++打包生成安装文件图文详细历程”,主要步骤包括创建VC++工程、打包生成、安装文件制作、安装文件测试。具体内容如下: 创建VC++工程 打开 Visual Studio 2022,点击“新建项目”。 在弹出的“新建项目”窗口中,选择“Visual C++”分类,并在其中选择“Windows桌面向导”选项。 在下一个窗…

    C 2023年5月30日
    00
  • 小米4c怎么样?小米4c搭载骁龙808和Type-C

    当谈到小米4c时,我们需要关注它的配置和性能。小米4c主打设计良好且价格亲民的特点,它的主要优势在于骁龙808处理器和Type-C接口。 小米4c搭载骁龙808处理器 小米4c搭载了骁龙808处理器,它是高通推出的一款六核心处理器,其中两个大核心时钟频率高达1.8GHz,剩下的四个小核心时钟频率为1.4GHz。 骁龙808处理器采用了Adreno 418 G…

    C 2023年5月23日
    00
  • C++命令行解析包gflags的使用教程

    C++命令行解析包gflags的使用教程 什么是gflags? gflags是Google开源的C++命令行解析包,可以方便的对C++程序进行命令行参数的解析,自动生成帮助信息等操作。使用gflags需要引入头文件。 gflags的基本用法 在C++程序中使用gflags的过程中,主要可以通过两个宏定义来添加命令行参数: DEFINE_xx: 定义一个命令行…

    C 2023年5月23日
    00
  • c++容器list、vector、map、set区别与用法详解

    C++容器list、vector、map、set区别与用法详解 C++容器是C++标准库提供的一些数据结构,包括vector、list、map、set等。这些容器在我们编写代码时,经常会被用到。针对不同的应用场景,我们会选择不同的容器。本文将对C++中常用的四种容器:list、vector、map、set做一个详细介绍,分别介绍其区别和用法。 List li…

    C 2023年5月22日
    00
  • c调用python调试方法

    下面是我为您提供的“C调用Python调试方法”的完整攻略。 1. 准备工作 在开始调试之前,您需要确认您已经完成以下准备工作: 安装 Python 解释器和相应的依赖库。 编写 Python 脚本并进行相关测试,确保 Python 脚本可用。 编写 C 代码,并根据您的需求将其与 Python 脚本进行交互。在 C 代码中,您可以使用 Python 提供的…

    C 2023年5月23日
    00
  • VS Code+msys2配置Windows系统下C/C++开发环境

    下面就是关于“VS Code+msys2配置Windows系统下C/C++开发环境”的完整攻略。 第一步:安装必要软件 首先,我们需要下载并安装以下软件: Visual Studio Code msys2 MinGW-w64 其中,Visual Studio Code是一款优秀的开源代码编辑器;msys2是一个包含大量 Unix/Linux 工具和库的环境,…

    C 2023年5月23日
    00
  • 浅析Linux下精确控制时间的函数

    浅析Linux下精确控制时间的函数 在Linux下,我们可以使用一些函数来精确地控制时间。本文将介绍其中常用的三个函数,分别是gettimeofday(), clock_gettime(), usleep()。 gettimeofday() int gettimeofday(struct timeval *tv, struct timezone *tz); …

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部