如何“扫描”一个网站(或网页)的信息,并将其带入我的程序?
那么,我很想弄清楚如何从网页中提取信息,并将其带入我的程序(使用Java)。
例如,如果我知道我想从中获取信息的确切页面,为了简单起见,我将如何从该页面获取所需的相应信息? 像标题,价格,描述?
这个过程甚至会被称为什么? 我不知道甚至开始研究这个。
编辑:好吧,我正在运行JSoup(由BalusC发布的)的testing,但我不断收到此错误:
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
使用像Jsoup一样的HTMLparsing器。 这有我的首选在Java中提供的其他HTMLparsing器,因为它支持像CSSselect器的 jQuery 。 此外,它的类表示一个节点列表Elements
,实现了Iterable
因此您可以在增强的for循环中遍历它(所以不需要在平均的Java DOMparsing器中使用像Node
这样的冗长Node
和NodeList
)。
下面是一个基本的启动示例(只需将最新的Jsoup JAR文件放在classpath中):
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()); } } }
正如您可能已经猜到的那样,这会打印出您自己的问题以及所有答复者的姓名。
这就是所谓的屏幕抓取,维基百科这篇文章就更具体的网页抓取了 。 这可能是一个主要的挑战,因为那里有一些丑陋的,混乱的,如果不是为了浏览器的聪明HTML,所以祝你好运。
这个过程通常被称为“刮”。 您可以使用像TagSoup这样的parsing器来处理页面。
我会使用JTidy – 这对JSoup是相似的,但是我不知道JSoup。 JTidy处理断开的HTML并返回一个w3c文档,所以你可以用它作为XSLT的源代码来提取你真正感兴趣的内容。如果你不知道XSLT,那么你也可以使用JSoup作为Document模型比W3C更好地工作。
编辑:快速浏览JSoup网站显示JSoup可能确实是更好的select。 它似乎支持从文档中提取东西的CSSselect器。 这比使用XSLT更容易。
您可以使用一个htmlparsing器(这里有许多有用的链接: java htmlparsing器 )。
这个过程被称为“抓取网站内容”。 search“抢网站内容Java”进一步的转换。
jsoup支持java 1.5
https://github.com/tburch/jsoup/commit/d8ea84f46e009a7f144ee414a9fa73ea187019a3
看起来像堆栈是一个错误,并已被修复
JSoup的解决scheme是伟大的,但如果你需要提取一些非常简单的东西可能会更容易使用正则expression式或String.indexOf
正如其他人已经提到的过程被称为刮
您可能要查看HTML,看看是否可以find唯一的文本附近的string,然后可以使用行/字符偏移量来获取数据。
如果没有类似于C#中的System.XML.Linq
中find的XML类,那么在Java中可能会很笨拙。
你也可以试试jARVEST 。
它基于纯Java引擎上的JRuby DSL来抓取网站。
例如 :
查找网页中的所有链接( wget
和xpath
是jARVEST语言的结构):
wget | xpath('//a/@href')
在Java程序中:
Jarvest jarvest = new Jarvest(); String[] results = jarvest.exec( "wget | xpath('//a/@href')", //robot! "http://www.google.com" //inputs ); for (String s : results){ System.out.println(s); }
看看cURL库。 我从来没有在Java中使用它,但我确定必须有它的绑定。 基本上,你要做的就是发送一个cURL请求到任何你想“刮”的页面。 该请求将返回一个带有源代码的string到页面。 从那里,你将使用正则expression式来parsing你想要从源代码的任何数据。 这通常是你如何去做的。