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());
}
}
--------------
'낙서장' 카테고리의 다른 글
라이엇 오리아나 api 세팅 (0) | 2020.08.18 |
---|---|
라이엇 api 라이브러리 (0) | 2020.08.18 |
라이엇 API 리그 정보 가져오기 (랭킹) (0) | 2020.08.09 |
opgg 프로젝트 라이엇 API모델 (0) | 2020.08.08 |
라이엇 api 연구1 - 매치 아이디로 경기 가져오기 (0) | 2020.08.08 |