摘要:工具和資料群高級爬蟲作者自建群,歡迎加入作者收集的爬蟲相關工具和資料簡介類是以命令行工具為參考,使用標準的實現的工具類。
工具和資料
QQ群 - Javascript高級爬蟲 - 作者自建群,歡迎加入!
awesome-java-crawler - 作者收集的爬蟲相關工具和資料
簡介CUrl類是以命令行工具CUrl為參考,使用標準Java的HttpURLConnection實現的Http工具類。
項目地址: https://github.com/rockswang/...
中央倉庫: https://mvnrepository.com/art...
基于標準Java運行庫的Http類實現,源碼兼容級別為1.6,適用性廣泛,可用于服務端、Android等Java環境
代碼精簡緊湊,僅一個1000余行的Java源文件,無任何外部依賴,可不用Maven直接源碼級重用
完全兼容CUrl命令行工具的常用開關,可直接作為命令行工具替代之
支持所有HTTP Method,支持多文件上傳
通過ThreadLocal解決了標準Java中Cookie只能全局保存的問題,可每線程獨立維護Cookie
可將線程中保存的Cookies序列化保存,方便建立Cookies池
支持HTTP認證,支持HTTPS,可啟用/忽略證書安全
支持每連接代理,支持需認證的HTTP/HTTPS代理
跳轉行為可控制,可獲取到每步跳轉的應答頭信息
支持編程自定義應答解析器
支持失敗重試,可編程自定義可重試異常
支持的參數參數名 | 快捷方法 | 說明 |
---|---|---|
--compressed | 無 | 請求以gzip壓縮應答數據(但需服務器端支持) |
--connect-timeout | timeout | 連接超時時間,單位秒,默認0,即永不超時 |
-b, --cookie | cookie | 從文件/IO對象/參數字符串中讀取Cookie |
-c, --cookie-jar | cookieJar | Cookie輸出到文件/IO對象 |
-d, --data, --data-ascii | data | 添加post數據,如果多次使用,則使用"&"連接,后添加的表單項鍵值對會覆蓋之前的 如果data以"@"開頭,則后面部分作為文件名,數據由該文件讀入,且刪除文件中的回車換行 |
--data-raw | 無 | 同"--data",但不對"@"特殊處理 |
--data-binary | 無 | 同"--data",但讀入文件時不刪除回車換行字符 |
--data-urlencode | data(data,charset) | 同"--data",但對數據進行Url-Encode,可以在此選項后面附加字符集,比如"--data-urlencode-GBK" 如果參數值首字符為"=":對"="后面的字符串整體進行Url-Encode* 如果參數值中包含"=":將字符串拆分為以"&"分割的鍵值對,鍵值對用"="分割,對鍵值對中所有的值進行Url-Encode 如果參數值中不包含"=": --如果字符串中不包含"@",則對字符串整體進行Url-Encode --如果字符串中包含"@"則以"@"分割字符串,"@"后面為輸入文件名,則從該文件中讀取文本并進行Url-Encode,"@"前面部分為鍵 --如"@"為第一個字符,則文件中讀出的文本整體進行Url-Encode |
-D, --dump-header | dumpHeader | 輸出最后一步跳轉的應答頭到給定的文件/IO對象 |
-F, --form | form | 發起文件上傳,添加一個文件或表單項 -如參數值首字母為"@"或"<"則從指定的文件讀取數據進行上傳。"@"和"<"的區別在于,"@"的文件內容作為文件附件上傳,"<"的文件內容作為普通表單項的值 -否則參數值作為普通表單項的值 |
--form-string | form(formString) | 發起文件上傳,添加1個非文件表單項,注意此方法不對"@"進行特殊處理 |
-G, --get | 無 | 強制使用GET方法 |
-H, --header | header | 添加一個請求頭行,語法為: -"Host: baidu.com": 添加/設定一行普通請求頭鍵值對 -"Accept:": 刪除給定請求頭 -"X-Custom-Header;": 添加/設定一個值為空的自定義請求頭 |
-I, --head | 無 | 使用HEAD方法請求 |
-k, --insecure | insecure | 忽略HTTPS證書安全檢查 |
-L, --location | location | 自動跟隨跳轉(默認不開啟) |
-m, --max-time | timeout | 傳輸超時時間,單位秒,默認0,即永不超時 |
-o, --output | output | 指定輸出文件/IO對象,默認stdout,即"-" |
-x, --proxy | proxy | 設定代理服務器 |
-U, --proxy-user | 無 | 設定代理服務器登錄信息 |
-e, --referer | 無 | 設定Referer請求頭內容 |
--retry | retry | 設定重試次數,默認0 |
--retry-delay | retry | 設定兩次重試之間的延遲,單位秒,默認0 |
--retry-max-time | retry | 設定最長重試總時間,單位秒,默認0,即永不超時 |
-s, --silent | 無 | 設定靜默模式,即屏蔽所有輸出 |
--stderr | stderr | 設定stderr的輸出文件/IO對象,默認stdout |
-u, --user | 無 | 設定服務器登錄信息 |
--url | CUrl, url | 設定請求地址,本CUrl庫不支持多url請求 |
-A, --user-agent | 無 | 設定"User-Agent"請求頭內容 |
-X, --request | 無 | 指定HTTP請求方法 |
--x-max-download | 無 | 傳輸達到給定字節數(非精確)后放棄下載 |
--x-tags | 無 | 設定額外的鍵值對信息,存儲在當前CUrl實例中,用于在編程中傳遞額外參數 |
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()); }
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()); }
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()); }
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"; MapfakeAjaxHeaders = 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()); }
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")); }
private CUrl.ResolverhtmlResolver = 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()); }
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"
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72293.html
摘要:是一款精簡的基于命令行的管理工具,它有著多種發送方式和編碼方式,以及精簡的代碼,使得它成為隱蔽的暗殺者,難以被很好的防御。AssassinAssassin是一款精簡的基于命令行的webshell管理工具,它有著多種payload發送方式和編碼方式,以及精簡的payload代碼,使得它成為隱蔽的暗殺者,難以被很好的防御。自用工具開源互相學習,工具短小精悍,生成的webshell能夠過目前主流殺...
摘要:前言啃了這么長時間,基本上已經把某數的套路摸了個八九不離十,不愧是中國反爬界的集大成者,感覺收獲滿滿,這里就簡單記錄一下分析成果。注意某數在不同的網站上有不同的版本,其流程也略有不同,這里的流程不一定適用于其它網站。 showImg(https://segmentfault.com/img/remote/1460000018765904); 前言 啃了這么長時間,基本上已經把某數的套路...
摘要:前言啃了這么長時間,基本上已經把某數的套路摸了個八九不離十,不愧是中國反爬界的集大成者,感覺收獲滿滿,這里就簡單記錄一下分析成果。注意某數在不同的網站上有不同的版本,其流程也略有不同,這里的流程不一定適用于其它網站。 showImg(https://segmentfault.com/img/remote/1460000018765904); 前言 啃了這么長時間,基本上已經把某數的套路...
摘要:前言對某網站加密混淆后的代碼也算分析了一段時間了,雖然還沒搞出來,但多少有些心得,這里記錄一下。因此,應該將局部變量也替換成唯一且更有意義的名字,比如函數名變量索引因此,正確的方法是基于編譯原理進行語法級別的替換。 showImg(https://segmentfault.com/img/remote/1460000018765904); 前言 對某網站加密混淆后的javascript...
摘要:前言對某網站加密混淆后的代碼也算分析了一段時間了,雖然還沒搞出來,但多少有些心得,這里記錄一下。因此,應該將局部變量也替換成唯一且更有意義的名字,比如函數名變量索引因此,正確的方法是基于編譯原理進行語法級別的替換。 showImg(https://segmentfault.com/img/remote/1460000018765904); 前言 對某網站加密混淆后的javascript...
閱讀 2155·2021-10-08 10:15
閱讀 1185·2019-08-30 15:52
閱讀 514·2019-08-30 12:54
閱讀 1531·2019-08-29 15:10
閱讀 2682·2019-08-29 12:44
閱讀 3008·2019-08-29 12:28
閱讀 3348·2019-08-27 10:57
閱讀 2212·2019-08-26 12:24