`

java模拟jquery请求动作(模拟点击、选择下拉)

阅读更多
package com.teamdev.jxbrowser.chromium.demo_sanya12.xiecheng.evment;

import java.awt.BorderLayout;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import com.hyjx.common.CommonUtil;
import com.hyjx.orclJdbcUtil.JDBCUtils;
import com.hyjx.xcUtil.XcTool;
import com.teamdev.jxbrowser.chromium.Browser;
import com.teamdev.jxbrowser.chromium.BrowserPreferences;
import com.teamdev.jxbrowser.chromium.JSValue;
import com.teamdev.jxbrowser.chromium.LoggerProvider;
import com.teamdev.jxbrowser.chromium.events.FinishLoadingEvent;
import com.teamdev.jxbrowser.chromium.events.LoadAdapter;
import com.teamdev.jxbrowser.chromium.swing.BrowserView;
/**
* 携程的评论 酒店
* */
public class sy_good_xc_comment {
public static void main(String[] args) throws Exception {
//初始化浏览器
LoggerProvider.getBrowserLogger().setLevel(Level.SEVERE);
LoggerProvider.getIPCLogger().setLevel(Level.SEVERE);
LoggerProvider.getChromiumProcessLogger().setLevel(Level.SEVERE);

        final Browser browser = new Browser();
        BrowserView browserView = new BrowserView(browser);
        BrowserPreferences preferences = browser.getPreferences();
        preferences.setImagesEnabled(false);
       
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.add(browserView, BorderLayout.CENTER);
        frame.setSize(700, 800);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

       
        //创建数据库
    java.sql.Connection conOrcale  = null;
try {
conOrcale =    JDBCUtils.getConnection();
} catch (SQLException e1) {
e1.printStackTrace();
}
String sql = null;
PreparedStatement ps = null;
String  sql1 = null;
String  sql2 = null;
Statement st2 = null;
ResultSet rs2 = null;
Document doc = null;
String url = null;
try{
//艺龙
    sql1 = " select * from a_a_nm_good_12   where  plat_name='携程' and type ='酒店' and state is null ";
    sql2 = " update  a_a_nm_good_12 set state = '评论已抓' where good_id = ? ";
    ps = conOrcale.prepareStatement(sql2);
    st2  = (java.sql.Statement) conOrcale.createStatement();
rs2  = st2.executeQuery(sql1);
}catch (Exception e) {
e.printStackTrace();
}
int i = 1;
for(;rs2.next();){

System.out.println(i);
i++;
final  String good_url = rs2.getString("good_url");
String good_id = rs2.getString("good_id");
String shop_id = rs2.getString("shop_id");

search( good_url,shop_id,good_id, frame, browser);
ps.setString(1,good_id);
//ps.executeUpdate();

}
}
static void search(final String good_url, String shop_id,String good_id ,JFrame frame, final Browser browser)throws Exception{

java.sql.Connection conOrcale  = null;
try {
conOrcale =    JDBCUtils.getConnection();
} catch (SQLException e1) {
e1.printStackTrace();
}
String sql = null;
PreparedStatement ps2 = null;

try{
sql = " insert into a_a_nm_evment_12  "+
"   (ev_id, shop_id,  ev_time, ev_user, ev_content,good_id)  "+
"  values   "+
"  (? ,   ?   ,   ?    ,   ?   , ? ,? )   ";
    ps2 = conOrcale.prepareStatement(sql);
}catch (Exception e) {
e.printStackTrace();
}
System.out.println("good_url:"+good_url);
invokeAndWaitReady(browser, new Runnable() {
    public void run() {
    browser.loadURL(good_url);
    //browser.loadURL("http://hotel.elong.com/sanya/90574280/#review");
    }
});

try {
Thread.sleep(1000*1);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
// //设置滚动条滚动速度
//         for(int i = 1;i<10;i++){
//         browser.executeJavaScriptAndReturnValue("window.scrollTo(100,"+i*200+")");
//             try {
//     Thread.sleep(200*1);
//     } catch (InterruptedException e1) {
//     e1.printStackTrace();
//     }
//         }
   
       
        int num = 1;
        //得到html和document对象
        String html = browser.getHTML();
        Document document = Jsoup.parse(html);
        int cooment_view=document.getElementsByAttributeValue("id", "id_comment_view").size();
        if(cooment_view>0){
        browser.executeJavaScriptAndReturnValue("document.getElementsByClassName('comment_view')[0].click();");
        try {
     Thread.sleep(2000*1);
     } catch (InterruptedException e1) {
     e1.printStackTrace();
     }
     browser.executeJavaScriptAndReturnValue("document.getElementsByClassName('select_sort')[0].options[1].selected=true");
             browser.executeJavaScriptAndReturnValue("document.getElementById('cPageBtn').click()");
        try {
     Thread.sleep(2000*1);
     } catch (InterruptedException e1) {
     e1.printStackTrace();
     }
        //重新得到html和document对象
         html = browser.getHTML();
         document = Jsoup.parse(html);
        
        Elements elements = document.getElementsByAttributeValue("class", "comment_block J_asyncCmt");
        System.out.println("elements.size()"+elements.size());//输入条数
        String EV_TIME="";
        String EV_USER="";
        String EV_CONTENT="";
        String shijian ="";
        for(Element e : elements){
        Document parse = Jsoup.parse(e.html());
String EV_NUM = null;
try {
EV_USER = parse.getElementsByAttributeValue("class","name").text();
} catch (Exception e4) {
// TODO Auto-generated catch block
EV_USER = null;
}
try {
EV_CONTENT = parse.getElementsByAttributeValue("class","J_commentDetail").text();
} catch (Exception e3) {
// TODO Auto-generated catch block
EV_CONTENT = null;
}
try {
EV_TIME =parse.getElementsByAttributeValue("class","time").text();
if(EV_TIME.contains("发表于")){
EV_TIME=EV_TIME.replace("发表于", "");
}
} catch (Exception e2) {
// TODO Auto-generated catch block
EV_TIME = null;
}
        shijian = EV_TIME.substring(0,7);
if( (shijian).equals("2016-12") ){
System.out.println("good_url        "+good_url);
System.out.println("评论内容      "+EV_CONTENT);
System.out.println("评论人        "+EV_USER);
System.out.println("评论时间         "+EV_TIME);
System.out.println("评论分数        "+EV_NUM);
        try {
        //(ev_id, shop_id,  ev_time, ev_user, ev_content,good_id)  "+
ps2.setString(1, CommonUtil.getUUID32());
ps2.setString(2, shop_id);
ps2.setString(3, EV_TIME);
ps2.setString(4, EV_USER);
ps2.setString(5, EV_CONTENT);
ps2.setString(6, good_id);
//ps2.executeUpdate();
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
        System.out.println("---------------------------------------------------------------------------------------------");
       }else{return;}
        }
        //判断是否有下一页,如果有下一页,继续插入数据
             while(jumpNext(browser)){
             num++;
             //超过20页的不抓
//              if(num>=20){
//              break;
//              }
             try {
        Thread.sleep(2000*1);
        } catch (InterruptedException e1) {
        e1.printStackTrace();
        }
//              for(int i = 1;i<10;i++){
//             browser.executeJavaScriptAndReturnValue("window.scrollTo(100,"+i*200+")");
//                 try {
//         Thread.sleep(200*1);
//         } catch (InterruptedException e1) {
//         e1.printStackTrace();
//         }
//             }
            html = browser.getHTML();
            document = Jsoup.parse(html);
             Elements elementss = document.getElementsByAttributeValue("class", "comment_block J_asyncCmt");
            System.out.println("elements.size()"+elementss.size());//输入条数
            for(Element e : elementss){
            Document parse = Jsoup.parse(e.html());
            try {
    EV_USER = parse.getElementsByAttributeValue("class","name").text();
    } catch (Exception e4) {
    // TODO Auto-generated catch block
    EV_USER = null;
    }
    try {
    EV_CONTENT = parse.getElementsByAttributeValue("class","J_commentDetail").text();
    } catch (Exception e3) {
    // TODO Auto-generated catch block
    EV_CONTENT = null;
    }
    try {
    EV_TIME =parse.getElementsByAttributeValue("class","time").text();
    if(EV_TIME.contains("发表于")){
    EV_TIME=EV_TIME.replace("发表于", "");
    }
    } catch (Exception e2) {
    // TODO Auto-generated catch block
    EV_TIME = null;
    }
          shijian = EV_TIME.substring(0,7);
        if( (shijian).equals("2016-12") ){
        System.out.println("客体url:"+good_url);
System.out.println("评论内容:"+EV_CONTENT);
System.out.println("评论人: "+EV_USER);
System.out.println("评论时间:"+EV_TIME);
            try {
            ps2.setString(1, CommonUtil.getUUID32());
ps2.setString(2, shop_id);
ps2.setString(3, EV_TIME);
ps2.setString(4, EV_USER);
ps2.setString(5, EV_CONTENT);
ps2.setString(6, good_id);
    //ps2.executeUpdate();
    } catch (Exception e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    }
            System.out.println("---------------------------------------------------------------------------------------------");
            }else{return;}
            }
             }   
    }else{
    return;
    }
   
    }

/**
* 首先判断是否有下一页按钮
* @param browser
* @return
*/
public static boolean jumpNext(Browser browser){

  String html = browser.getHTML();
      Document document = Jsoup.parse(html);
      int num_page_next=0;
  try {
num_page_next = document.getElementsByAttributeValue("class", "c_down").size();
      } catch (Exception e) {
return false;
  }
      if(num_page_next>0){
      System.out.println("点击下一页");
      browser.executeJavaScriptAndReturnValue("document.getElementsByClassName('c_down')[0].click()");
      //browser.executeJavaScriptAndReturnValue("document.getElementsById('comment_paging').getElementsByClassName('page_next')[0].click()"); 
      //  browser.executeJavaScriptAndReturnValue("document.select('#comment_paging').getElementsByTagName('a')["+(num_pagesize-1)+"].click()");
      }else{
      return false;
      }
    return true;

}
// JSValue nextButtonNum = browser.executeJavaScriptAndReturnValue("document.getElementsByClassName('h-pagination pb20')[0].getElementsByClassName('a')[0].length");
//
// System.out.println("下一页按钮数量:"+nextButtonNum.getNumber());
// int num = ((Number)nextButtonNum.getNumber()).intValue();
// if(num == 0){
// return false;
// }
// browser.executeJavaScriptAndReturnValue("document.getElementsByClassName('h-pagination pb20')[0].getElementsByClassName('a')[0].click()");
//    return true;
//}
public static void invokeAndWaitReady(Browser browser, Runnable runnable) {
    final CountDownLatch latch = new CountDownLatch(1);
    LoadAdapter listener = new LoadAdapter() {
        @Override
        public void onFinishLoadingFrame(FinishLoadingEvent event) {
            if (event.isMainFrame()) {
                latch.countDown();
            }
        }
    };
    browser.addLoadListener(listener);
    try {
        runnable.run();
        try {
            if (!latch.await(60, TimeUnit.SECONDS)) {
                //throw new RuntimeException(new TimeoutException());
            }
        } catch (InterruptedException ignore) {
        ignore.printStackTrace();
            Thread.currentThread().interrupt();
        }
    } finally {
        browser.removeLoadListener(listener);
    }
}


}
分享到:
评论

相关推荐

    jsp,jQuery模拟阿里巴巴的java桌面项目

    在本项目中,我们主要探讨的是如何使用JSP(JavaServer Pages)和jQuery技术来模拟阿里巴巴的Java桌面项目。这是一个适合初学者和进阶者学习的实践案例,旨在帮助大家更好地理解和应用这两种技术。 首先,JSP是Java...

    jQuery + struts2 专业类别、专业名称 二级联动列表

    使用jQuery监听第一个下拉列表的`change`事件,当用户选择一个专业类别时,触发Ajax请求。 2. **jQuery代码**:在事件处理函数中,使用`$.ajax()`或`$.getJSON()`发送请求到Struts2的Action,附带上选中的专业类别...

    ajax+ssh模拟百度模糊查询 下拉框值改变时

    在本案例中,当用户在下拉框中选择选项时,Ajax会向服务器发送请求,获取匹配的查询结果,并动态更新表格内容。 **2. Spring框架** Spring是Java应用中的核心依赖注入(DI)和面向切面编程(AOP)框架,用于管理...

    基于MVC3方式实现下拉列表联动(JQuery)

    当省份下拉列表的选择改变时,我们需要触发一个事件,使用jQuery的Ajax方法向服务器发送请求,获取对应省份的城市数据,并更新城市下拉列表。 示例的Razor视图代码可能如下: ```html @model List @using ...

    jquery + servlet实现省市联动二级菜单

    在这个项目中,jQuery将用于监听用户在省份选择框中的变化,一旦用户选择了某个省份,jQuery会发送一个Ajax请求到服务器,请求对应省份的城市数据。 `servlet`是Java Web开发中的一个组件,用于处理服务器端的业务...

    jquery+jsp/html实现自动完成控件功能(有例子)

    这里的`id`属性用于jQuery选择器定位元素,`#autoCompleteInput`是输入框,`#autoCompleteList`则是显示自动完成建议的容器。 JavaScript,特别是jQuery,将用于实现自动完成的核心逻辑。当用户在输入框中键入字符...

    模拟省市级联jsp页面模拟

    4. **Ajax请求**:使用jQuery的`$.ajax`或者更现代的`fetch` API,向服务器发送GET请求,传递当前选中的省份ID作为参数。 5. **服务器响应**:后端接收到请求后,根据省份ID查询数据库并构建城市列表,然后以JSON...

    类百度搜索下拉框

    "类百度搜索下拉框"是一种常见的前端交互设计,它模拟了百度搜索引擎在用户输入关键词时展示相关建议的下拉列表。这种功能在许多网站和应用程序中被广泛使用,为用户提供快速导航和搜索建议,提高了用户体验。下面...

    省市区三级联动和模拟扫码

    标题中的“省市区三级联动”是指在Web应用中实现的一种地理信息选择功能,用户在填写地址时,可以先选择省份,然后根据省份自动加载出对应的城市,再选择城市后加载出对应区县的下拉选项。这种方式提高了用户体验,...

    基于java的省市联动菜单

    这是一种交互式UI设计,当用户选择一个省份时,下拉菜单会动态地更新并显示该省份下的城市列表。这种功能通常依赖于前端JavaScript库(如jQuery)与后端服务(如Spring MVC Controller)的交互。 在Spring MVC中,...

    jquery+ajax+jsp+servlet实现二级级联菜单

    ### 使用jQuery、Ajax、JSP与Servlet实现二级级联菜单 #### 一、项目背景与技术栈概述 本文档将详细介绍如何使用jQuery、Ajax、JSP与Servlet来实现一个简单的二级级联菜单功能。该功能常见于许多Web应用程序中,如...

    JavaWeb ajax异步自动填充信息

    在服务器端,通常使用Java和相关的框架(如Spring、Struts或Servlet)来处理这些请求。在这个例子中,服务器可能需要连接到MySQL数据库,查询与输入文本匹配的建议数据。为了实现这一点,你需要创建一个Java方法,该...

    springmvc下的增删改查 登录功能 下拉框

    通过Spring Test和MockMVC进行整合测试,模拟HTTP请求,验证整个流程的正确性。 以上就是“Spring MVC下的增删改查 登录功能 下拉框”这一项目涉及的主要技术点和实践过程,涵盖了后端开发、前端交互和数据库操作等...

    仿51job选择地区、行业、职位的效果

    每个选择器可能是一个`&lt;select&gt;`元素,或者用更现代的方式,使用`&lt;div&gt;`和`&lt;button&gt;`等元素模拟出下拉效果。 2. **CSS 设计**:为了保持视觉一致性,CSS样式需要与51job网站保持一致,包括颜色、字体、布局和响应式...

    基于Java的在线购物系统的设计与实现(源代码+系统)

    - **JavaScript/jQuery**:前端交互效果的实现,如表单验证、下拉菜单等。 5. **安全机制** - **HTTPS**:保障用户数据传输的安全性。 - **Session和Cookie**:管理用户会话,防止未授权访问。 - **SQL注入防护...

    Javaee学习京东仿静态页面+JQ组件

    例如,轮播图、下拉菜单、弹窗等常见组件都可能用到jQuery。 5. **Hibernate**:Hibernate是一个优秀的对象关系映射(ORM)框架,简化了Java应用与数据库之间的交互。通过Hibernate,开发者可以避免编写大量的SQL...

    航空订票系统

    这个系统的主要目标是模拟真实的机票预订流程,包括查询航班、选择座位、填写乘客信息、支付以及确认预订等环节。下面将详细讨论Java和JSP在构建此类系统中的应用以及相关知识点。 **1. Java基础** Java是一种广泛...

    Java学习笔记-个人整理的

    {1.11.2.1}选择排序}{38}{subsubsection.1.11.2.1} {1.11.2.2}冒泡排序}{39}{subsubsection.1.11.2.2} {1.11.2.3}插入排序}{40}{subsubsection.1.11.2.3} {1.11.3}递归调用}{41}{subsection.1.11.3} {1.12}Java...

    学生多对多选课

    - EasyUI是一个基于jQuery的UI库,提供了丰富的组件,如表格、下拉菜单、按钮等,用于快速构建美观的前端界面。 - 在这个项目中,EasyUI可能用于创建数据展示表格,提供分页、排序和搜索功能,简化前端开发。 4. ...

    Register.zip

    1. **EasyUI**: EasyUI 是一个基于 jQuery 的前端框架,它提供了丰富的组件,如表格、树形结构、下拉菜单等,用于快速构建用户界面。在项目中,EasyUI 可能被用来设计和实现注册页面的交互和展示,提供友好的用户...

Global site tag (gtag.js) - Google Analytics