抓取网页新闻(htmlunitjava页面分析工具的浏览器运行速度也迅速的应用 )
优采云 发布时间: 2022-01-22 19:17抓取网页新闻(htmlunitjava页面分析工具的浏览器运行速度也迅速的应用
)
htmlunit 是一个开源的java页面分析工具。阅读完页面后,可以有效地使用htmlunit分析页面上的内容。该项目可以模拟浏览器的操作,称为java浏览器的开源实现。这个没有界面的浏览器运行速度非常快。相关文件下载地址:(依赖包稍微多一些
)
我的要求是使用百度的高级新闻搜索来抓取指定时间段的新闻。手动搜索设置如图:
通过htmlunit,可以方便的操作网页中的表单和各种输入控件,如HtmlSubmitInput、HtmlTextInput、HtmlRadioButtonInput、HtmlHiddenInput等,通过名称和值可以找到对应的DOM节点。一开始遇到的问题是,即使正确操作了radio Button,也无法得到正确时间段的结果。用chrome查看Http header后发现百度在表单中隐藏了两个参数。参数名称为bt和et,分别代表用户选择的两次begin_date和end_date之间的时间间隔,以及1970-1-1的时间戳。因此,需要手动添加这两个参数,才能得到对应时间段的结果。代码如下:
final WebClient webclient = new WebClient();
final HtmlPage htmlpage = webclient
.getPage("http://news.baidu.com/advanced_news.html");
webclient.setCssEnabled(false);
webclient.setJavaScriptEnabled(false);
// System.out.println(htmlpage.getTitleText());
final HtmlForm form = htmlpage.getFormByName("f");
final HtmlSubmitInput button = form.getInputByValue("百度一下");
final HtmlTextInput textField = form.getInputByName("q1");
textField.setValueAttribute(word);
final List radioButtons = form
.getRadioButtonsByName("s");
radioButtons.get(0).setChecked(false);
radioButtons.get(1).setChecked(true);// 选中限定时间段的radion button
final List titleButtons = form
.getRadioButtonsByName("tn");
titleButtons.get(0).setChecked(false);
titleButtons.get(1).setChecked(true); //选中“仅在新闻的标题中”的radion button
HtmlHiddenInput bt = form.getInputByName("bt");
bt.setValueAttribute("1167580800"); //2007-1-1的时间戳
HtmlHiddenInput et = form.getInputByName("et");
et.setValueAttribute("1199116799"); //2007-12-31的时间戳
final HtmlPage page2 = button.click();
String result = page2.asText();
Pattern pattern = Pattern.compile("找到相关新闻 约(.*) 篇");
Matcher matcher = pattern.matcher(result);
webclient.closeAllWindows();
if (matcher.find())
return matcher.group(1);