카테고리 없음

[Flutter] 웹 스크래핑으로 웹 사이트 데이터 수집하기

yo0 2024. 6. 21. 10:38

학교 앱을 개발하기 위해 공지사항 데이터가 필요했지만, 학교 웹사이트에서만 공지사항이 노출되고 있었기 때문에 사이트에서 직접 긁어와야 했다.

필요한 데이터는 공지사항 내용이랑 공지사항의 링크 주소 였다.

 

1. 스크래핑을 위해 해당 package가 필요하다.

import 'package:http/http.dart' as http;
import 'package:html/dom.dart' as html;
import 'package:html/parser.dart' as parser;

2. 일단 SSL 인증이나 검증을 무시하기 위해서 http요청 기본설정을 바꿨다.

HttpOverrides.global = MyHttpOverrides();

class MyHttpOverrides extends HttpOverrides{
  @override
  HttpClient createHttpClient(SecurityContext? context){
    return super.createHttpClient(context)
      ..badCertificateCallback = (X509Certificate cert, String host, int port)=> true;
  }

}

3. 일단 dom형태로 변환시켰다. 내가 가져와야할 공지사항은 _artclTdTitle 클래스에 있었기 때문에 해당하는 element들을 선택했다.

  http.Response response = await http.get(Uri.parse("스크랩할 링크"));
  html.Document document = parser.parse(response.body);
  List<html.Element> keywordElements = document.querySelectorAll('._artclTdTitle>a');
  keywords = crawling(keywordElements); //공지 내용 가져오기(커스텀)
  noticeLink = crawlingLink(keywordElements); //공지 링크 가져오기(커스텀)

 

4. 그 후에는 웹 양식에 맞게 가져올 부분들을 선택해서 긁어왔다.

String? crawling(List<html.Element> keywordElements) {
  String? keywords='';
  int i=0;//공지번호(최근순)
  for (var element in keywordElements) {
    if(i==1)
      break;
    html.Element? rank = element.querySelector('strong');
    keywords = rank?.text;
    i++;
  }

  return keywords;
}
String? crawlingLink(List<html.Element> keywordElements){
  String? noticeLink='';
  int i=0;//공지번호(최근순)
  for (var element in keywordElements) {
    if(i==1)
      break;
    noticeLink = element.attributes['href'];
    print(noticeLink);
    i++;
  }
  return noticeLink;

}