인터넷에 있는 정보 중 원하는 것만 골라서 자동으로 수집해주는 기능이다. 정보를 가져오려는 사이트를 불러와서 그 사이트에서 원하는 원하는 정보를 찾고 그 정보를 가져오게 하는 코드를 작성하면 된다. 각 프로그래밍 언어마다 크롤링을 할 수 있는 라이브러리들이 있는데 파이썬에서는 BeautifulSoup이라는 라이브러리를 쓴다.
# 다른 버전과의 충돌 방지를 위해 가상 환경 설치 및 실행 후
# BeautifulSoup 설치
$ pip install beautifulsoup4
#
$ pip install request # 웹사이트로 요청을 할 때 필요하여 설치해야 함
크롤링을 해서 그 결과를 파일에 넣고 저장하려면 파이썬에서 파일생성 및 저장, 종료 등을 실행해야 한다. 파이썬을 공부할 때 그 부분은 제대로 안하고 건너뛰었었기 때문에 다시 한번 공부를 했다.
파일을 생성하려면 파이썬 내장 함수 open 을 사용한다.
파일객체 = open(파일이름, 파일열기모드)
파일열기모드
엑셀과 같은 행렬(matrix) 구조의 데이터를 표현/저장하기 쉽게 정해놓은 포멧이다. .csv 라는 확장자를 가진 텍스트 파일.
파이썬에 기본으로 내장되어 있는 csv 모듈을 import 해야 한다. 읽을 파일을 csv.reader(파일)
의 형식으로 만들면 된다. csv.reader() 함수는 Iterator 타입인 객체를 리턴하므로 for 루프를 돌며 한 라인씩 가져올 수 있다. 이때 리턴되는 각 라인은 컬럼들을 나열한 리스트(list) 타입이다.
쓰기 모드로 오픈하고 csv.writer(파일)
의 형식을 만들면 된다. CSV writer 는 writerow() 라는 메소드를 통해 list 데이터를 한 줄 추가하게 된다.
❗️ .text & .content
.text : 진짜 string 문자
.content : 유니코드 형식의 문자
이미지를 가지고 오려면 이미지는 숫자로 이루어져 있는 데이터인데, 유니코드로는 표현이 되지만 일반 string 으로는 표현이 안된다. 따라서 .content 를 하면 현재 페이지의 이미지이든 영상이든 가져올 수 있다. 하지만 크롤링을 할때는 실제 이미지 파이리 아니라 이미지의 주소를 참고해서 보여주기 때문에 굳이 .content를 쓰지 않고 .text를 쓴다.
이게 제일 기본 코드이다. 보그 코리아의 fashion 카테고리의 html들이 다 가져와진다.
print(soup.p)
첫 번째 p 태그를 찾아준다.
print(soup.p.string)
첫 번째 p 태그에서 태그 속성들을 제외한 그 안에 있는 text 만 찾아준다.
print(soup.h1)
h1 태그를 찾아준다.
⭐️ 태그는 보통 트리구조로 되어 있기 때문에 하위 항목을 뽑아오고 싶다면 .children
을 사용한다.
for child in soup.ul.children:
print(child)
⭐️ 반대로 상위 항목을 가져오고 싶다면 .parents
를 사용하면 된다.
find_all
print(soup.find_all('h2')
h2 태그를 모두 찾고 싶다면 위와 같이 실행한다. 결과 값을 리스트로 돌려준다.
find_all 은 정규식, html 속성, 함수 등을 사용해 원하는 부분을 추출할 수 있다.
# 정규식 이용
print(soup.find_all(re.compile('[ou]l')))
# ol,ul 리스트를 긁어오고 싶을 때
print(soup.find_all(re.compile('h[1-9]')))
# 헤딩만 전부 긁어오고 싶을 때
# html 속성 활용 / 딕셔너리 형태로 attrs 파라미터 지정, 속성 여러개 지정도 가능
print(soup.find_all(attrs={'class':'fusion-row'}))
# 클래스 fusion-row 를 포함 하위항목까지 다 긁어온다
find & find_all
두개의 차이는 하나만 찾느냐 모두 다 찾느냐이다. find를 이용하면 제일 앞에 있는 하나만 찾고, find_all 을 이용하면 전부 찾아서 list 형태로 저장한다.
선택자 이용하기
print(soup.select('복사해온선택자'))
이렇게 출력하게 되면 태그들까지 같이 나온다. 만약에 태그들을 지우고 내용만 뽑고 싶다면
foo = soup.select('복사해온선택자')
print(foo[0].text)
이렇게 하면 선택자에 해당하는 list 중 첫번째 내용이 출력된다. 전체 코드를 한줄씩 깔끔하게 출력하고 싶다면 for 문을 이용한다.
foo = soup.slect('복사해온선택자')
for i in foo:
print(i.text)