Jersey2 模擬登陸網站及登陸后301重定向識別打賞

周末群里有人希望幫他搞個程序采集某個網站數據,雖然說沒什么技術難點又不缺那點錢,但是好奇心還是比較重,沒事看了看,最基本的基于SESSION的認證,POST個用戶名密碼即可,用java寫的話我通常采用HttpClient,很強大,很通用,但是最近時不時有看過Jersey2的一些東西,貌似和我之前熟知的1.x差異挺大,就剛好拿來試試(不是接單幫搞數據,單純的玩技術,采集別人數據的事我可不做)。

實踐下來,發現Jersey2的API寫起來更清爽了,因為是用來采集,這里只用了Jersey-client相關功能,期間遇到一些小問題,就是登陸成功后目標網站是301重定向到新頁面的,而Jersey2的API調用后還保留在原始頁面,最終導致SESSION無效,不能進行下一步操作,Stackoverflow上搜了下,最終解決了,很簡單,如下

WebTarget target = client.target("http://reg.xxx.com/loginchk.do").property(ClientProperties.FOLLOW_REDIRECTS, false);

在WebTarget中注冊property——ClientProperties.FOLLOW_REDIRECTS為false即可,不過很好奇的是,字面意思看,似乎設置為true更容易理解,不知是Jersey官方開發人員的想法和我們不大一樣還是怎么滴,不過也不是我們關注的重點,就不在意這些細節了。

下面順帶貼出抓取的一些代碼段。

package com.poorren.spider;

import org.glassfish.jersey.client.ClientProperties;

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.*;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * core
 * Created by William.Wei on 2016/3/13.
 */
public class Spider {
    private static Client client = ClientBuilder.newClient();
    private static String cookie = null;
    private static Pattern patternItem = Pattern.compile("<dl>(.*)</dl>");
    private static Pattern patternKey = Pattern.compile("<dt>(.*)</dt>");
    private static Pattern patternValue = Pattern.compile("<dd>(.*)</dd>");

    private static List<Map<String, String>> dataList = new ArrayList<>();
    private static int index = 1;

    private static void login() {
        WebTarget target = client.target("http://reg.xxx.com/loginchk.do").property(ClientProperties.FOLLOW_REDIRECTS, false);
        Response response = target.request().post(Entity.form(new Form().param("username", "poorren").param("userPassword", "123654789")));
        cookie = response.getHeaderString("Set-Cookie");
    }

    public static Map<String, String> get(int id) {
        if (cookie == null) {
            login();
        }
        WebTarget target = client.target("http://friend.xxx.com/usercontact.html").queryParam("userid", id);
        Response response = target.request().header("Cookie", cookie).get();
        String html = response.readEntity(String.class);
        Matcher matcher = patternItem.matcher(html);
        Map<String, String> map = new HashMap<>();
        while (matcher.find()) {
            String item = matcher.group(1);
            Matcher key = patternKey.matcher(item);
            Matcher value = patternValue.matcher(item);
            if (key.find() && value.find()) {
                map.put(key.group(1).trim(), value.group(1).trim());
            }
        }
        return map;
    }
}

是不是很簡潔呢?

Jersey2 模擬登陸網站及登陸后301重定向識別
文章《Jersey2 模擬登陸網站及登陸后301重定向識別》二維碼
  • 微信打賞
  • 支付寶打賞

已有10條評論

  1. 飛利浦呼吸機

    謝謝·分享

    2016-08-17 11:10 回復
  2. 好書網

    [嘻嘻]感謝分享

    2016-03-19 15:52 回復
  3. 小C博客

    技術控

    2016-03-18 21:22 回復
  4. 新成

    技術控

    2016-03-18 20:12 回復
  5. themebetter

    又來了,總是不經意間來到這里

    2016-03-17 11:01 回復

(必填)

(必填)

(可選)

黑龙江22选5开奖