-
업무 자동화 코딩캠프 #02 Crawling업무 자동화 제주도 코딩캠프 2019. 2. 18. 20:59
캠프 두번째 날은 Crawling 에 대해 배웠다.
크게 두 가지의 라이브러리를 사용했다.
#1. requests library
그 중 하나가 requests 였다.
우선, 라이브러리를 설치하고 !!
requests - python 에서 HTTP 요청을 보내는 라이브러리
Lord SQL Injection 에서 Blind Injection 을 시도했을 때와 같은 라이브러리이다.
캠프에서 받았던 자료를 통해 작성한 코드이다.
paullab.co.kr 에 Get 방식으로 접근하여 그 내용을 test.html 에 저장하는 코드이다.
utf-8 을 해주어야만 한글이 제대로 출력된다.
예제에서는 utf-8 을 적용해주지 않았습니다.
.text 외에도 header 내용을 볼 수 있는 response.headers,
HTTP status 를 확인할 수 있는 response.status_code,
정상적으로 접근했는지 확인할 수 있는 response.ok 등이 있다.
#2. BeautifulSoup library
Requests 와 같이 활용되는 또 하나의 라이브러리는 BeautifulSoup 였다.
BeautifulSoup - 세부적인 정보를 추출할 때 필요한 라이브러리
Requests 을 통해 html 구조의 데이터를 단순하게 'str' 타입의 데이터로 받아오는 것은 가능했다. 하지만, Requests 만으로는 python 내부에서 'html' 의 구조를 이해하지 못한다. Python 이 이해하는 구조로 만들어 주기 위해서는 BeautifulSoup 가 필요하며, 이것이 BeautifulSoup 에서 제공하는 Parser 가 하는 역할이다.
위의 예시처럼 str 자료형에서 <title>, <p> 와 같은 html 태그에 접근하기 위해 'html.parser' 를 적용해준 것을 볼 수 있다.
soup.title.name
soup.title.parent.name
와 같이 부모, 속성과 같은 세부적인 접근도 가능하다.
soup.find_all('a') > a 태그를 모두 가져온다. (list)
soup.find(id="link3") > id 가 link3 인 태그를 모두 가져온다.
soup.get_text() > 텍스트만 가져온다.
soup.select() > '셀렉터' 를 이용하여 좀더 세부적인 접근이 가능하다.
css 문법 중 하나인 셀렉터를 알면 특정 태그에 접근하기 쉽다.
css 안에서 id 와 class 를 지칭할 때, id 는 # 을 사용하고 class 는 . 을 사용한다는 점만 주목하면 된다.
1 <a href='home.html'></a>
2 <li class='beautiful'>
3 <p id='text'>
4 <a href = ''> </a> // 가져올 라인
5 </p>
6 </li>
다음과 같은 html 코드가 있을 때, <a> 로 접근한다면 가져올 정보 이외에도 1번 라인에 있는 정보도 가져오게 된다.
' > ' 를 통해서 찾는 조건들을 이을 수 있다
조건1 > 조건2 > ... > 조건 n
조건1 안에 조건2 안에 .... 조건 n 을 만족하는 tag
위의 같은 코드에서 4번 줄에 접근하려면 결국
class 가 beautiful 인 tag 안에 id 가 text 인 tag 안에 a 태그
.beautiful > #text > a
혹은
li tag 안에 p tag 안에 a tag 와 같이 접근해야한다.
li > p > a
하지만, class 와 id 를 사용하는 방법이 더 세밀하기 때문에 태그로 접근하는 것보다 정확하다.
#3. 실습
실습은 Pwnable.kr 에 있는 문제들의 이름을 나열하는 것으로 했다.
짜잔!!
'업무 자동화 제주도 코딩캠프' 카테고리의 다른 글
업무자동화 관련 서적 집필!! (0) 2019.03.12 업무 자동화 코딩캠프 #02 Selenium_inputData (0) 2019.02.20 업무 자동화 코딩캠프 #02 Selenium (0) 2019.02.19 업무 자동화 코딩캠프 #01 Access CSV Data (0) 2019.02.16 업무 자동화 코딩캠프 #01 Series & DataFrame (0) 2019.02.16 댓글