htmlunit 抓取网页(抓一个今日头条的首页内容解决方案-苏州安嘉)

优采云 发布时间: 2021-09-27 00:09

  htmlunit 抓取网页(抓一个今日头条的首页内容解决方案-苏州安嘉)

  不知道大家在使用jsoup的过程中是否遇到过爬取内容的情况,发现有些网页的内容是通过JavaScript异步加载的,导致我们的爬虫空手返回(只抓到了一个网页) 。

  遇到这个问题首先想到的有两种解决方案:

  在网页的异步加载完成后,使用类似于Python中的延迟加载的方法对异步加载的网页进行爬取。使用特殊的方法让被爬取的网页的外框模拟里面的JavaScript代码的执行,最终到达完整的网页。

  在搜索引擎的帮助下,我决定使用选项2来解决问题。选项 1 没有搜索更好的第三方库。在java中使用Option 1解决这个问题的朋友希望能和下一个一起讨论,太好了。

  案例很简单,抓取今日头条的首页内容。你可以看看今日头条的主页。里面的内容是异步加载的。

  添加jsoup和htmlunit的依赖

  

org.jsoup

jsoup

1.10.2

net.sourceforge.htmlunit

htmlunit

2.25

  首先我们单独使用jsoup解析今日头条首页

  String url = "https://www.toutiao.com/";

Connection connect = Jsoup.connect(url);

Document document = connect.get();

System.out.println(document);

  ↑ 这里只能获取网页的frame内容,不能获取首页的新闻内容

  接下来我们用htmlunit试试

  //构造一个webClient 模拟Chrome 浏览器

WebClient webClient = new WebClient(BrowserVersion.CHROME);

//屏蔽日志信息

LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log",

"org.apache.commons.logging.impl.NoOpLog");

java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF);

//支持JavaScript

webClient.getOptions().setJavaScriptEnabled(true);

webClient.getOptions().setCssEnabled(false);

webClient.getOptions().setActiveXNative(false);

webClient.getOptions().setCssEnabled(false);

webClient.getOptions().setThrowExceptionOnScriptError(false);

webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);

webClient.getOptions().setTimeout(5000);

HtmlPage rootPage = webClient.getPage(url);

//设置一个运行JavaScript的时间

webClient.waitForBackgroundJavaScript(5000);

String html = rootPage.asXml();

Document document = Jsoup.parse(html);

  /imgrdrct/http://static.blog.csdn.net/images/save_snippets.png

  这样我们就可以在运行后得到一个收录JavaScript的完整源码网页

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线