1. 요구 사항
최근에, 나는 재료 설계를 기반으로 내 자신의 뉴스 앱을 리팩토링했으며 데이터 소스는 문제입니다.
전임자는 Zhihu Daily 및 Phoenix News와 같은 API를 분석했으며 해당 URL을 기반으로 뉴스 JSON 데이터를 얻을 수 있습니다. 코드 쓰기 기술을 행사하기 위해 저자는 뉴스 페이지를 기어 다니고 API를 구축하기 위해 직접 데이터를 얻을 계획입니다.
2. 효과 사진
아래 그림은 원본 웹 사이트의 페이지입니다.
Crawler는 데이터를 얻어 APP 모바일 터미널에 표시했습니다.
3. 크롤러 아이디어
앱의 구현 프로세스는이 기사를 참조 할 수 있습니다. 이 기사는 주로 데이터를 크롤링하는 방법을 설명합니다.
안드로이드에서 앱 작동을 녹화하여 GIF 동적 사진을 생성하는 전체 프로세스 : //www.vevb.com/article/78236.htm
Android 자료 디자인을 배우십시오 (ListView 대신 RecyclerView) : //www.vevb.com/article/78232.htm
Netease News Page (RecyclerView)의 Android 프로젝트 실용 모방 : //www.vevb.com/article/78230.htm
JSOUP 소개
JSOUP은 Java 용 오픈 소스 HTML 파서이며 특정 URL 주소 및 HTML 텍스트 콘텐츠를 직접 구문 분석 할 수 있습니다.
JSOUP은 주로 다음 기능을 가지고 있습니다.
4. 크롤링 과정
웹 페이지 html을 받으라는 요청을 받으십시오
뉴스 웹 페이지 HTML의 DOM 트리는 다음과 같습니다.
다음 코드는 코드를 사용하여 지정된 URL을 기반으로 GET 요청에 의해 리턴 된 HTML 소스 코드를 얻습니다.
public static string doget (String urlstr)는 commonexception {url url; 문자열 html = ""; {url = new URL (urlstr); httpurlConnection Connection = (httpurlConnection) url.openConnection (); Connection.setRequestMethod ( "get"); Connection.setConnectTimeout (5000); Connection.SetDoInput (true); Connection.setDoOutput (true); if (connection.getResponseCode () == 200) {inputStream in = connect.getInputStream (); html = streamtool.intostringbybyte (in); } else {Throw New CommoneXception ( "뉴스 서버 반환 값은 200이 아닙니다"); }} catch (예외 e) {e.printstacktrace (); 새로운 commonexception을 던지십시오 ( "요청 실패"); } return html;}inputStream in = connection.getInputStream (); 결과 입력 스트림을 문자열로 변환하는 것은 일반적인 요구 사항입니다. 우리는 그것을 추상화하고 도구 방법을 작성합니다.
public class streamtool {public static string intostringbybyte (inputstream in) 예외 {bytearrayoutputstream outstr = new BytearRayoutputStream (); 바이트 [] 버퍼 = 새로운 바이트 [1024]; int len = 0; StringBuilder content = new StringBuilder (); while ((len = in.read (buffer))! = -1) {content.append (new String (buffer, 0, len, "utf -8")); } outstr.close (); return content.toString (); }}5. 제목을 얻으려면 HTML을 구문 분석합니다
Google 브라우저의 검열 요소를 사용하여 뉴스 제목에 대한 HTML 코드를 찾으십시오.
<div id = "article_title"> <h1> <a href = "http://see.xidian.edu.cn/html/news/7428.html"> "클래식 음악 작품과 인본주의 미학의 감상에 대한 강의"</a h1> </h1>에 대한 강의에 대한 통지 </h1>
GetElementById (String ID) 메소드를 사용하여 위의 html에서 id = "article_title"의 일부를 찾아야합니다.
문자열 htmlstr = httptool.doget (urlstr); // 획득 한 html 소스 코드를 web page의 html 소스 코드를 documentDocument doc = jsoup.parse (htmlstr)로 변환합니다.
6. 릴리스 날짜 및 정보 출처를 얻으십시오
또한 HTML 코드를 찾으십시오
<html> <head> </head> <bod> <div id = "article_detail"> <span> 2015-05-28 </span> <span> 출처 : </span> <span> 뷰 수 : <script language = "javaScript"src = "http://see.xidian.edu.cn/nows/news/news/news/news/news/news/news/news/news/news/news/news. </script> 477 </span> </div> </body> </html>
아이디어는 위와 유사합니다. getElementById (String ID) 메소드를 사용하여 id = "article_detail"이 요소임을 찾은 다음 getElementsByTag를 사용하여 스팬 부분을 얻습니다. 총 3 <span> ... </span>가 있기 때문에 요소 대신 요소가 반환됩니다.
// article_detail은 2016-01-15 소스 : views : 177 Element detaile = articleele.getElementById ( "article_detail"); 요소 세부 사항 = detaile.getElementsByTag ( "span"); // 릴리스 시간 string datest = reveral = reverals.get (0) .text (// News Source sourcest = setalls.
7. 분석의 횟수
위의 세부 사항을 인쇄하면 (2) .text ()가
견해 수 :
전망이 없습니까? 왜?
뷰 수는 JavaScript에 의해 렌더링되므로 JSOUP Crawler는 HTML 컨텐츠 만 추출 할 수 있으며 동적으로 렌더링 된 데이터를 얻을 수 없습니다.
두 가지 해결책이 있습니다
위의 urlhttp : //see.xidian.edu.cn/index.php/news/click/id/7428을 방문하면 다음과 같은 결과를 얻을 수 있습니다.
document.write (478)
이 478은 우리가 필요한 견해 수입니다. 위의 URL에 대한 GET 요청을하고 반환 된 문자열을 가져오고 일반을 사용하여 그 숫자를 찾습니다.
//이 뉴스 페이지를 방문 할 때 뷰 수는 +1이되고 횟수는 js jsstr = httptool.doget (count_base_url + currentPage)에 의해 렌더링 된 문자열입니다. int readtimes = integer.parseint (jsstr.replaceall ( "// d+", ""); // 또는 다음 정기 방법을 사용하십시오 // String readTimestr = jsstr.replaceall ( "[^0-9]", "");
8. 뉴스 내용을 분석하십시오
원래는 일반 텍스트로 뉴스 내용을 얻는 형태 였지만 나중에 Android 측에도 CSS 형식을 표시 할 수 있으므로 나중에 컨텐츠를 HTML 형식으로 유지했습니다.
요소 contentele = articleele.getElementById ( "article_content"); // 뉴스 바디 내용 문자열 contenttr = contentEle.toString (); // 텍스트 () 메소드가 사용되면 뉴스 컨텐츠의 HTML 태그는 Android ()에 webView를 사용하여 html을 표시하기 위해 // 손실됩니다.
9. 사진 URL을 분석하십시오
웹 페이지에는 크고 작은 사진이 많이 있습니다. 뉴스 텍스트에서만 내용을 얻으려면 먼저 뉴스 내용의 요소를 찾은 다음 getElementsByTag ( "IMG")를 사용하여 그림을 필터링하는 것이 가장 좋습니다.
요소 contentele = articleele.getElementById ( "article_content"); // 뉴스 바디 내용 문자열 contenttr = contentele.toString (); // 텍스트 () 메소드가 사용되면 뉴스 컨텐츠의 HTML 태그는 andtring ()를 사용하여 webView를 사용하여 HTML을 표시하기 위해 // 손실됩니다. contentELE.getEmentementSyTag ( "img"); String [] imageUrls = new String [image.size ()]; for (int i = 0; i <imageUrls.length; i ++) {imageUrls [i] = images.get ( "src");}10. 뉴스 엔티티 자비 베인
위의 것은 제목, 출시일, 읽기 수, 뉴스 내용 등을 얻는 것입니다. 우리는 자연스럽게 Javabean을 구성하고 얻은 내용을 엔티티 클래스에 캡슐화해야합니다.
공개 클래스 기사 {private int index; 개인 문자열 [] imageUrls; 개인 문자열 제목; 개인 문자열 publishdate; 개인 문자열 소스; 개인 int readtimes; 개인 문자열 본체; public articleitem (int index, string [] imageUrls, String Title, String PublishDate, String Source, int ReadTimes, String Body) {this.index = index; this.imageurls = imageUrls; this.title = 제목; this.publishdate = publishdate; this.source = source; this.ReadTimes = readTimes; 이. Body = Body; } @override public String toString () {return "article"article "article"index = " + index +",/n imageUrls = " + arrays.toString (imageUrls) +",/n,/n publishDate = " + publishDate +",/n source = " + source +",/n readtimes = " + readtimes +",/n body + ""; }}시험
public static articleitem getNewSitem (int currentpage)은 commonexception {// 접미사 번호에 따라 뉴스 URL 문자열 urlstr = article_base_url + currentPage + ".html"; 문자열 htmlstr = httptool.doget (urlstr); 문서 doc = jsoup.parse (htmlstr); 요소 articleele = doc.getElementById ( "기사"); // 제목 요소 TitleEle = articleEle.getElementById ( "article_title"); 문자열 titlest = titleele.text (); // article_detail은 2016-01-15 포함 소스 :보기 : 177 요소 detailele = articleele.getElementById ( "article_detail"); 요소 세부 사항 = detailele.getElementsByTag ( "span"); // 릴리스 시간 문자열 datest = alfords.get (0) .text (); // 뉴스 소스 문자열 sourcest = alfords.get (1) .text (); //이 뉴스 페이지를 방문하면 뷰 수는 +1이므로 JS가 렌더링 한 횟수입니다. jsstr = httptool.doget (count_base_url + currentPage); int readtimes = integer.parseint (jsstr.replaceall ( "// d+", ""); // 또는 다음 일반 방법을 사용하십시오 // String readTimestr = jsstr.replaceall ( "[^0-9]", ""); 요소 contentele = articleele.getElementById ( "article_content"); // 뉴스 바디 내용 문자열 contenttr = contentELE.TOSTRING (); // 텍스트 () 메소드를 사용하는 경우 뉴스 컨텐츠의 HTML 태그가 손실됩니다. // android에서 webView와 함께 html을 표시하려면 toString () // string contenttr = contentEle.text ()를 사용하십시오. 요소 images = contentele.getElementsByTag ( "IMG"); 문자열 [] imageUrls = new String [images.size ()]; for (int i = 0; i <imageUrls.length; i ++) {imageUrls [i] = images.get (i) .attr ( "src"); } 새 기사 (currentPage, imageUls, titlest, datest, dateStres, sourcest, readtimes, contenttr);} public static void main (string [] args)은 commonexception {system.out.println (7928));}를 반환합니다.출력 정보
기사 [index = 7928, imageUrls = [/uploads/image/image/image/20160114225911_34428.png], title = 전기 공학 학교는 "겨울 캠퍼스 전체에서 무결성의 꽃이 꽃을 피우게하자"교육 활동, 출판사 = 출처 = <dix = 200, 읽기 = <dix = 200, id = "article_content"> <p style = "Text-Indent : 2em;" align = "respitify"> <strong> <span style = "font-syle = 16px; line-height : 1.5; 1.5;"> Xidian News Network </span> </span> </span> <span style = "font-size : 16px; line-height : 1.5;"> (Comradesperson </span> <spant Style = "font-size : 16px;"5px; " dan </span </strong> <span style = "font-size : 16px; line-height : 1.5;"> ...)
이 기사에서는 JSOUP Web Crawler를 구현하는 방법을 설명합니다. 기사가 당신에게 도움이된다면, 나에게 엄지 손가락을 줘.