데이터 스크래핑(웹 크롤러)

HTML파일 추출하기 (1차 추출, scrape 명령어)

웹페이지를 저장했으면 페이지를 열어서, 브라우저의 "요소검사" 기능을 통해서 해당정보가 담긴 테이블이나 div 태그등을 찾아야 합니다. 약간의 시행착오가 필요합니다.

프로젝트오일러 웹페이지( https://projecteuler.net/archives )에는 <table id="problems_table" class="grid"> 라는 태그 아래에 추출하고자 하는 정보가 모여있습니다.  그래서 scrape 라는 명령어로 이 태그부분만 추출할수 있습니다.

< test.html scrape -be 'table#problems_table'

 css의 id값이 'problems_table' 인 table 태그부분만 가져오라는 명령입니다. 만약 class 값으로 주어졌다면, table.problems_table 으로 점(.)으로 구분해주면 됩니다. (출력내용이 길면, 마찬가지로 head 명령으로 적당히 잘라주면 됩니다.)

또는 하위태그인 tr태그까지 지정해줄수 있습니다.

< test.html scrape -be 'table#problems_table > tr:not(:first-child)'

tr태그를 가져오되, 이 페이지의 경우 첫줄이 제목을 표시하는 줄이기 때문에, 첫번째 줄은 제외하고 가져오라는 명령입니다. 세밀하게 지정해줄수록 이후의 작업이 편하긴 합니다.

< test.html scrape -be 'table#problems_table > tr:not(:first-child)' > test_table.html

이 역시 결과를 파일로 저장해줄수 있습니다. test_table.html 으로 저장해주겠습니다.

 

JSON 파일로 변환하기

2차 추출작업은 json 이라는 파일에서 이루어집니다. 이를 위해서 html 파일을 json파일로 변환해줘야 합니다.

< test_table.html xml2json > test_table.json

또는 앞의 명령에 붙여서 한꺼번에 실행해도 됩니다.

< test.html scrape -be 'table#problems_table > tr:not(:first-child)' | xml2json > test_table.json

2개이상의 명령어가 연결됐기 때문에 명령어 사이에 파이프( | ) 를 넣어줘야 합니다.

라인이 길때는 역슬래쉬를 넣고, 다음줄에 이어서 명령어를 작성하면 됩니다.

< test.html scrape -be 'table#problems_table > tr:not(:first-child)' \
| xml2json > test_table.json

 

댓글

댓글 본문
작성자
비밀번호
버전 관리
nomadlife
현재 버전
선택 버전
graphittie 자세히 보기