ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python]동적 페이지 크롤링(스크래핑) with BeautifulSoup & fake_useragent
    programming/python 2022. 7. 11. 23:33

    1.동적 페이지 & 정적 페이지란?

      1)정적 페이지 : 서버에 미리 저장된 파일(HTML, IMG, JS)등이 그대로 전달되는 페이지

      2)동적 페이지 : 서버에 있는 데이터들을 가공 처리한 후 생성되어 전달되는 페이지를 말합니다.

    2.데이터가 동적인지 정적인지 어떻게 알까요?

      1)간단하게 말해서 개발자 도구를 열어서 Network 탭에 들어가서 상단에 있는 html 문서에서 찾아보고 없다면 동적 데이터가 되겠습니다.

      2)예시

       저는 실시간 검색어의 데이터를 얻기 위해서 네이트(www.nate.com)를 예시로 들겠습니다.

     

    검색 결과 1위 - 10위까지 있어야 하는데 1위 - 5위까지만 나와있는 것을 볼 수 있었습니다. 

     

     

    3. 데이터 위치 찾기

    데이터를 찾기 위해서는 network 탭에서 찾으시면 되는데,  json 파일을 위주로 찾아보시면 보다 쉽게 찾을 수 있을 겁니다.

    Preview 탭에 들어가면 데이터를 보다 보기 좋게 정리해 주기 때문에 활용을 추천드립니다.

     

     

    4. 파일의 요청 url 확인 및 referer 확인하기

    우리가 찾은 파일을 얻기 위해 어디에 요청해야 하는 찾아야 할 필요가 있습니다.

    url은 왜? 그 데이터의 위치(주소)를 알아야 가져올 수 있습니다.

    referer이란?

    더보기

     referer현재 요청을 보낸 페이지의 절대 혹은 부분 주소를 말합니다.

    referer은 왜? 본인의 페이지에서 요청한 것이 아니라면 접근이 제어될 것입니다.

    5. fake_useragent 설치

    pip install fake-useragent

     

    6. 코드 작성하기

    import json
    import urllib.request as req
    from fake_useragent import UserAgent
    
    ua = UserAgent()
    
    #시도해 보세요
    # print(ua.random)
    
    headers = {
        'User-agent' : ua.chrome,
        'referer': 'https://www.nate.com/'
    }
    url = 'https://www.nate.com/js/data/jsonLiveKeywordDataV1.js?'
    
    # 요청할url에 우리의 가짜 정보를 header에 넣어 열어주는 것 입니다.
    res = req.urlopen(req.Request(url, headers=headers)).read().decode("euc-kr")
    print(res)

    7. 입맛에 맞게 데이터 정제하기

    제가 가져온 데이터는 리스트 형태로 보이지만 str로 넘어왔습니다. 검색을 통해 list로 만들어 볼 수 있겠지만 

    연습도 될 겸 만들었습니다.

    def str_to_list(arg):
        li = []
        num = 0
        source = ''
        for i in arg:
            if num == 1:
                source += i
            if i == '"':
                num += 1
            if num == 2:
                li.append(source[:-1])
                source = ''
                num = 0
        return li
    
    def fiter(x:list):
        li = []
        n = 0
        for i in range(len(x)):
            if i == 5*n+1:
                li.append(x[i])
                n+=1
        return li
    
    for i in fiter(str_to_list(res)):
        print(i)
        print(f'https://new.nate.com/search?q={i}')

     

    댓글

Designed by Tistory.