Java爬虫总结+jsoup+htmlunit

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依赖

 
        <dependency>
            <groupId>org.jsoupgroupId>
            <artifactId>jsoupartifactId>
            <version>1.7.3version>
        dependency>
       
        <dependency>
            <groupId>net.sourceforge.htmlunitgroupId>
            <artifactId>htmlunitartifactId>
            <version>2.23version>
        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 search(@RequestParam  String query) throws IOException {
        HashMap 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 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;
    }
}

返回结果展示

Java爬虫总结+jsoup+htmlunit_第1张图片

关键部分代码链接(每个人想要的结构可能不一样,只发逻辑代码吧)

内有其他小案例,个人学习中总结
传送门:https://download.csdn.net/download/yugehasaki666/10652411

最后的最后,马上中秋国庆了,祝大家玩的开心~


你可能感兴趣的:(Java,爬虫,jsoup,htmlunit)