던전앤파이터/던파 타임라인 훔쳐보기

[웹크롤링] 인터넷에서 캐릭터 정보를 가져오자 - 던파모아 활용(3)

죤씨나 2022. 4. 26. 20:38
from urllib import parse
from urllib.request import urlopen
from bs4 import BeautifulSoup

ADV_SEARCH = "https://dunfamoa.com/characters/adventure?search="
HOMEPAGE_URL = "https://dunfamoa.com" #모험단 검색을 위해 추가한 던파모아 홈페이지의 URL

def urlEncoding(keyword_):
    keyword = parse.quote(keyword_)
    return keyword

if __name__ == "__main__":
    adv_keyword = urlEncoding("말걸면")
    source_code = urlopen(ADV_SEARCH + adv_keyword).read()
    #-----------------던파모아 활용(2)--------------------#

 

 

지난 코드에 이어 진행하도록 하자.

일단 지난 코드에 HOMEPAGE_URL을 추가하고

BeautifulSoup는 우리가 원하는 URL을 탐색(파싱)하기 위해 import하였다.

 

 

    adv_url = []
    soup = BeautifulSoup(source_code, "html.parser")
    tag_a = soup.find('div', class_='Wrapper-sc-1noqpd4-1 gfctoN').find_all('a')

 

우리는 소스 코드 내에서 <a href="주소">가 포함된 모든 문장을 찾을 것이고,

그 문장에서 모험단을 검색하기 위한 주소만을 추출하여 저장할 것이다(adv_url = []).

먼저, source_code에 저장한 문자열로 이루어진 html 정보에 대해 문자열로 파싱한다.

그리고 우리는 지난 글에서 특정 모험단으로 링크시켜주는 주소가

<div class='Wrapper-sc-1noqpd4-1 gfctoN'> 내 존재함을 확인하였다.

그렇기에 우리는 'div'(태그 이름)'Wrapper-sc-1noqpd4-1 gfctoN'(속성(attr) 값)을 특정하여 찾는다(find()).

우리는 주소가 <a href>에 존재함을 알고 있기 때문에 'a'를 특정하여 해당 태그를 모두 찾는다.(find_all()) 

위 사진은 해당 부분(코드 상에서 tag_a에 초기화한 것)을 디버깅한 것으로,

우리가 찾고자 하는 내용이 들어있음을 확인할 수 있다.

 

 

       <div class="Wrapper-sc-jrfk9d-0 bykzDt">
       	<a href="/adventures/
        %EB%A7%90%EA%B1%B8%EB%A9%B4%ED%81%B0%EC%9D%BC%EB%82%98%EC%9A%94" 
        class="Row-sc-jrfk9d-1 hiKazl">...</a>
       	<a href="/adventures/
        %EB%A7%90%EA%B1%B8%EB%A9%B4%EB%92%A4%EC%A7%84%EB%8B%A4" 
        class="Row-sc-jrfk9d-1 hiKazl">...</a>
       	<a href="/adventures/
        %EB%A7%90%EA%B1%B8%EB%A9%B4" 
        class="Row-sc-jrfk9d-1 hiKazl">...</a>
       	<a href="/adventures/
        %EB%A7%90%EA%B1%B8%EB%A9%B4%EA%B3%A0%EB%B0%B1%EA%B0%88%EA%B9%80" 
        class="Row-sc-jrfk9d-1 hiKazl">...</a>

 

html 코드는 앞선 글의 내용을 보충하기 위해 첨부하였다.

<href>속성을 제외하고도 <class> 속성이 존재한다.

 

 

    for value_a in tag_a:
        if 'href' in value_a.attrs and 'class' in value_a.attrs:
            if value_a.attrs['class'] == ["Row-sc-jrfk9d-1", "hiKazl"]:
                adv_url.append(HOMEPAGE_URL + value_a.attrs['href'])
                print(HOMEPAGE_URL + value_a.attrs['href'])

value_a 디버깅

우리는 계속해서 'a'라는 태그, 'href'라는 속성에 주소가 존재함을 인지하고 있다.

위의 디버깅 사진과 같이 value_a의 속성에(value_a.attrs)

'href'와 'class' 속성 두 개가 있는 것을 확인할 수 있다.

 우리는 이제 for문을 사용하여 저장된 각각의 태그 내에서(tag_a)

'href'와 'class' 속성 두 개가 모두 존재하는 태그만을 확인할 것이고

그 태그의 'class' 속성이 우리가 찾으려는

태그의 속성값(["Row-sc-jrfk9d-1", "hiKazl"])과 동일한지 재차 확인하여

맞다면 그 주소를 추출하는 작업을 진행한다.

 

 

출력 결과

 

상기 과정을 통하여 우리는 던파모아 사이트에

"말걸면"이라는 검색어를 입력하여 나오는 계정들을 확인할 수 있는 주소를 확보할 수 있다.

 

 

from urllib import parse
from urllib.request import urlopen
from bs4 import BeautifulSoup

ADV_SEARCH = "https://dunfamoa.com/characters/adventure?search="
HOMEPAGE_URL = "https://dunfamoa.com"

def urlEncoding(keyword_):
    keyword = parse.quote(keyword_)
    return keyword

if __name__ == "__main__":
    adv_url = []
    adv_keyword = urlEncoding("말걸면")
    
    source_code = urlopen(ADV_SEARCH + adv_keyword).read()
    soup = BeautifulSoup(source_code, "html.parser")
    tag_a = soup.find('div', class_='Wrapper-sc-1noqpd4-1 gfctoN').find_all('a')
    for value_a in tag_a:
        if 'href' in value_a.attrs and 'class' in value_a.attrs:
            if value_a.attrs['class'] == ["Row-sc-jrfk9d-1", "hiKazl"]:
                adv_url.append(HOMEPAGE_URL + value_a.attrs['href'])
                print(HOMEPAGE_URL + value_a.attrs['href'])

파이썬 코드 전문

 

다음은 모험단 내 존재하는 캐릭터 이름을 추출해보자.

 

바칼 - 죤씨나