배고픈 개발자 이야기

[2021/07/12] 파이썬 기초 (가변인자, BS4크롤링) 본문

인포섹 아카데미

[2021/07/12] 파이썬 기초 (가변인자, BS4크롤링)

이융희 2021. 7. 12. 10:23
728x90

- 가변인자

https://velog.io/@suasue/Python-%EA%B0%80%EB%B3%80%EC%9D%B8%EC%9E%90args%EC%99%80-%ED%82%A4%EC%9B%8C%EB%93%9C-%EA%B0%80%EB%B3%80%EC%9D%B8%EC%9E%90kwargs

 

Python | 가변인자(*args)와 키워드 가변인자(**kwargs)

패킹 / 언패킹 / 위치 인자와 시퀀스 언패킹 사용하기 / 가변인자(*args) 만들기 / 키워드 인자와 딕셔너리 언패킹 사용하기 / 키워드 가변인자(**kargs) 만들기

velog.io

위의 링크에 정리가 정말 잘 되어 있다.

 

numbers = 1, 2, 3, 4, 5 # 왼쪽과 같이 대입하면 튜플 변수가 생성된다 
# (1, 2, 3, 4, 5)

a, b, c, d, e = numbers # 각각 변수에 하나씩 할당
a, _, _, d, _ = numbers # 불필요한 부분 언더바로 제외하고 할당 a = 1, d = 4

# 가변인자를 활용하여 변수 할당
a, b, *rest = numbers # [3, 4, 5] list
a, *rest, b = numbers # [2, 3, 4] list

 

- 가변인자 (*args) 만들기

 

여기서 *y는 unpacking을 할 때 붙는 기호로 사용된다. (리스트 -> 튜플)

def print_numbers(*args):
  print("args = ", args)
  for arg in args:
    print("=" * 100)
    print("arg = ", arg)
    print("=" * 100)

  print("$" * 100)
  
  
  y = [10, 20, 30, 40]
  
  print_numbers(*y) # == print_numbers(10, 20, 30, 40)

 

위의 *로 list를 unpacking하는것 마냥 아래에선 **y를 통해 dictionary를 unpacking 한다.

def personal_info(**kwargs):
  print("kwargs = ", kwargs)
  for key, value in kwargs.items():
    print("=" * 100)
    print("key = ", key)
    print("value = ", value)
    print("=" * 100)
  print("$" * 100)
personal_info(hobby='게임', first_name='길동', last_name='홍', national='한국')
y= {"job" : "회사원", "company":"SK Infosec", "salary":"40000"}
personal_info(**y)

 

 


 

 

- 크롤링 (웹)

 

pip install beautifulSoup4

 

import urllib.request

response = urllib.request.urlopen("https://www.naver.com")
response.read()
# html read

mem = urllib.request.urlopen("https://t1.daumcdn.net/cfile/tistory/9982424C5F56648032").read()
# image read

with open("mem고양이.jpg", mode="wb") as f:
    f.write(mem)
# image save

 

site_source(HTML 태그)에서 원하는 내용을 꺼내주는 BeautifulSoup 객체 만들어줌

site_source = """
      <html>
        <body>
          <h1>스크래핑이란?</h1>
          <p>원하는 부분 추출하는것</p>
        </body>
      </html>
      """

 

객체로 원하는 태그의 값들을 여러 형태로 불러올 수 있다. (1번째 방법)

from IPython.core.display import display, HTML
display(HTML(site_source)) # 사이트 화면 표출

import bs4
soup = bs4.BeautifulSoup(site_source, "html.parser")
soup.h1
soup.h1.string
soup.body

 

sample HTML

page_source = """
              <html>
                <body>
                  <h1 id="title1">스크래핑이란?</h1>
                  <p id="body1">웹페이지를 분석하는것</p>
                  <p>원하는 부분을 추출 하는것</p>
                  <h1 id="title2">제목2</h1>
                  <p id="body2">본문2</p>
                  <p>본문3</p>
                </body>
              </html>
              """

 

id find test

soup = BeautifulSoup(page_source, "html.parser")
soup.find(id="title1")
soup.find(id="title1").string
soup.find(id="body1")
soup.find(id="body1").string

 

 

sample HTML

page_source = """
              <html>
                <body>
                  <span>난 span</span>
                  <ul class="greet">난 ul 글씨여
                    <li>hello</li>
                    <li>bye</li>
                    <li>welcome</li>
                  </ul>
                  <ul class="reply">
                    <li>ok</li>
                    <li>no</li>
                  </ul>
                  <div>
                    <ul>
                      <li>open</li>
                      <li>close</li>
                    </ul>
                  </div>
                </body>
              </html>
              """

 

tag find 및 전체 태그 검색

soup = BeautifulSoup(page_source, "html.parser")
soup.find('div')
ls = soup.find('ul')
ls.text
print(ls.text) # 예쁘게 출력
soup.find("ul") # 첫번째 태그를 찾음
soup.find("ul").text
soup.find("span").string
soup.findAll("li") # 모든 li태그 찾아서 리스트에 담아서 리턴

for item in soup.findAll("li"):
  print("=" * 100)
  print("item = ", item)
  print("item.string = ", item.string)
  print("item.text = ", item.text)
  print("=" * 100)

 

reply class 하위에 있는 li tag만 찾는 방법

ul_reply = soup.find("ul", {"class":"reply"})
ul_reply.findAll("li")

 

네이버 nav_list 목록 긁어오기

 

화면에 개발자도구(F12 활성화 후) 원하는 위치(우클릭)의 태그 가져오기

##NM_FAVORITE > div.group_nav > ul.list_nav.type_fix

 

긁어오는 파이썬 코드

response = urllib.request.urlopen("https://www.naver.com") # 네이버에 urlopen 요청보내 데이터 받기
soup = BeautifulSoup(response, "html.parser") # bs4로 받은데이터 parsing 하기
list_nav = soup.find("ul", {"class":"list_nav"}) # 해당 위치의 상위 태그 클래스 찾기

for item in list_nav.findAll("li"): # 하위 태그 목록 모두 긁어와 아래와 같이 출력하기
  print("=" * 100)
  print("item.text.strip() = ", item.text.strip())
  print("=" * 100)

결과

더보기

==================================================================================================== item.text = 메일 ==================================================================================================== ==================================================================================================== item.text = 카페 ==================================================================================================== ==================================================================================================== item.text = 블로그 ==================================================================================================== ==================================================================================================== item.text = 지식iN ==================================================================================================== ==================================================================================================== item.text = 쇼핑 ==================================================================================================== ==================================================================================================== item.text = 쇼핑LIVE ==================================================================================================== ==================================================================================================== item.text = Pay ==================================================================================================== ==================================================================================================== item.text = TV ====================================================================================================

Comments