대상 웹 사이트에 대한 링크를 기반 으로이 기사는 어려움을 더욱 증가시키고 대상 페이지에 필요한 컨텐츠를 캡처하고 데이터베이스에 저장합니다. 여기서 테스트 사례는 내가 자주 사용하는 영화 다운로드 웹 사이트 (http://www.80s.la/)를 사용합니다. 나는 원래 웹 사이트의 모든 영화 다운로드 링크를 크롤링하고 싶었지만 나중에 너무 오래 걸렸다 고 느꼈으므로 2015 영화의 다운로드 링크를 기어 다니도록 변경했습니다.
첫 번째 원칙 소개
실제로 원칙은 첫 번째 기사와 유사합니다. 차이점은이 웹 사이트에 너무 많은 분류 목록이 있기 때문에 이러한 태그를 선택하지 않으면 상상할 수 없다는 것입니다.
카테고리 링크 또는 태그 링크를 사용할 필요가 없습니다. 이 링크를 사용하여 다른 페이지를 크롤링하지 않습니다. 페이지 하단에있는 모든 유형의 영화의 페이지 매김을 통해서만 다른 페이지의 영화 목록 만 얻을 수 있습니다. 동시에 영화 세부 사항 페이지의 경우 영화 제목과 Thunder Download 링크 만 기어 다니며 깊이 크롤링하지 않습니다. 세부 정보 페이지에서 권장 영화 및 기타 링크가 필요하지 않습니다.
마지막으로, VideolinkMap 컬렉션에서 얻은 모든 영화의 다운로드 링크를 저장 하고이 컬렉션을 가로 질러 MySQL에 데이터를 저장하십시오.
2 코드 구현
구현 원리는 위에서 언급되었으며 코드에 자세한 주석이 있으므로 여기서는 언급하지 않으므로 코드는 다음과 같습니다.
패키지 조치; import java.io.bufferedReader; import java.io.ioexception; import java.io.inputStream; import java.io.inputStreamReader; import java.net.httpurlconnection; import java.net.malformedUrexception; import java.net.url; import java.sql.connection; java.sql.preparedstatement; import java.sql.sqlexception; import java.util.linkedhashmap; import java.util.map; import java.util.regex.matcher; import java.util.regex.pattern; public class videolinkgrab {public static void main (string [] args) {videolinkgrab videolinkgrab = new Videolinkgrab (); videolinkgrab.savedata ( "http://www.80s.la/movie/list/-2015--p"); } / ** * 데이터베이스에서 검색된 데이터를 저장 * @param baseurl * crawler startment point * @return null * * / public void savedata (string baseurl) {map <string, boolean> OldMap = new LinkedHashMap <String, boolean> (); // map <string, string> videolinkmap = new LinkedHashMap <string, String> (); // 비디오 다운로드 링크 문자열 OldLinkHost = ""; // 호스트 패턴 p = pattern.compile ( "(https? : //)? [^// s]*"); // 예 : http://www.zifangsky.cn 경기자 m = p.matcher (baseurl); if (m.find ()) {OldLinkHost = m.group (); } oldmap.put (baseurl, false); videolinkmap = crawllinks (OldLinkhost, OldMap); // 데이터베이스에서 데이터를 트래버스하고 저장하십시오 {Connection Connection = jdbcdemo.getConnection (); for (map.Entry <string, String> 매핑 : videoLinkMap.EntrySet ()) {preparedStatement pstatement = connection. "Movie (moviename, movielink) 값 (?,?)"); pStatement.setString (1, mapping.getKey ()); pStatement.setString (2, mapping.getValue ()); pstatement.executeUpdate (); pstatement.close (); // system.out.println (맵핑 .getKey () + ":" + mapping.getValue ()); } connection.close (); } catch (sqlexception e) {e.printstacktrace (); }} /*** 웹 사이트에서 크롤링 할 수있는 모든 웹 페이지 링크를 크롤링합니다. 이 아이디어에서 폭 넓은 우선 순위 알고리즘은 횡단되지 않은 새로운 링크에 대한 요청을 지속적으로 시작하는 데 사용됩니다. 전체 세트가 가로 질 때까지 새 링크를 찾을 수 없습니다*는 새 링크를 찾을 수 없습니다. 작업은 링크를 요청할 때 링크를 요청할 때 웹 페이지에 필요한 비디오 링크를 정기적으로 검색 한 다음 컬렉션 videolinkmap * * @param oldlinkhost * 도메인 이름에 저장합니다. crawllinks (string oldlinkhost, map <string, boolean> oldmap) {map <string, boolean> newMap = new LinkedHashMap <String, boolean> (); // 각 루프 맵에서 얻은 새 링크 <String, String> VideolinkMap = new LinkedHashMap <String, String> (); // 비디오 다운로드 링크 문자열 OldLink = ""; for (map.Entry <string, boolean> 매핑 : OldMap.entryset ()) {// system.out.println ( "링크 :" + mapping.getKey () + "-------- 확인 :"// + mapping.getValue ()); // (! mapping.getValue ()) {OldLink = mapping.getKey (); // GET 요청을 시작합니다. {url url = new URL (OldLink); httpurlConnection Connection = (httpurlConnection) url .openConnection (); Connection.setRequestMethod ( "get"); Connection.setConnectTimeout (2500); Connection.SetReadTimeout (2500); if (connection.getResponseCode () == 200) {inputStream inputStream = connection.getInputStream (); bufferedReader reader = new bufferedReader (new inputStreamReader (inputStream, "UTF-8")); 문자열 line = ""; 패턴 패턴 = null; 매치기 매치 자 = NULL; // 영화 세부 정보 페이지, 비디오 다운로드 링크를 꺼내고 다른 페이지를 깊이 크롤링하지 마십시오. 문자열 제목 = ""; while ((line = reader.readline ())! = null) {// 페이지에서 비디오 제목을 검색 if (! checktitle) {pattern = pattern.compile ( "([^// s]+).*? </title>"); matcher = pattern.matcher (line); if (matcher.find ()) {title = matcher.group (1); checktitle = true; 계속하다; }} // 페이지 패턴에서 비디오 다운로드 링크를 제거합니다. matcher = pattern.matcher (line); if (matcher.find ()) {videolinkmap.put (title, matcher.group (1)); System.out.println ( "비디오 이름 :" + title + "------ 비디오 링크 :" + matcher.group (1)); 부서지다; // 현재 페이지가 감지되었습니다}}} // 영화 목록 페이지 else if (checkurl (oldlink)) {while ((line = reader.readline ())! = null) {pattern = .compile ( "<a href =/"([^/"/"/s]*)*) "); matcher = mater (line); matcher.group (1) .trim (); (NewLink.endSwith ( "/")) NewLink = NewLink.SubString (0, NewLink.length () -1); // 다른 웹 사이트에서 링크를 폐기하고 (! OldMap.containsKey (! System.out.println (NewMap.put)} reader.close (); } try {thread.sleep (1000); } catch (InterruptedException e) {e.printstacktrace (); } OldMap.replace (OldLink, False, True); }} // 새 링크가 있습니다. (! newMap.isempty ()) {OldMap.putAll (newMap); videolinkmap.putall (crawllinks (oldlinkhost, oldmap)); // 맵의 특성으로 인해 중복 키 값 쌍이 발생하지 않습니다. }/** * 2015 년 영화 목록 페이지 * @Param URL URL을 확인할 것인지 판단 * @return 상태 * */public boolean checkurl (String URL) {Pattern Pattern = Pattern.compile ( "http://www.80s.la/movie/list/-2015---p/-d*"); 매치기 매치 자 = Pattern.Matcher (URL); if (matcher.find ())를 반환합니다. // 2015 목록 else return false; }/** * 페이지가 영화 세부 사항 페이지 페이지 * @param url 페이지 링크 * @return 상태 */public boolean ismoviepage (문자열 URL) {pattern pattern = pattern.compile ( "http://www.80s.la/movie//d+"); 매치기 매치 자 = Pattern.Matcher (URL); if (matcher.find ())를 반환합니다. // 영화 페이지 else가 거짓을 반환합니다. }} 참고 : 다른 웹 사이트에서 특정 컨텐츠를 크롤링하려면 실제 상황에 따라 정규 표현식 중 일부를 합리적으로 수정해야합니다.
세 가지 테스트 결과
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.