오늘날이 회사는 지정된 웹 사이트에서 쿼리 후 일부 데이터 스크래핑을 수행해야하므로 데모 사용을 위해 데모를 작성하는 데 시간이 걸렸습니다.
아이디어는 매우 간단합니다. Java를 통해 링크에 액세스 한 다음 HTML 문자열을 얻은 다음 링크와 같은 필요한 데이터를 구문 분석하는 것입니다. 기술적으로 JSOUP은 페이지 구문 분석에 편리합니다. 물론 JSOUP은 매우 편리하고 간단합니다. 한 줄의 코드로 사용하는 방법을 알 수 있습니다.
문서 doc = jsoup.connect ( "http://www.oschina.net/") .data ( "query", "java") // request parameters.useragent ( "i 'm jsoup") // set user-agent .cookie ( "auth", "token") // set connection (3000) // set connection (3000) // // 우편 메소드를 사용하여 URL에 액세스하십시오
전체 구현 프로세스는 다음과 같습니다.
1. 구문 분석 해야하는 페이지 분석 :
웹 사이트 : http://www1.sxcredit.gov.cn/public/infocomquery.do?method=publicindexquery
페이지:
먼저이 페이지에서 쿼리를 수행하십시오. 요청 된 URL, 매개 변수, 메소드 등을 관찰하십시오.
여기서 우리는 내장 개발자 도구 (바로 가기 키 F12)를 사용하고 다음은 쿼리 결과입니다.
URL, 메소드 및 매개 변수를 볼 수 있습니다. URL을 또는 쿼리하는 방법을 알면 아래 코드를 시작합니다. 재사용 및 확장을 위해 여러 클래스를 정의했습니다.
1. Rule.java는 쿼리 URL, 메소드, 매개 변수 등을 지정하는 데 사용됩니다.
패키지 com.zhy.spider.rule; / ** * 규칙 클래스 * * @Author Zhy * */ public class 규칙 {/ ** * 링크 */ 개인 문자열 URL; / ** * 매개 변수 collection */ private string [] params; / *** 매개 변수에 해당하는 값*/ 개인 문자열 [] 값; / !! / ** * 클래스 / id / selection * resultTagName 유형을 설정하고 기본값을 ID * / private int type = id; / ** *get / post *요청 유형, 기본값 get * / private int requestmoethod = get; 공개 최종 정적 int get = 0; 공개 최종 정적 int post = 1; 공개 최종 정적 int 클래스 = 0; 공개 최종 정적 int id = 1; 공개 최종 정적 int 선택 = 2; public Rule () {} public Rule (String URL, String [] params, String [] 값, String resultTagName, int type, int requestMoethod) {super (); this.url = url; this.params = params; this.values = 값; this.resulttagname = resultTagName; this.type = 유형; this.requestMoethod = requestMoethod; } public String getUrl () {return url; } public void seturl (String URL) {this.url = url; } public String [] getParams () {return params; } public void setparams (string [] params) {this.params = params; } public String [] getValues () {return 값; } public void setValues (문자열 [] 값) {this.values = 값; } public String getResultTagName () {return resultTagName; } public void setResultTagName (String resultTagName) {this.ResultTagName = resultTagName; } public int gettype () {return type; } public void settype (int type) {this.type = type; } public int getRequestMoethod () {return requestMoEthod; } public void setRequestMoethod (int requestMoEthod) {this.RequestMoEthod = requestMoEthod; }}이 규칙 클래스는 쿼리 프로세스 중에 필요한 모든 정보를 정의하여 확장 및 코드 재사용을 용이하게합니다. 크롤링 해야하는 각 웹 사이트에 대한 코드 세트를 작성하는 것은 불가능합니다.
2. 필요한 데이터 객체는 현재 링크 만 필요합니다. linktypedata.java
패키지 com.zhy.spider.bean; 공개 클래스 linktypedata {private int id; / *** 링크 주소*/ 개인 문자열 linkHref; / *** 링크 제목*/ 개인 문자열 링크 텍스트; / *** 요약*/ 개인 문자열 요약; / *** content*/ 개인 문자열 내용; public int getid () {return id; } public void setid (int id) {this.id = id; } public String getLinkHref () {return linkhref; } public void setLinkHref (String LinkHref) {this.linkhref = linkhref; } public String getLinkText () {return linktext; } public void setLinkText (String LinkText) {this.LinkText = linkText; } public String getSummary () {반환 요약; } public void setSummary (문자열 요약) {this.summary = 요약; } public String getContent () {return 컨텐츠; } public void setContent (문자열 내용) {this.content = content; }} 3. 핵심 쿼리 클래스 : ExtractService.java
패키지 com.zhy.spider.core; import java.io.ioexception; java.util.arraylist 가져 오기; Java.util.list 가져 오기; java.util.map import; import javax.swing.plaf.textui; import org.jsoup.connection; import org.jsoup.jsoup; import org.jsoup.nodes.document; import org.jsoup.nodes.element; import org.jsoup.select.elements; com.zhy.spider.bean.linktypedata 가져 오기; import com.zhy.spider.rule.rule; import com.zhy.spider.rule.ruleeexception; import com.zhy.spider.util.textutil; / ** * * @Author Zhy * */ public class ExtractService {/ ** * @param RUL * @return */ public static list <LinktyPedata> Extract (규칙 규칙) {// 규칙 validaterule (Rule)의 필요한 검증을 수행합니다. List <LinktyPedata> Datas = New ArrayList <LinktyPedata> (); linktypedata data = null; { / ** * 구문 분석 규칙 * / String url = rule.getUrl (); 문자열 [] params = rule.getParams (); 문자열 [] 값 = rule.getValues (); 문자열 resultTagName = rule.getResultTagName (); int type = rule.getType (); int requestType = rule.getRequestMoEthod (); 연결 conn = jsoup.connect (url); // if (params! = null) {for (int i = 0; i <params.length; i ++) {conn.data (params [i], 값 [i]); }} // 요청 유형 설정 문서 doc = null; switch (requestType) {case Rule.get : doc = conn.timeout (100000) .get (); 부서지다; CASE RUL.POST : DOC = CONN.TIMEOUT (1000000) .post (); 부서지다; } // 프로세스 리턴 데이터 요소 결과 = 새로운 요소 (); switch (type) {case Rule.Class : results = doc.getElementsByClass (resultTagName); 부서지다; CASE RUL.ID : 요소 결과 = doc.getElementById (resultTagName); results.add (결과); 부서지다; case Rule.Selection : results = doc.Select (resultTagName); 부서지다; 기본값 : // resultTagName이 비어 있으면 BODY 태그가 더 이상 사용되지 않습니다. }} for (요소 결과 : 결과) {elements links = result.getElementsByTag ( "a"); for (요소 링크 : links) {// 필수 필터 문자열 linkhref = link.attr ( "href"); 문자열 linktext = link.text (); data = new linktypedata (); data.setlinkhref (linkhref); data.setLinkText (linktext); data.add (data); }}} catch (ioexception e) {e.printstacktrace (); } 반환 데이터; } / *** 전달 된 매개 변수에서 필요한 검증을 수행* / private static void validaterule (규칙 규칙) {String url = rule.getUrl (); if (textUtil.isempty (url)) {Throw New inribeexception ( "URL이 비어있을 수 없습니다!"); } if (! url.startSwith ( "http : //")) {Throw new inrienexception ( "URL이 잘못되었습니다!"); } if (rule.getParams ()! = null && rule.getValues ()! = null) {if (rule.getParams (). length! = rule.getValues (). length) { "매개 변수의 키 값은 키와 값 수와 일치하지 않습니다!"); }}}}} 4. 예외 클래스가 사용됩니다 : inreexception.java
패키지 com.zhy.spider.rule; 공개 클래스 inreexception은 runtimeexception을 확장합니다 {public inreexception () {super (); // todo 자동 생성 생성자 스터브} public inrieleexception (문자열 메시지, 던질 가능한 원인) {super (메시지, 원인); // todo 자동 생성 생성자 스터브} public inribeexception (문자열 메시지) {super (메시지); // TODO 자동 생성 생성자 Stub} public inreexception (Throwable Cause) {Super (원인); // TODO 자동 생성 생성자 스텁}} 5. 마지막으로 테스트입니다. 여기에서 테스트하는 데 두 개의 웹 사이트가 사용되며 다른 규칙이 사용됩니다. 자세한 내용은 코드를 참조하십시오.
패키지 com.zhy.spider.test; Java.util.list 가져 오기; com.zhy.spider.bean.linktypedata 가져 오기; com.zhy.spider.core.extractservice 가져 오기; import com.zhy.spider.rule.rule; 공개 클래스 테스트 { @org.junit.test public void getDatasbyClass () {규칙 규칙 = 새 규칙 ( "http://www1.sxcredit.gov.cn/public/infocomquery.do?method=publicindexquery", new string [] {query.entername " String [] { "Xingwang", "},"cont_right ", rule.class, rule.post); list <linktypedata> extracs = extractservice.extract (rule); printf (extracts);} @org.junit.test public void getDatasbycssquery () {deal Rule = new Rule ("http://ww.seor " 새 문자열 [ "이름"}, "Xingwang"}, "div.g-mn div.con-model", rule.get); System.out.println (data.getLinkText ()); 출력 결과 :
Shenzhen Netxing Technology Co., Ltd. http://14603257.11315.com *************************************** Jingzhou Xingwang Highway Materials Co., Ltd. http://05155980.11315.com *************************** Xi'an Quanxing Internet Cafe# *************************** Zichang County Xinxing Net City# ********************************* The Third Branch of Shaanxi Tongxing Network Information Co., Ltd.# ************************************ Xi'an Gaoxing Network Technology Co., Ltd.# *************************************** Shaanxi Tongxing Network Information Co., Ltd. Xi'an Branch# ************************************
마지막으로, 바이두 뉴스를 사용하여 코드를 테스트하십시오. 이는 코드가 보편적임을 의미합니다.
/*** Baidu News를 사용하고 URL 및 키워드 및 리턴 유형 만 설정하십시오*/ @org.junit.test public void getDatasBycsSqueryUserBaidu () {규칙 규칙 = 새 규칙 ( "http://news.baidu.com/ns", New String [] { "Word"}, New String [ "alipay" rule.get); List <LinktyPedata> Extracts = ExtractService.extract (Rule); printf (추출물); } 링크, 키워드 및 요청 유형 만 설정하고 특정 필터 조건을 설정하지 않습니다.
결과 : 특정 정크 데이터가 있는지 확실하지만 필요한 데이터를 크롤링해야합니다. 우리는 규칙을 설정할 수 있습니다. 섹션 및 필터링 조건에 대한 추가 제한.
Sort by time/ns?word=Alipay&ie=utf-8&bs=Alipay&sr=0&cl=2&rn=20&tn=news&ct=0&clk=sortbytime ********************************* x javascript:void(0) ********************************************* Alipay will jointly build a security 첫 번째 배치 http://finance.ifeng.com/a/20140409/12081871_0.shtml ***************************************************************************************************************************************************************************************************************************** 7 동일 뉴스/ns? 단어 =%e6%94%af%e4%bb%98%e5%ae%9d+cont : 2465146414%7C697779368%7C3832159921 & same = 7 & cl = 1 & tn = 30 & fm = sd ****************************************************************************************************************************************************************************************, 스냅 샷 http://cache.baidu.com/c?m=9D78D513D437AB4F9E91697D1CC0161D4381132BA7D3020CD0870FD33A541 B0120A1AC26510D19879E20345DFE1E4BEA876D26605F75A09BBBBBFD91782A6C1352F8A2432721A844A0FD019ADC 1452FC423875D9DAD0EE7CDB168D5F18C & P = C96EC64AD48B2DEF49BD9B780B64 & NEWP = C4769A4790934EA95EA28E 281C4092695912C10E3DD796 & user = baidu & fm = sc & query =%d6%a7%b8%b6%b1%a6 & qid = a400f360007a6c5 & p1 = 1 **************************************************** OpenSSL vulnerability involves many websites Alipay says there is no data leakage yet http://tech.ifeng.com/internet/detail_2014_04/09/35590390_0.shtml ******************************************* 26 same news/ns?word=%E6%94%AF%E4%BB%98%E5%AE%9D+cont:3869124100&same=26&cl=1&tn=news&rn=30&fm=sd ****************************************** Baidu 스냅 샷 http://cache.baidu.com/c?m=9F65CB4A8C8507ED4FECE76310803743438014678387492AC333333339045C1C3AA5EC 677E4742CE932B2152F4174BED843670340537B0EFCA8E57DFB08F29288F2C367117845615A71BB8CB31649B66CF04FDEA44 A7ECFF25E5AAC5A0DA4323C0444757E97F1FB4D7017DD1CF4 & P = 8B2A970D95DF11A05A4C32013 & NEWP = 9E39C64AD4DDD5FA40 BD9B7C5253D8304503C52251D5CE042ACC & USER = BAIDU & FM = SC & QUERY =%D6%A7%B8%B6%B1%A6 & QID = A400F3660007A6C5 & P1 = 2 *************************************** Yahoo Japan starts supporting Alipay payments from June http://www.techweb.com.cn/ucweb/news/id/2025843 ************************************************
단점이 있으면 지적 할 수 있습니다. 그것이 당신에게 유용하다고 생각되면 시도해주세요 ~~ haha
소스 코드를 다운로드하고 여기를 클릭하십시오.
위의 것은 Java Crawler 정보의 예입니다. 우리는 향후 관련 정보를 계속 추가 할 것입니다. 이 사이트를 지원 해주셔서 감사합니다!