TIL - Web Crawling

KDG·2020년 6월 6일
0

Web Crawling

  • 웹사이트를 분석 후 원하는 데이터를 추출하는것

* 크롤링

  • 크롤링할 데이터를 명확히 정의한다.
  • 개발자도구를 사용해 반복적인 태그의 패턴을 찾는다.
  • CSS선택자를 활용할 수 있는지 검토한다.
  • 효율적인 방법으로 코드를 작성한다.

크롤링 하기전에 BeautifulSoup이라는 모듈을 설치해주고, requests 라이브러리도 import한다.

BeautifulSoup

  • html 태그를 다룰수있는 라이브러리
  • html에서 필요한 정보들을 뽑아낼때 사용
  • 원하는 요소를 쉽게 가져올 수 있음

requests 라이브러리

  • http 요청을 해준다.

BeautifulSoup, requests 적용시키기

crawling_url = "https://www.billboard.com/charts/hot-100"
req = requests.get(crawling_url)
html = req.text
bs = BeautifulSoup(html, 'html.parser')

* crawling_url이라는 변수를 만들어 크롤링할 주소를 넣어주고,
* requests.get(crawling_url)을 입력해 크롤링할 주소를 불러온다.
* html = req.text로 파이썬이 불러온 내용을 이해할 수 있도록 문자열(str) 객체를 반환한다. 
         하지만 이 문자열 객체로는 정보추출이 어려움
* BeautifulSoup으로 requests가 반환한 문자열 정보를 파이썬이 쉽게 이해할 수 있는 객체구조로 변환해준다.
 - bs = BeautifulSoup(html, 'html.parser')
   BeautifulSoup으로 html을 python객체로 파싱한다는 것이고, 
   두번째 인자에는 어떤 parser를 이용할지 명시


** parsing : 데이터를 조립해 원하는 데이터를 빼내는 것
** parser : parsing을 행하는 프로그램,
   원시프로그램(기계어로 변역되기전의 프로그램)의 명령문이나 온라인 명령문, html문서 등에서 markup tag등을 입력으로 받아들여
   구문을 해석할 수 있는 단위로 여러부분으로 분활해주는 역할

csv 파일 만들기

크롤링 하고 난 후 csv파일로 만들면 깔끔하게 정리돼서 가독성이 좋아진다.

csv_filename_to_wirte = "billboardchart.csv"  ## csv파일이름을 정함
csv_open = open(csv_filename_to_wirte, 'w+', encoding='utf-8') # csv파일을 쓰기버전으로 오픈하고 유니코드 8로 지정
csv_writer = csv.writer(csv_open) 
csv_writer.writerow( ('rank','song','artist') ) # 들어갈 카테고리 지정

크롤링하기

크롤링 할 사이트에 들어가 개발자도구를 열고 내가 데이터를 수집할 자료의 해당 태그를 확인해 태그를 복사한다.
그 후 반복문으로 해당 태그에 들어가있는 문자들을 뽑아낸다.

크롤링할때 자주 사용하는 것

* find('태그이름')
 - 해당되는 태그를 불러온다.(최초 검색결과만 출력)

* find_all('태그이름')
 - 해당 모든 태그를 불러온다.
  find_all('align="center")
 - 속성값을 기준으로 태그를 불러온다.
 
* re.compile
 - re 모듈의 compile 함수는 정규식 패턴을 입력으로 받아들여 정규식 객체를 리턴한다.
   re.copile(검색할 문자열)와 같이 함수를 호출하면 정규식 객체를 리턴한다.
   ** 정규 표현식은 특정한 규칙을 가진 문자열을 표현하는데 사용되는 함수
       ex) ., ^, $, *, (), 등등이 있다.
       
* .string
 - 태그하위의 텍스트를 문자열로 객체화해준다. 하위에 텍스트가 없으면 None을 반환
 
* .text
 - 하위 자식태그의 텍스트까지 문자열로 반환시켜준다.
   html형식으로 담긴 데이터에서 텍스트정보만 빼와주는 역할을 한다.

0개의 댓글