TIL#55 PYTHON Web Crawling

dnpxm387·2020년 9월 5일
0

html

목록 보기
4/6

WEB CRAWLING (웹 크롤링)

인터넷에 있는 정보 중 원하는 것만 골라서 자동으로 수집해주는 기능이다. 정보를 가져오려는 사이트를 불러와서 그 사이트에서 원하는 원하는 정보를 찾고 그 정보를 가져오게 하는 코드를 작성하면 된다. 각 프로그래밍 언어마다 크롤링을 할 수 있는 라이브러리들이 있는데 파이썬에서는 BeautifulSoup이라는 라이브러리를 쓴다.

# 다른 버전과의 충돌 방지를 위해 가상 환경 설치 및 실행 후
# BeautifulSoup 설치
$ pip install beautifulsoup4

# 
$ pip install request # 웹사이트로 요청을 할 때 필요하여 설치해야 함

크롤링을 해서 그 결과를 파일에 넣고 저장하려면 파이썬에서 파일생성 및 저장, 종료 등을 실행해야 한다. 파이썬을 공부할 때 그 부분은 제대로 안하고 건너뛰었었기 때문에 다시 한번 공부를 했다.

파일

파일을 생성하려면 파이썬 내장 함수 open 을 사용한다.

파일객체 = open(파일이름, 파일열기모드)

파일열기모드

  • r : 읽기모드 - 파일을 읽기만 할 때
  • w : 쓰기모드 - 파일에 내용을 쓸 때
  • a : 추가모드 - 파일의 마지막에 새로운 내용을 추가시킬 때
  • r+ : 읽기 or 쓰기 모드 - 파일이 없으면 에러 발생
  • w+ : 읽기 or 쓰기 모드 - 파일이 없으면 생성
  • a+ : 읽기 or 추가 모드 - 파일이 없으면 생성

CSV 파일

엑셀과 같은 행렬(matrix) 구조의 데이터를 표현/저장하기 쉽게 정해놓은 포멧이다. .csv 라는 확장자를 가진 텍스트 파일.

CSV 파일 읽기

파이썬에 기본으로 내장되어 있는 csv 모듈을 import 해야 한다. 읽을 파일을 csv.reader(파일) 의 형식으로 만들면 된다. csv.reader() 함수는 Iterator 타입인 객체를 리턴하므로 for 루프를 돌며 한 라인씩 가져올 수 있다. 이때 리턴되는 각 라인은 컬럼들을 나열한 리스트(list) 타입이다.

CSV 파일 쓰기

쓰기 모드로 오픈하고 csv.writer(파일) 의 형식을 만들면 된다. CSV writer 는 writerow() 라는 메소드를 통해 list 데이터를 한 줄 추가하게 된다.

BeautifulSoup

❗️ .text & .content
.text : 진짜 string 문자
.content : 유니코드 형식의 문자
이미지를 가지고 오려면 이미지는 숫자로 이루어져 있는 데이터인데, 유니코드로는 표현이 되지만 일반 string 으로는 표현이 안된다. 따라서 .content 를 하면 현재 페이지의 이미지이든 영상이든 가져올 수 있다. 하지만 크롤링을 할때는 실제 이미지 파이리 아니라 이미지의 주소를 참고해서 보여주기 때문에 굳이 .content를 쓰지 않고 .text를 쓴다.

BeautifulSoup 연습


이게 제일 기본 코드이다. 보그 코리아의 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)
profile
개발자꿈나무🌲

0개의 댓글