기능 추가
- 사람인 사이트의 개발자 채용공고를 크롤링하였다.
- 웹 문서의 HTML 요소를 객체화하여 원하는 데이터를 선택할 수 있게 만들어주는
Jsoup
라이브러리를 사용하였다. - 개발자로 검색하였을 때의 주소에 있는
pageCount
값은 검색된 채용공고 게시글 수를 뜻한다. - 사용자가 숫자를 입력하면 해당 숫자만큼의 채용공고를 크롤링해와 DBMS에 자동으로 저장하도록 만들었다.
개선 필요
- 현재는 실제 채용공고 상세보기 페이지의 정보가 아니라, 채용공고 목록 페이지에 노출된 정보에만 접근할 수 있다. 따라서 채용공고의
내용
대신 URL만을 가져오게 만들었다. - 목록 페이지가 아니라 실제 게시글 상세보기 페이지를 크롤링할 필요가 있다.
- 이를 위해서는 우선 목록 페이지를 통해 게시글의 주소를 알아내 자료구조에 담은 후, 반복문을 돌며 주소에 해당하는 페이지에 접근하여 정보를 가져와야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public class CrawlRecruitCommand implements Command{
ArticleDao articleDao;
public CrawlRecruitCommand(ArticleDao articleDao) {
this.articleDao = articleDao;
}
@Override
public void execute(Map<String,Object> context) {
System.out.println("[채용공고 등록]");
int no = Prompt.inputInt("사람인으로부터 몇 개의 채용공고를 가져오시겠습니까?");
try {
String URL = "<http://www.saramin.co.kr/zf_user/search/recruit?search_area=main&search_done=y&search_optional_item=n&searchType=default_mysearch&searchword=%EA%B0%9C%EB%B0%9C%EC%9E%90&recruitPage=2&recruitSort=relation&recruitPageCount=>"
+ no
+ "&inner_com_type=&company_cd=0%2C1%2C2%2C3%2C4%2C5%2C6%2C7%2C9%2C10&quick_apply=&except_read=";
org.jsoup.Connection conn = Jsoup.connect(URL);
Document doc = conn.get();
//Element jobs = doc.select();
Elements titles = doc.select("h2.job_tit a");
Elements dates = doc.select("div.job_date span.date");
//Elements companyName = doc.select("strong.corp_name a");
titles.attr("title");
System.out.println(titles.size());
for (int i = 0; i < no; i++) {
Article article = new Article();
article.setNo(i + 1);
article.setTitle(titles.get(i).attr("title"));
article.setWriter(2);
article.setEndDate(parseDate(dates.get(i).text()));
article.setContent("<http://www.saramin.co.kr>" + titles.get(i).attr("href"));
article.setCategoryNo(3);
//article.setCompany(companyName.get(i).attr("title"));
articleDao.insert(article);
}
System.out.println("크롤링이 끝났습니다! 입력된 데이터 개수:" + no);
} catch(Exception e) {
e.printStackTrace();
}
}
public String parseDate(String rawDate) {
if (!rawDate.split(" ")[0].equals("~")) {
return "1996-09-02";
}
return "2020-" + rawDate.split(" ")[1].split("\\\\(")[0].replace("/", "-");
}
}