成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

自用Java爬蟲工具JAVA-CURL已開源

william / 1691人閱讀

摘要:工具和資料群高級爬蟲作者自建群,歡迎加入作者收集的爬蟲相關(guān)工具和資料簡介類是以命令行工具為參考,使用標(biāo)準(zhǔn)的實(shí)現(xiàn)的工具類。

工具和資料

QQ群 - Javascript高級爬蟲 - 作者自建群,歡迎加入!

awesome-java-crawler - 作者收集的爬蟲相關(guān)工具和資料

簡介

CUrl類是以命令行工具CUrl為參考,使用標(biāo)準(zhǔn)Java的HttpURLConnection實(shí)現(xiàn)的Http工具類。

項(xiàng)目地址: https://github.com/rockswang/...
中央倉庫: https://mvnrepository.com/art...

特點(diǎn)

基于標(biāo)準(zhǔn)Java運(yùn)行庫的Http類實(shí)現(xiàn),源碼兼容級別為1.6,適用性廣泛,可用于服務(wù)端、Android等Java環(huán)境

代碼精簡緊湊,僅一個(gè)1000余行的Java源文件,無任何外部依賴,可不用Maven直接源碼級重用

完全兼容CUrl命令行工具的常用開關(guān),可直接作為命令行工具替代之

支持所有HTTP Method,支持多文件上傳

通過ThreadLocal解決了標(biāo)準(zhǔn)Java中Cookie只能全局保存的問題,可每線程獨(dú)立維護(hù)Cookie

可將線程中保存的Cookies序列化保存,方便建立Cookies池

支持HTTP認(rèn)證,支持HTTPS,可啟用/忽略證書安全

支持每連接代理,支持需認(rèn)證的HTTP/HTTPS代理

跳轉(zhuǎn)行為可控制,可獲取到每步跳轉(zhuǎn)的應(yīng)答頭信息

支持編程自定義應(yīng)答解析器

支持失敗重試,可編程自定義可重試異常

支持的參數(shù)
參數(shù)名 快捷方法 說明
--compressed 請求以gzip壓縮應(yīng)答數(shù)據(jù)(但需服務(wù)器端支持)
--connect-timeout timeout 連接超時(shí)時(shí)間,單位秒,默認(rèn)0,即永不超時(shí)
-b, --cookie cookie 從文件/IO對象/參數(shù)字符串中讀取Cookie
-c, --cookie-jar cookieJar Cookie輸出到文件/IO對象
-d, --data, --data-ascii data 添加post數(shù)據(jù),如果多次使用,則使用"&"連接,后添加的表單項(xiàng)鍵值對會覆蓋之前的
如果data以"@"開頭,則后面部分作為文件名,數(shù)據(jù)由該文件讀入,且刪除文件中的回車換行
--data-raw 同"--data",但不對"@"特殊處理
--data-binary 同"--data",但讀入文件時(shí)不刪除回車換行字符
--data-urlencode data(data,charset) 同"--data",但對數(shù)據(jù)進(jìn)行Url-Encode,可以在此選項(xiàng)后面附加字符集,比如"--data-urlencode-GBK"
如果參數(shù)值首字符為"=":對"="后面的字符串整體進(jìn)行Url-Encode* 如果參數(shù)值中包含"=":將字符串拆分為以"&"分割的鍵值對,鍵值對用"="分割,對鍵值對中所有的值進(jìn)行Url-Encode
如果參數(shù)值中不包含"=":
--如果字符串中不包含"@",則對字符串整體進(jìn)行Url-Encode
--如果字符串中包含"@"則以"@"分割字符串,"@"后面為輸入文件名,則從該文件中讀取文本并進(jìn)行Url-Encode,"@"前面部分為鍵
--如"@"為第一個(gè)字符,則文件中讀出的文本整體進(jìn)行Url-Encode
-D, --dump-header dumpHeader 輸出最后一步跳轉(zhuǎn)的應(yīng)答頭到給定的文件/IO對象
-F, --form form 發(fā)起文件上傳,添加一個(gè)文件或表單項(xiàng)
-如參數(shù)值首字母為"@"或"<"則從指定的文件讀取數(shù)據(jù)進(jìn)行上傳。"@"和"<"的區(qū)別在于,"@"的文件內(nèi)容作為文件附件上傳,"<"的文件內(nèi)容作為普通表單項(xiàng)的值
-否則參數(shù)值作為普通表單項(xiàng)的值
--form-string form(formString) 發(fā)起文件上傳,添加1個(gè)非文件表單項(xiàng),注意此方法不對"@"進(jìn)行特殊處理
-G, --get 強(qiáng)制使用GET方法
-H, --header header 添加一個(gè)請求頭行,語法為:
-"Host: baidu.com": 添加/設(shè)定一行普通請求頭鍵值對
-"Accept:": 刪除給定請求頭
-"X-Custom-Header;": 添加/設(shè)定一個(gè)值為空的自定義請求頭
-I, --head 使用HEAD方法請求
-k, --insecure insecure 忽略HTTPS證書安全檢查
-L, --location location 自動跟隨跳轉(zhuǎn)(默認(rèn)不開啟)
-m, --max-time timeout 傳輸超時(shí)時(shí)間,單位秒,默認(rèn)0,即永不超時(shí)
-o, --output output 指定輸出文件/IO對象,默認(rèn)stdout,即"-"
-x, --proxy proxy 設(shè)定代理服務(wù)器
-U, --proxy-user 設(shè)定代理服務(wù)器登錄信息
-e, --referer 設(shè)定Referer請求頭內(nèi)容
--retry retry 設(shè)定重試次數(shù),默認(rèn)0
--retry-delay retry 設(shè)定兩次重試之間的延遲,單位秒,默認(rèn)0
--retry-max-time retry 設(shè)定最長重試總時(shí)間,單位秒,默認(rèn)0,即永不超時(shí)
-s, --silent 設(shè)定靜默模式,即屏蔽所有輸出
--stderr stderr 設(shè)定stderr的輸出文件/IO對象,默認(rèn)stdout
-u, --user 設(shè)定服務(wù)器登錄信息
--url CUrl, url 設(shè)定請求地址,本CUrl庫不支持多url請求
-A, --user-agent 設(shè)定"User-Agent"請求頭內(nèi)容
-X, --request 指定HTTP請求方法
--x-max-download 傳輸達(dá)到給定字節(jié)數(shù)(非精確)后放棄下載
--x-tags 設(shè)定額外的鍵值對信息,存儲在當(dāng)前CUrl實(shí)例中,用于在編程中傳遞額外參數(shù)
例子
例1:POST表單提交
    public void httpPost() {
        CUrl curl = new CUrl("http://httpbin.org/post")
                .data("hello=world&foo=bar")
                .data("foo=overwrite");
        curl.exec();
        assertEquals(200, curl.getHttpCode());
    }
例2:通過Fiddler代理(抓包工具)訪問HTTPS站點(diǎn)
    public void insecureHttpsViaFiddler() {
        CUrl curl = new CUrl("https://httpbin.org/get")
                .proxy("127.0.0.1", 8888) // Use Fiddler to capture & parse HTTPS traffic
                .insecure();  // Ignore certificate check since it"s issued by Fiddler
        curl.exec();
        assertEquals(200, curl.getHttpCode());
    }
例3:上傳多個(gè)文件,一個(gè)內(nèi)存文件,一個(gè)物理文件
    public void uploadMultipleFiles() {
        CUrl.MemIO inMemFile = new CUrl.MemIO();
        try { inMemFile.getOutputStream().write("text file content blabla...".getBytes()); } catch (Exception ignored) {}
        CUrl curl = new CUrl("http://httpbin.org/post")
                .form("formItem", "value") // a plain form item
                .form("file", inMemFile)           // in-memory "file"
                .form("image", new CUrl.FileIO("D:	mpa2.png")); // A file in storage
        curl.exec();
        assertEquals(200, curl.getHttpCode());
    }
例4:模擬手機(jī)瀏覽器上的AJAX請求,添加自定義請求頭
    public void customUserAgentAndHeaders() {
        String mobileUserAgent = "Mozilla/5.0 (Linux; U; Android 8.0.0; zh-cn; KNT-AL10 Build/HUAWEIKNT-AL10) " 
                + "AppleWebKit/537.36 (KHTML, like Gecko) MQQBrowser/7.3 Chrome/37.0.0.0 Mobile Safari/537.36";
        Map fakeAjaxHeaders = new HashMap();
        fakeAjaxHeaders.put("X-Requested-With", "XMLHttpRequest");
        fakeAjaxHeaders.put("Referer", "http://somesite.com/fake_referer");
        CUrl curl = new CUrl("http://httpbin.org/get")
                .opt("-A", mobileUserAgent) // simulate a mobile browser
                .headers(fakeAjaxHeaders)   // simulate an AJAX request
                .header("X-Auth-Token: xxxxxxx"); // other custom header, this might be calculated elsewhere
        curl.exec();
        assertEquals(200, curl.getHttpCode());
    }
例5:多線程并發(fā)請求,線程間Cookies相互獨(dú)立
    public void threadSafeCookies() {
        final CountDownLatch count = new CountDownLatch(3);
        final CUrl[] curls = new CUrl[3];
        for (int i = 3; --i >= 0;) {
            final int idx = i;
            new Thread() {
                public void run() {
                    CUrl curl = curls[idx] = new CUrl("http://httpbin.org/get")
                            .cookie("thread" + idx + "=#" + idx);
                    curl.exec();
                    count.countDown();
                }
            }.start();
        }
        try { count.await(); } catch (Exception ignored) {} // make sure all requests are done
        assertEquals(200, curls[0].getHttpCode());
        assertEquals("thread0=#0", deepGet(curls[0].getStdout(jsonResolver, null), "headers.Cookie"));
        assertEquals("thread1=#1", deepGet(curls[1].getStdout(jsonResolver, null), "headers.Cookie"));
        assertEquals("thread2=#2", deepGet(curls[2].getStdout(jsonResolver, null), "headers.Cookie"));
    }
例6:編程自定義應(yīng)答解析器,使用JSoup解析HTML
    private CUrl.Resolver htmlResolver = new CUrl.Resolver() {
        @SuppressWarnings("unchecked")
        @Override
        public Document resolve(int httpCode, byte[] responseBody) throws Throwable {
            String html = new String(responseBody, "UTF-8");
            return Jsoup.parse(html);
        }
    };

    public void customResolver() {
        CUrl curl = new CUrl("http://httpbin.org/html");
        Document html = curl.exec(htmlResolver, null);
        assertEquals(200, curl.getHttpCode());
        assertEquals("Herman Melville - Moby-Dick", html.select("h1:first-child").text());
    }
例7:作為命令行工具使用,請求內(nèi)容參考例4
java -jar java-curl-1.2.0.jar https://httpbin.org/get ^
    -x 127.0.0.1:8888 -k ^
    -A "Mozilla/5.0 (Linux; U; Android 8.0.0; zh-cn; KNT-AL10 Build/HUAWEIKNT-AL10) AppleWebKit/537.36 (KHTML, like Gecko) MQQBrowser/7.3 Chrome/37.0.0.0 Mobile Safari/537.36" ^
    -H "Referer: http://somesite.com/fake_referer" ^
    -H "X-Requested-With: XMLHttpRequest" ^
    -H "X-Auth-Token: xxxxxxx"

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/72293.html

相關(guān)文章

  • Assassin暗殺者-自用短小精悍的webshell管理工具分享

    摘要:是一款精簡的基于命令行的管理工具,它有著多種發(fā)送方式和編碼方式,以及精簡的代碼,使得它成為隱蔽的暗殺者,難以被很好的防御。AssassinAssassin是一款精簡的基于命令行的webshell管理工具,它有著多種payload發(fā)送方式和編碼方式,以及精簡的payload代碼,使得它成為隱蔽的暗殺者,難以被很好的防御。自用工具開源互相學(xué)習(xí),工具短小精悍,生成的webshell能夠過目前主流殺...

    solocoder 評論0 收藏0
  • 某數(shù)加密的流程與原理簡析

    摘要:前言啃了這么長時(shí)間,基本上已經(jīng)把某數(shù)的套路摸了個(gè)八九不離十,不愧是中國反爬界的集大成者,感覺收獲滿滿,這里就簡單記錄一下分析成果。注意某數(shù)在不同的網(wǎng)站上有不同的版本,其流程也略有不同,這里的流程不一定適用于其它網(wǎng)站。 showImg(https://segmentfault.com/img/remote/1460000018765904); 前言 啃了這么長時(shí)間,基本上已經(jīng)把某數(shù)的套路...

    dkzwm 評論0 收藏0
  • 某數(shù)加密的流程與原理簡析

    摘要:前言啃了這么長時(shí)間,基本上已經(jīng)把某數(shù)的套路摸了個(gè)八九不離十,不愧是中國反爬界的集大成者,感覺收獲滿滿,這里就簡單記錄一下分析成果。注意某數(shù)在不同的網(wǎng)站上有不同的版本,其流程也略有不同,這里的流程不一定適用于其它網(wǎng)站。 showImg(https://segmentfault.com/img/remote/1460000018765904); 前言 啃了這么長時(shí)間,基本上已經(jīng)把某數(shù)的套路...

    msup 評論0 收藏0
  • 某網(wǎng)站高度加密混淆的javascript的分析

    摘要:前言對某網(wǎng)站加密混淆后的代碼也算分析了一段時(shí)間了,雖然還沒搞出來,但多少有些心得,這里記錄一下。因此,應(yīng)該將局部變量也替換成唯一且更有意義的名字,比如函數(shù)名變量索引因此,正確的方法是基于編譯原理進(jìn)行語法級別的替換。 showImg(https://segmentfault.com/img/remote/1460000018765904); 前言 對某網(wǎng)站加密混淆后的javascript...

    newsning 評論0 收藏0
  • 某網(wǎng)站高度加密混淆的javascript的分析

    摘要:前言對某網(wǎng)站加密混淆后的代碼也算分析了一段時(shí)間了,雖然還沒搞出來,但多少有些心得,這里記錄一下。因此,應(yīng)該將局部變量也替換成唯一且更有意義的名字,比如函數(shù)名變量索引因此,正確的方法是基于編譯原理進(jìn)行語法級別的替換。 showImg(https://segmentfault.com/img/remote/1460000018765904); 前言 對某網(wǎng)站加密混淆后的javascript...

    godiscoder 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<