1. 程式人生 > >java使用jsoup抓取中國知網資料思路與測試記錄

java使用jsoup抓取中國知網資料思路與測試記錄

	前段時間測試抓取知網資料,弄了很久都失敗了,然後就不想弄了....
今天重新整理,記錄下來,成功與否都能做個參考.
  1. 測試

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,尋找必備引數.(待續)

  1. 測試二

簡化cookies訪問,我發現只有兩個cookie是必不可少的:

ASP.NET_SessionId和SID_kns;

於是測試繼續…

失敗案例一

  1. 加入請求頭(後來發現這個請求頭可以省略掉)
  2. 獲取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");
  1. 設定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多長時間過期,好奇…測試下…)

也希望大家能給我的小站沙加的部落格增添點人氣