Java代码实现 Htmlunit+jsoup模拟百度关键词搜索并解析页面得到自己想要的数据
初级Java开发的自我学习过程:本人qq 88410326
- idea
- springboot
- springMVC
- mysql
- htmlunit
- jsoup
实现步骤
springboot搭建—具体略过
(1)引入maven依赖
- (2)htmlunit实现,模拟浏览器打开百度搜索首页
- (3)打开浏览器百度页面,通过开发者工具检索找到,关键词输入框和搜索按钮。
- (4)通过模拟出的浏览器,向输入框输入关键字,并触发点击事件,提交表单请求
- (5)得到搜索结果页面,并解析成xml字符串
- (6)jsoup,通过xml字符串解析得到完成页面的docunment
- (7)通过各种筛选方法,比如标签过滤,按class名称过滤,按id过滤,当然也有select方法,类似于css标签选择器筛选(”div.result.c-container”)
- (8)把得到的数据封入定义好的bean中,并写入数据库
- (9)我这里为了展示效果,没有去存数据库(其实都是按需要处理的),返回json数据到浏览器
- (10)下边是具体流程细节,代码仅供参考,页面不同代表着代码也会有区别
引入maven依赖
<!--引入jsoup 利用Jsoup实现数据抓取-->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.7.3</version>
</dependency>
<!--模拟网页,实现动态获取-->
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
<version>2.23</version>
</dependency>
为了展示效果,通过controller返回数据到浏览器
ExtractController
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
import com.gargoylesoftware.htmlunit.html.HtmlTextInput;
import com.spider.demo3.bean.SearchResult;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@Controller
@RequestMapping("/search")
public class ExtractController {
@RequestMapping(value = "/key" ,method = RequestMethod.GET)
@ResponseBody
public HashMap<String,Object> search(@RequestParam String query) throws IOException {
HashMap<String, Object> hashMap = new HashMap<>();
// 得到浏览器对象,直接New一个就能得到,现在就好比说你得到了一个浏览器了
WebClient webclient = new WebClient();
// 这里是配置一下不加载css和javaScript,因为httpunit对javascript兼容性不太好
webclient.getOptions().setCssEnabled(false);
webclient.getOptions().setJavaScriptEnabled(false);
// 做的第一件事,去拿到这个网页,只需要调用getPage这个方法即可
HtmlPage htmlpage = webclient.getPage("http://www.baidu.com");
// 根据名字得到一个表单,查看上面这个网页的源代码可以发现表单的名字叫“f”
final HtmlForm form = htmlpage.getFormByName("f");
// 同样道理,获取”百度一下“这个按钮
final HtmlSubmitInput button = form.getInputByValue("百度一下");
// 得到搜索框
final HtmlTextInput textField = form.getInputByName("wd");
//搜索我的id
//我这里搜索关键词是:周杰伦十大经典说唱---哈哈本人粉丝一枚
textField.setValueAttribute(query);
// 输入好了,我们点一下这个按钮
final HtmlPage nextPage = button.click();
String pageXml = nextPage.asXml();
Document parse = Jsoup.parse(pageXml, "http://www.baidu.com");
Elements elements = parse.select("div.result.c-container");
List<SearchResult> datas = new ArrayList<>();
for (Element e : elements) {
SearchResult data = new SearchResult();
//标题
Elements el = e.getElementsByTag("a");
Element element2 = el.get(0);
String s = element2.text();
data.setTitle(s);
//内容摘要
Elements elementsByClass = e.getElementsByClass("c-abstract");
if(elementsByClass!=null&&elementsByClass.size()!=0){
Element element = elementsByClass.get(0);
String text1 = element.text();
data.setContent(text1);
}else {
Elements p = e.getElementsByTag("p");
Element element = p.get(1);
data.setContent(element.text());
}
//图片地址
Elements elementsByClass1 =e.getElementsByTag("img");
if(elementsByClass1!=null&&elementsByClass1.size()!=0){
Element element1 = elementsByClass1.get(0);
String src = element1.attr("src");
data.setPicUrl(src);
}else{
data.setPicUrl("");
}
datas.add(data);
hashMap.put("myData",datas);
}
return hashMap;
}
}
返回结果展示
关键部分代码链接(每个人想要的结构可能不一样,只发逻辑代码吧)
内有其他小案例,个人学习中总结
传送门:https://download.youkuaiyun.com/download/yugehasaki666/10652411
最后的最后,马上中秋国庆了,祝大家玩的开心~