使用HtmlUnit抓取百度搜索结果

本文介绍了如何利用HtmlUnit库来实现对百度高级新闻搜索的功能,特别是针对指定时间段的新闻搜索。在操作过程中,关键在于识别并设置隐藏的bt和et参数,它们表示用户选择的时间段相对于1970-1-1的时长,添加这两个参数才能正确获取到所需时间段的新闻数据。

       htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容。项目可以模拟浏览器运行,被誉为java浏览器的开源实现。这个没有界面的浏览器,运行速度也是非常迅速的。相关文件下载地址: http://sourceforge.net/projects/htmlunit/files/  (依赖的包略多 微笑

      我的需求是使用百度的高级新闻搜索,抓取指定时间段的新闻,手动搜索的设置如图所示:

      

         通过htmlunit可以方便地操作网页中的form和各类的input控件,如HtmlSubmitInput,HtmlTextInput,HtmlRadioButtonInput,HtmlHiddenInput等等,可以通过name和value查找对应的DOM结点。一开始遇到的问题是,即使正确地操作了radio Button,也不能得出正确的时间段内的结果,用chrome查看了Http header后发现,百度在form中隐藏了两个参数,参数名为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<HtmlRadioButtonInput> radioButtons = form
				.getRadioButtonsByName("s");
		radioButtons.get(0).setChecked(false);
		radioButtons.get(1).setChecked(true);// 选中限定时间段的radion button
		final List<HtmlRadioButtonInput> 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);

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值