티스토리 뷰

어떤 서비스에서 API를 제공해주지 않으면 해볼만한게 크롤링입니다.

파이썬과 BeautifulSoup을 이용합니다. 그리고 Web page를 호출하기 위해서 requests를 이용합니다.

BeautifulSoup

우리가 크롤링을 하기 위해서는 Tag안에 Tag안에 Tag안에...

이렇게 구조를 가지고 계속 파고 들어서 무언가의 유의미한 값을 찾아야 합니다.

그러나 이러한 구조를 찾아주는 라이브러리가 없다면 굉장히 힘들게 파싱을 해야하겠죠.

find를 쓰던지 등등... BeautifulSoup은 이런 HTML 문서를 아름답게 정리된 상태로 변환하여 주는 라이브러리입니다.

만들어 봅시다.

python을 처음부터 구성하는 부분은 생략을 하도록 하겠습니다.

requests를 가져와서 사용하기 위해서 다음과 같이 합니다.

$ pip install requests

그리고 def같은 function 안에서 다음을 호출하여 주도록 합니다.

def get_html(url):
    resp = requests.get(url, headers=headers)
    if resp.status_code == 200:
        _html = resp

    return _html

그러면 사용하려고 하는쪽에서 html을 불러와서 그대로 text로 사용을 할 수 있습니다.

def work():
    html = get_html('YOUR-URL')
    soup = BeautifulSoup(html.text, 'html.parser')
    ...
    

find를 이용하여 찾기

찾는데 두가지 방법이 있습니다. select와 find...

find를 먼저 알아보도록 할게요.

result = soup.find('p')
result = soup.find(class_='name')
result = soup.find(attrs = {'class': 'name')
result = soup.find('p', class_='name')

딱 보면 느낌이 거의 오실겁니다.

1줄은 p tag를 찾는거고

2줄은 class 이름으로 찾기

3줄은 attrs중에 class 이름으로 찾기

4줄은 p tag중에 class 이름으로 찾기

 

이렇게 찾아내고 사용 방법

# tag의 이름을 표시
result.name
# tag의 값
result.text
# tag의 속성과 속성값 eg. {'class': ['name]'}
result.attrs

find_all도 있는데 이건 array로 return 하여 주는 형태입니다.

select를 이용하여 찾기

# tag로 찾기
soup.select_one('p')

# class 이름으로 찾기
soup.select_one('.name')

# tag.class이름으로 찾기
soup.select_one('p.name')

# id로 찾기
soup.select_one('#name') 

# tag#id로 찾기
특정 soup.select_one('p#name')

# tag.class#id로 찾기
soup.select_one('p.name#name')

뭔가 find와 select가 비슷하지 않나요?

select를 이용하면 문장을 그냥 다 붙여서 쓸수 있고. 크롬 개발자 모드에서 copy selector로 그냥 복사해서 붙여 넣어도 되서 타이핑하는데 눈이 아플 필요가 없습니다.

 

즉! 다음과 같이 값을 찾아서 쓸수 있습니다.

result = soup.select('#area > lu > li')

select를 쓰는게 수행시간하고 메모리도 덜 사용한다고 하니 필요하면 사용해 보도록 합시다.

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함