낙서장

java // 크롤링 연습

Jaybon 2020. 8. 14. 12:24

 

URL패턴분석

 

크롤링을 막는 방식
1. Iframe
2. 연속적 Request
3. 레퍼럴 - Referrer - 어느페이지에서 접근했나

---------------------

파이썬
- BeautifulSoup
- 셀레니움 (인증이 필요한 페이지 등도 다 크롤링됨)

-------------

네이버 뉴스 분석

정치 주소
https://news.naver.com/main/main.nhn?mode=LSD&mid=shm&sid1=100

정치 기사 주소
https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=100&oid=001&aid=0011814212

경제 주소
https://news.naver.com/main/main.nhn?mode=LSD&mid=shm&sid1=101

경제 기사 주소
https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=101&oid=374&aid=0000218299

 

분석

sid1 = 카테고리 (100~ 105) - 6번 for 문

oid = 신문사 

aid = 네이버에 올린 기사글(넘버링)

 

mode=LSD / mid=shm 등 분석하기 어려운 것은 지워보고 화면이 어떻게 나오는지 확인하여 분석

 

언론사와 oid 확인 코드

더보기
package crawnewsapp;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

// 1번 JSOUP를 빌드패스
// 2번 JSOUP로 URL 요청
// 3번 oid의 번호는 어디까지 있는지 + oid마다의 신문사명을 매칭

public class OidParse {
	
	public static void main(String[] args) {
		
		Map<String, String> oidMap = new HashMap<>();
		
		Document doc = null;
		
		String oid = "0";
		
		int failCount = 0;
		
		for (int i = 1; i < 1000; i++) {
			if (failCount > 10) {
				System.out.println("언론사가 더 이상 없는 것 같습니다.");
				break;
			}
			
			if((i+"").length() == 1) {
				
				oid = "00"+i;
				
			} else if((i+"").length() == 2) {
				
				oid = "0"+i;
				
			} else if((i+"").length() == 3) {
				
				oid = ""+i;
			}
			
			try {
				doc = Jsoup.connect("https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=101&oid="+oid+"&aid=0000000001").get();
			} catch (IOException e) {
				System.out.println(e.getMessage());
				int count = 0;
				for (int j = 1; j < 10; j++) {
					try {
						doc = Jsoup.connect("https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=101&oid="+oid+"&aid=000000000"+j).get();
					} catch (IOException e1) {
						count++;
					}
				}
				if(count == 9) {
					failCount++;
					continue;
				} 
			}
			
			failCount = 0;
			
			String press = doc.select(".press_logo").select("img").attr("title");
			
			if (press.length() < 2) {
				int count = 0;
				for (int j = 1; j < 5; j++) {
					try {
						doc = Jsoup.connect("https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=101&oid="+oid+"&aid=000000000"+j).get();
						if (doc.select(".press_logo").select("img").attr("title").length() > 1) {
							press = doc.select(".press_logo").select("img").attr("title");
							break;
						}else {
							count++;
						}
					} catch (IOException e1) {
						System.out.println(e1.getMessage());
					}
				}
				if(count == 4) {
					System.out.println("익명의 언론사는 있으나 내용이 없습니다.");
					continue;
				} 
			}
			
			System.out.println(press +" : "+ oid);
			if (press.length() > 1) {
				oidMap.put(press, oid);				
			}

		}
		
		System.out.println(oidMap);
		System.out.println(oidMap.size());
		
	}
}

 

--------------