낙서장
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());
}
}
--------------