zoukankan      html  css  js  c++  java
  • httpClient 保持session



    import
    org.apache.commons.httpclient.Cookie; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.cookie.CookiePolicy; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; public class TestLogin { public static void main(String[] args) { // 登陆 Url String loginUrl = "http://139.196.40.80:3000/login"; // 需登陆后访问的 Url String dataUrl = "http://139.196.40.80:3000/index"; HttpClient httpClient = new HttpClient(); // 模拟登陆,按实际服务器端要求选用 Post 或 Get 请求方式 PostMethod postMethod = new PostMethod(loginUrl); // 设置登陆时要求的信息,用户名和密码 NameValuePair[] data = { new NameValuePair("username", "lixiuming"), new NameValuePair("password", "lixiuming") }; postMethod.setRequestBody(data); try { // 设置 HttpClient 接收 Cookie,用与浏览器一样的策略 httpClient.getParams().setCookiePolicy( CookiePolicy.BROWSER_COMPATIBILITY); httpClient.executeMethod(postMethod); // 获得登陆后的 Cookie Cookie[] cookies = httpClient.getState().getCookies(); StringBuffer tmpcookies = new StringBuffer(); for (Cookie c : cookies) { tmpcookies.append(c.toString() + ";"); } // 进行登陆后的操作1581,1602,1603,1610,1609,1608,1607,1606,1605,1620,1619,1617,1616,1622,1626,1642,1648,1647,1657 GetMethod getMethod = new GetMethod(dataUrl); // 每次访问需授权的网址时需带上前面的 cookie 作为通行证 getMethod.setRequestHeader("cookie", tmpcookies.toString()); // 你还可以通过 PostMethod/GetMethod 设置更多的请求后数据 // 例如,referer 从哪里来的,UA 像搜索引擎都会表名自己是谁,无良搜索引擎除外 postMethod.setRequestHeader("Referer", "http://139.196.40.80:3000/index"); postMethod.setRequestHeader("User-Agent", "www Spot"); httpClient.executeMethod(getMethod); // 打印出返回数据,检验一下是否成功 String text = getMethod.getResponseBodyAsString(); System.out.println(text); } catch (Exception e) { e.printStackTrace(); } } }

      以上代码看看就好了,因为httpclient 这个工具使用还是有限的。我还是推荐使用htmlunit,这个工具,个人感觉,对于一般的网站简直无敌。基本上可以满足你的所有需求。比如说,你想登入,那么她可以模拟点击让你登入,不用考虑所谓的session啊,cookies等等让人头疼的问题。比如你需要select。。。她也可以满足,她通过代码的方式来操作页面,还可以执行JavaScript....总之一句话,完美。下面写个简单的demo吧。

    package test;
    
    import java.io.IOException;
    import java.net.MalformedURLException;
    
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.select.Elements;
    import org.junit.Test;
    
    import com.gargoylesoftware.htmlunit.BrowserVersion;
    import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
    import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
    import com.gargoylesoftware.htmlunit.WebClient;
    import com.gargoylesoftware.htmlunit.WebClientOptions;
    import com.gargoylesoftware.htmlunit.html.HtmlPage;
    
    public class TestUtil {
        
        @Test
        public void getTVMall(){
            WebClient webClient = new WebClient(BrowserVersion.FIREFOX_52); 
            //webclient参数载体  
            WebClientOptions clientOptions = webClient.getOptions();  
            // 设置webClient的相关参数  
            clientOptions.setJavaScriptEnabled(true);  
            clientOptions.setCssEnabled(false);  
            webClient.setAjaxController(new NicelyResynchronizingAjaxController());  
            clientOptions.setTimeout(35000);  
            clientOptions.setThrowExceptionOnScriptError(false);  
            try {
                HtmlPage htmlPage = webClient.getPage("https://www.tvmao.com/program");//进入电视猫节目单
    //            System.out.println(htmlPage.asXml());//这里打印获取到的整张页面。
                Document dom = Jsoup.parse(htmlPage.asXml());//若要提取数据,那就解析她。
                Elements ele = dom.getElementsByClass("tdchn");
                for(int i=0;i<ele.size();i++){
                    ele.get(i);
                    System.out.println(ele.get(i).child(0).text());//获取所有电视台。。。。这就这样,当然还可以获取电视节目。。。。不演示了!
                }
            } catch (FailingHttpStatusCodeException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
        
        
    
    }

    这里需要的jar包。htmlunit系列jar包(多个),还有Jsoup.jar 。

    htmlunit+Jsoup完美。

    再来一个相对复杂点的吧,需要模拟点击的。。。()。

    找例子中。。。。

  • 相关阅读:
    【LeetCode-回溯】组合总和
    MongoDB复制集成员类型
    Vant中的日期元素在iOS上显示NaN
    Vue风格
    Git设置代理和取消代理的方式
    吴晓波——疫情下的的“危”与“机”
    Vant库在PC端的使用
    买保险,不上当
    Vant的引入方式
    Duplicate keys detected: 'xxx'. This may cause an update error.
  • 原文地址:https://www.cnblogs.com/lixiuming521125/p/7058446.html
Copyright © 2011-2022 走看看