如何“扫描”网站(或页面)以获取信息,并将其带入我的程序?

2022-08-31 16:50:12

好吧,我几乎正在尝试弄清楚如何从网页中提取信息,并将其带入我的程序(在Java中)。

例如,如果我知道我想要从中获取信息的确切页面,为了简单起见,百思买项目页面,我如何从该页面获取所需的适当信息?喜欢标题,价格,描述吗?

这个过程究竟叫什么?我甚至不知道是否要开始研究这个问题。

编辑:好的,我正在运行JSoup(BalusC发布的测试),但我一直收到这个错误:

Exception in thread "main" java.lang.NoSuchMethodError: java.util.LinkedList.peekFirst()Ljava/lang/Object;
at org.jsoup.parser.TokenQueue.consumeWord(TokenQueue.java:209)
at org.jsoup.parser.Parser.parseStartTag(Parser.java:117)
at org.jsoup.parser.Parser.parse(Parser.java:76)
at org.jsoup.parser.Parser.parse(Parser.java:51)
at org.jsoup.Jsoup.parse(Jsoup.java:28)
at org.jsoup.Jsoup.parse(Jsoup.java:56)
at test.main(test.java:12)

我有Apache Commons


答案 1

使用像Jsoup这样的HTML解析器。这比Java中可用的其他HTML解析器更受我的偏好,因为它支持CSS选择器这样的jQuery。此外,它的类表示节点列表 Elements,实现了 Iterable,以便您可以在增强的 for 循环中迭代它(因此无需在普通的 Java DOM 解析器中使用详细类和类似类)。NodeNodeList

下面是一个基本的启动示例(只需将最新的 Jsoup JAR 文件放在类路径中):

package com.stackoverflow.q2835505;

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

public class Test {

    public static void main(String[] args) throws Exception {
        String url = "https://stackoverflow.com/questions/2835505";
        Document document = Jsoup.connect(url).get();

        String question = document.select("#question .post-text").text();
        System.out.println("Question: " + question);

        Elements answerers = document.select("#answers .user-details a");
        for (Element answerer : answerers) {
            System.out.println("Answerer: " + answerer.text());
        }
    }

}

正如您可能已经猜到的那样,这打印了您自己的问题和所有回答者的姓名。


答案 2

这被称为屏幕抓取,维基百科上有这篇文章关于更具体的网络抓取。这可能是一个重大挑战,因为那里有一些丑陋的,混乱的,破碎的,如果不是浏览器的聪明,那么祝你好运。