Python으로 웹스크래핑하기(Web Scraping with Python)

World Wide Web(WWW)

  • URL로 구분된 하이퍼텍스트(Hypertext)를 공유하는 정보의 공간
    • text: 텍스트는 이렇게 생겼구요
    • Hypertext: 하이퍼텍스트는 이렇게 생겼답니다.

HTTP(HyperText Transfer Protocol)

  • 하이퍼텍스트를 주고 받기 위한 서로간의 약속

HTML (HyperText Markup Language)

  • 웹 문서에 구조를 만드는 언어
  • css 를 사용하여 스타일을 입히고, Javascript를 사오요하여 동적인 움직임을 추가할 수 있음.
  • 텍스트로된 HTML + CSS + Javascript가 브라우저를 거쳐 우리가 보는 이쁘게 렌더링된 화면으로 전환됨.

HTML tag

<TagName> Content </TagName>
  • 제목, 본문, 리스트, 이미지 첨부 등 문서 구조를 표현하는 기능을 합니다.
  • TagName은 규격화되어 있습니다.
  • 보통 여는태그와 닫는태그로 되어있습니다.

HTML Class

<TagName1 class='myClass'> first Content </TagName1>
<TagName2 class='myClass'> second Content </TagName2>
  • 여러 Tag혹은 하나의 Tag를 특정 Class이름으로 그룹화할수 있습니다.

HTML ID

<TagName id='myid'> Content </TagName>

특정 Tag에 id를 부여합니다.
id이름은 전체 문서에서 유일해야합니다.

기본 HTML 구조

<!doctype html>
<html>
  <head>
    <title>Hello HTML</title>
  </head>
  <body>
    <p>Hello World!</p>
  </body>
</html>

Web Crawling

  • 웹을 자동으로 탐색하며 구조화된 정보(xml, html 등)을 수집하는 일

Web Scraping

  • 웹에 게시된 문서를 수집하는 행위

Requirements

  • Python으로 웹 스크래핑을 하기 위해 필요한 라이브러리를 알아봅시다.

requests

  • Python에서 웹 서버에 요청을 보내고 응답을 받는 행위와 관련된 라이브러리
  • pip install requests

beautifulsoup

  • 요청을 통해 받은 응답을 분석하여 원하는 값을 얻을 수 있도록 도와주는 라이브러리
  • pip install beautifulsoup4

BeautifulSoup 기본 사용법

>>> from bs4 import BeautifulSoup as bs
>>> result = bs(response.text, 'html.parser')


>>> result.find('태그이름')
    # 해당 태그를 가진 첫번째 요소를 반환

>>> result.findAll('태그이름')
    # 해당 태그를 가진 모든 요소를 list로 반환

>>> result.find('태그이름', {'class': 'className'})    
    # 해당 태그중 해당 클래스이름을 가진 첫번째 요소를 반환, id도 사용가능, class와 id동시 사용 가능

>>> result.find('태그이름').text
    # 해당 태그를 가진 첫번째 요소에 태그안에 텍스트를 반환

추가 과제 1.

박스오피스 정보 긁어내기

rottenchart.py

import requests # 요청을 보내기 위한 requests
from bs4 import BeautifulSoup # 응답을 분석하기 위한 BeautifulSoup

# url에 요청을 보낼 주소를 지정하고 requests로 요청을 보내 그 응답을 response에 저장합니다.
url = "https://www.rottentomatoes.com/"
response = requests.get(url)

# 응답 결과로 받은 html을 BeautifulSoup으로 분석합니다.
html = response.text
soup = BeautifulSoup(html, "html.parser")
# html 전체 중 id가 일치하는 table 태그를 선택합니다.
table = soup.find("table", attrs={"id":"Top-Box-Office"})
# table에서 모든 tr태그를 찾아냅니다.
all_tr = table.find_all("tr")
# tr태그 리스트 요소를 반복시키면서 td > span 의 텍스트를 추출해 score와 movie_name을 바로 출력합니다.
for tr in all_tr:
    all_td = tr.find_all("td")
    score = all_td[0].find("span", attrs={"class":"tMeterScore"}).text
    movie_name = all_td[1].a.text
    print(score, movie_name)

추가 과제 2.

생활환경안전정보시스템 초록누리 유해화학 물질정보 페이지의 첫페이지에 보이는 화학물질을 크롤링 해보세요!

Sample output

[['번호', 'CAS번호', '영문명', '국문명'],
['52', '1333-82-0', 'Chromic anhydride', '무수 크롬산'],
['51', '1336-21-6', 'Ammonium hydroxide', '암모늄수산화물'],
['50', '110-80-5', 'Ethylene glycol monoethyl ether', '에틸렌 글리콜 모노에틸 에테르'],
['49', '111-30-8', 'Glutaraldehyde', '글루타르알데히드'],
['48', '1341-49-7', 'Ammonium hydrogendifluoride', '이플루오르화암모늄'],
['47', '64-67-5', 'Diethylsulfate', '다이에틸 황산염'],
['46', '108-88-3', 'Toluene', '톨루엔'],
['45', '108-91-8', 'Cyclohexylamine', '사이클로헥실아민'],
['44', '108-95-2', 'Phenol ; Hydroxybenzene', '페놀'],
['43', '109-86-4', '2-Methoxyethanol', '2-메톡시에탄올']]


과제를 성공하셨나요?

코딩 101 참가자 분들 중에서, 과제에 성공하신 후 메일로 보내주세요.
선착순으로 [패스트캠퍼스 스쿨 할인권] 을 드립니다!

results matching ""

    No results matching ""