栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

用java实现异步爬虫并实现数据库mysql的插入

用java实现异步爬虫并实现数据库mysql的插入

文章目录
    • 用java实现异步爬虫并实现数据库mysql的插入
    • 首先是maven依赖
    • 项目结构
    • 建立bean类
    • 爬虫
    • 获取response
    • 数据库的注册
    • 使用Query.Runner进行数据库操作

用java实现异步爬虫并实现数据库mysql的插入

当我们用爬虫爬取网站源代码时,会出现没有数据的情况,是因为数据都在js里面,没有加载,用异步爬虫可以解决js无法加载的问题

首先是maven依赖


    4.0.0

    pesticate1
    1
    1.0-SNAPSHOT

    
    
        org.jsoup
        jsoup
        1.14.2
    
    
    
        net.sourceforge.htmlunit
        htmlunit
        2.43.0
    

    
        commons-dbutils
        commons-dbutils
        1.6
    
    
        commons-dbcp
        commons-dbcp
        1.4
    
    
        mysql
        mysql-connector-java
        8.0.25
    




项目结构

建立bean类
public class Modell {
//    插入的bean
    private int id;
    private String title;
    private String add;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getAdd() {
        return add;
    }

    public void setAdd(String add) {
        this.add = add;
    }
}

我们的项目要用到htmlunit获取信息和jsoup进行信息分类

爬虫
/使用htmlunit框架爬取渲染完成后的网页
//另一个是jsoup框架,用来分类数据
public class URLFecter {
    public static List URLparser( String url) throws Exception {
        HttpClient client = HttpClientBuilder.create().build();
//        创建client请求对象
//     遇到困难   用defaulthttpclient方法失败,查询版本更新只能用httpclientbuilder.create.build方法
        List Data = new ArrayList();
//        创建返回对象
        HttpResponse response = HTTPUtils.getHtml(client, url);
//        response请求
        int StatusCode = response.getStatusLine().getStatusCode();
//       查看状态码
        System.out.println(StatusCode);
        if (StatusCode == 200) {
//            表示连接成功
            final WebClient webClient=new WebClient(BrowserVersion.CHROME);
//            设置浏览器为谷歌浏览器
            webClient.getOptions().setThrowExceptionOnscriptError(false);
//            不抛出js异常
            webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
//            不抛出状态码异常
            webClient.getOptions().setActiveXNative(false);
//            不启动ActiveX
            webClient.getOptions().setCssEnabled(false);
//            不启动css
            webClient.getOptions().setJavascriptEnabled(true);
//            启动js
            webClient.getOptions().setDownloadImages(false);
//            不下载图片
            webClient.setAjaxController(new NicelyResynchronizingAjaxController());
//          支持ajax写法的js代码
            HtmlPage page=null;

            try{
                page=webClient.getPage(url);
//               抓取网页

            }catch (Exception e){
                e.printStackTrace();
            }finally {
                webClient.close();
            }
            webClient.waitForBackgroundJavascript(5000);
//            设置等待js的时间为1秒
            String pageXml=page.asXml();
//            将页面转化为xml格式
            Data = Parse.getData(pageXml);
//            进行数据分类
        } else {
            System.out.println("服务器未响应!!!!!!");
        }
        return Data;
    }
}
获取response
public abstract class HTTPUtils{
    public static HttpResponse getHtml(HttpClient client,String url)throws ClientProtocolException,IOException {
        HttpGet getmeth=new HttpGet(url);
//        httpget是httpclient的工具类
        HttpResponse response=new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_OK,"OK");
//        获取response
        try {
            response=client.execute(getmeth);
//            执行get请求
            System.out.println(response);
        }catch (IOException e){
            e.printStackTrace();
        }

        return response;
//        返回执行的get请求
    }

}
数据库的注册
public class MydataSource {
//    注册数据库
    public  static DataSource getData(String conn){
        BasicDataSource ds=new BasicDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUsername("root");
        ds.setPassword("mysql");
        ds.setUrl(conn);
        return ds;
    }
}

使用Query.Runner进行数据库操作
public class Mysql {
    static DataSource ds = MydataSource.getData("jdbc:mysql://localhost:3307/skd?characterEncoding=utf-8");
    static DataSource dss = MydataSource.getData("jdbc:mysql://localhost:3307/qcf?characterEncoding=utf-8");
    static QueryRunner qr = new QueryRunner(ds);
    static QueryRunner qrr = new QueryRunner(dss);

    //创建qr对象准备执行sql语句
    public static void executeInsert(List data) throws SQLException {
//寻找表尾位置进行插入
        Object m = qrr.query("SELECt MAX(id) FROM q", new ScalarHandler());
        System.out.println(m);
        int n = Integer.parseInt(m.toString());
        Object[][] params = new Object[data.size()][3];
//        get方法获取对象
        Object o;
        for (int i = 0; i < params.length; i++) {
            o = qrr.query("SELECt id FROM q WHERe title=?,add=?", new ScalarHandler());
            if (o.toString().length() > 0) {
                params[i][0] = data.get(i).getId() + n + 1;
                params[i][1] = data.get(i).getTitle();
                params[i][2] = data.get(i).getAdd();
            } else continue;

        }
//插入
        qrr.batch("INSERT INTO q(id,title,`add`) VALUES (?,?,?)", params);
//        qr.update("UPDATE q SET title =? ,add=? WHERe id =?", params);
        System.out.println("执行数据库完毕");

    }

//    public static void Grouoby() throws SQLException {
//分组
//        List> lis = qr.query("SELECT /confirm/i,province FROM detailsn" +
//                "GROUP BY province", new MapListHandler());
//        System.out.println(lis);
 //   }
//}



转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号