时间:2023-06-08 01:21:02 | 来源:网站运营
时间:2023-06-08 01:21:02 来源:网站运营
玩转Java网页抓取:<dependencies> <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.14.1</version> </dependency></dependencies>
有了以上条件,我们就可以创建一个Java抓取工具了。import org.jsoup.Connection;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;import org.jsoup.select.Elements;
请注意,使用通配符导入所有内容-import org.jsoup.*.并不是一个好习惯。想要始终准确导入您需要的内容尽量少用通配符。上述导入是我们将在本Java网页抓取教程中使用的内容。Document doc = Jsoup.connect("https://en.wikipedia.org/wiki/Jsoup").get();
您会经常在一些地方看到这行代码,但它有一个缺点。这种快捷的方式没有做任何错误处理。更好的方法是创建一个函数。此函数以URL作为参数。首先,创建一个连接并将其存储在一个变量中。之后,get()调用连接对象的方法来检索HTML文档。该文档作为Document类的实例返回。该get()方法可以抛出一个IOException,此IOException需要进行处理,如下:public static Document getDocument(String url) { Connection conn = Jsoup.connect(url); Document document = null; try { document = conn.get(); } catch (IOException e) { e.printStackTrace(); // handle error } return document;}
在某些情况下,您需要传递自定义用户代理。这可以通过userAgent()在调用函数之前将用户代理字符串发送到函数来完成get()。Connection conn = Jsoup.connect(url);conn.userAgent("custom user agent");document = conn.get();
此操作基本能解决遇到的常见问题。Element firstHeading = document.getElementsByClass("firstHeading").first();System.out.println(firstHeading.text());
这些功能都不错;但是,它们仅限于JSoup。对于大多数情况,select函数可能是更好的选择。选择功能不起作用的唯一情况是您需要向上遍历文档的时候。在这些情况下,您可能需要使用parent(),children()和child()。有关所有可用方法的完整列表,请访问此页面:Element firstHeading= document.selectFirst(".firstHeading");
在这个例子中,使用了selectFirst()方法。如果需要选择多个元素,可以使用该select()方法。将采用CSS Selector作为参数并返回一个实例Elements,它是类型ArrayList<Element>的扩展。<dependency> <groupId>net.sourceforge.htmlunit</groupId> <artifactId>htmlunit</artifactId> <version>2.51.0</version></dependency>
02.获取HTMLimport com.gargoylesoftware.htmlunit.WebClient;import com.gargoylesoftware.htmlunit.html.DomNode;import com.gargoylesoftware.htmlunit.html.DomNodeList;import com.gargoylesoftware.htmlunit.html.HtmlElement;import com.gargoylesoftware.htmlunit.html.HtmlPage;
如上一节所述,执行通配符导入(例如import com.gargoylesoftware.htmlunit.html.*.)并不是一个好习惯。我们依旧不使用通配符,只导入我们需要的内容。这里导入的是我们将在本Java网页抓取教程中使用的内容。WebClient webClient = new WebClient();webClient.getOptions().setCssEnabled(false);webClient.getOptions().setJavaScriptEnabled(false);HtmlPage page = webClient.getPage("https://librivox.org/the-first-men-in-the-moon-by-hg-wells");
请注意,getPage()函数可以抛出public static HtmlPage getDocument(String url) { HtmlPage page = null; try (final WebClient webClient = new WebClient()) { webClient.getOptions().setCssEnabled(false); webClient.getOptions().setJavaScriptEnabled(false); page = webClient.getPage(url); } catch (IOException e) { e.printStackTrace(); } return page;}
然后我们可以继续下一步。HtmlPage page = webClient.getPage("https://en.wikipedia.org/wiki/Jsoup");DomElement firstHeading = page.getElementById ("firstHeading");System.out.print(firstHeading.asNormalizedText()); // prints Jsoup
第二类方法是使用XPath。在本Java网页抓取教程中,我们将使用Java创建一个网页抓取工具。//div[@class="content-wrap clearfix"]/h1.
HtmlElement book = page.getFirstByXPath("//div[@class=/"content-wrap clearfix/"]/h1");System.out.print(book.asNormalizedText());
最后,第三类方法是使用CSS选择器。这类方法是querySelector()和querySelectorAll()。他们分别返回DomNode和DomNodeList<DomNode>。String selector = ".chapter-download tbody tr";DomNodeList<DomNode> rows = page.querySelectorAll(selector);for (DomNode row : rows) { String chapter = row.querySelector("td:nth-child(2) a").asNormalizedText(); String reader = row.querySelector("td:nth-child(3) a").asNormalizedText(); String duration = row.querySelector("td:nth-child(4)").asNormalizedText(); System.out.println(chapter + "/t " + reader + "/t " + duration);}
关键词: