java使用jsoup抓取中國知網資料思路與測試記錄
阿新 • • 發佈:2018-12-12
前段時間測試抓取知網資料,弄了很久都失敗了,然後就不想弄了....
今天重新整理,記錄下來,成功與否都能做個參考.
- 測試
cookies
第一次訪問網站的時候返回的一個cookies,裡面有4個引數; ASP.NET_SessionId , Ecp_ClientId , Ecp_IpLoginFail , SID_kns
這個引數是後續請求必須要的.否則就會找不到使用者,瀏覽器不同提交的cookies也略有差異,谷歌的cookies:
con.cookie("_pk_ses", "*"); con.cookie("ASP.NET_SessionId","gtiddqzwyj5gpg0qgxipyqo3"); con.cookie("ASPSESSIONIDQCSTBCRB","HKNBKCGDNLDLNHJECPKOJLED"); con.cookie("CNZZDATA3258975","cnzz_eid%3D696775271-1525654797-http%253A%252F%252Fkns.cnki.net%252F%26ntime%3D1538273733"); con.cookie("Ecp_ClientId", "5180531163302738890"); con.cookie("Ecp_IpLoginFail","180930115.171.133.231"); con.cookie("KNS_SortType","
[email protected]");//摘要模式(必填) con.cookie("KNS_SortType",""); //空為列表模式- 摘要模式([email protected]) con.cookie("RsPerPage","50"); con.cookie("SID_kcms","124111"); //摘要模式(必填) con.cookie("SID_klogin","125144"); //可忽略 con.cookie("SID_kns","123106"); con.cookie("SID_krsnew","125132");//可忽略 con.cookie("UM_distinctid","163386ea9a727b-04e123947bf39b-3961430f-1fa400-163386ea9a8e52"); con.cookie("_pk_id","82b531d4-7052-45bb-8132-b45f0932ceec.1525660161.11.1528872420.1528868668."); con.cookie("_pk_ref","%5B%22%22%2C%22%22%2C1538116979%2C%22http%3A%2F%2Fwww.cnki.net%2F%22%5D"); con.cookie("_pk_ses","*"); con.cookie("amid","696cc3d1-fa9e-4b87-9bdf-009344a96698"); con.cookie("cnkiUserKey","9aae4225-eafe-ddc1-25cc-3c392546db3a");
火狐的cookies比較少:
ASP.NET_SessionId r4qmdxxrddn3adzaz2gjwyi0 ASPSESSIONIDQQDDBCDS NAPLIBLDAAMKBPDFHBFNKOHK cnkiUserKey 8d21c7e8-db62-9425-3cd6-60b03cbff372 Ecp_ClientId 7180928144201298321 Ecp_IpLoginFail 180930115.171.133.231 KNS_DisplayModel [email protected] KNS_SortType RsPerPage 50 SID_klogin 125143 SID_kns 123124 SID_krsnew 125134
F12獲取請求資料地址
首先用瀏覽器搜尋,然後把cookies複製到程式中訪問,成功返回資料頁面. 接下來簡化cookies,尋找必備引數.(待續)
- 測試二
簡化cookies訪問,我發現只有兩個cookie是必不可少的:
ASP.NET_SessionId和SID_kns;
於是測試繼續…
失敗案例一
- 加入請求頭(後來發現這個請求頭可以省略掉)
- 獲取cookies
String url = "http://kns.cnki.net/kns/brief/result.aspx?dbprefix=SCDB"; Connection con = Jsoup.connect(url); //執行連線,獲取返回response Connection.Response response = con.execute(); //獲取返回cookies Map<String,String> map = response.cookies(); String sessionId = map.get("ASP.NET_SessionId"); String SID_kns = map.get("SID_kns");
- 設定cookies
url="http://kns.cnki.net/kns/brief/brief.aspx?pagename=ASP.brief_result_aspx&isinEn=1&dbPrefix=SCDB&dbCatalog=%e4%b8%ad%e5%9b%bd%e5%ad%a6%e6%9c%af%e6%96%87%e7%8c%ae%e7%bd%91%e7%bb%9c%e5%87%ba%e7%89%88%e6%80%bb%e5%ba%93&ConfigFile=SCDB.xml&research=off&t=1538278623116&keyValue=%E5%A5%A5%E6%B2%99%E5%88%A9%E9%93%82&S=1&sorttype=&DisplayMode=custommode"; con.url(url); con.cookie("ASP.NET_SessionId",sessionId); // con.cookie("Ecp_ClientId", "5180531163302738890"); // con.cookie("Ecp_IpLoginFail","180930115.171.133.231"); con.cookie("SID_kns",SID_kns);
返回請求:“對不起,伺服器上不存在此使用者!可能已經被剔除或引數錯誤”
成功案例
首先用瀏覽器訪問知網搜尋,F12獲取請求Cookie中sessionId和Kns 然後把sessionId和Kns放到程式中,訪問訪問是成功的. 這暫且算是半自動吧. 接下來實現半自動的抓取所有頁面摘要.(不知道sessionId多長時間過期,好奇…測試下…)
也希望大家能給我的小站沙加的部落格增添點人氣