<5주차_3일> urllib와 BeautifulSoup 를 배워보자.

Nary Kim·2023년 6월 2일
0
post-thumbnail

1. urllib

url을 통해서 페이지를 열때 필요한 모듈이다. 보통은 urlopen, Request를 import하지만, 주소에 한글이 있을 경우 그것을 디코더 하기 위해서 urllib자체를 import한다.

  • Request : 데이터를 보낼 때, 인코딩하여 바이너리 형태로 보낸다. 없는 페이지를 요청해도 에러를 띄운다.
    • req = Request(url,headers={"User-Agent": "Chrome"})
    • 원래는 "Chrome" 대신에 실제 접속하는 환경을 적어서 넣어주는 것이 정석이다.
      • 항상 그 형식을 만들기는 힘들기 때문에 fake_useragent를 이용하여 만들어준다.
  • urlopen : 주소값을 넣어주면 그 주소의 페이지값을 가져온다.
  • status : url이 제대로 되었다면 200을 반환하고 아니면 다른 숫자를 반환한다. 그러므로 접속에서 오류가 날 경우 번호를 찾아서 무슨 오류인지 파악할 수 있다.

< 한글주소가 있는 url 디코더 후 페이지 정보 가져오기 >

import urllib
from urllib.request import urlopen, Request
from bs4 import BeautifulSoup

html = "https://ko.wikipedia.org/wiki/{search_words}"
# https://ko.wikipedia.org/wiki/여명의_눈동자
req = Request(html.format(search_words=urllib.parse.quote("여명의_눈동자"))) # 글자를 URL로 인코딩

response = urlopen(req)
response.status

soup = BeautifulSoup(response, "html.parser")

< User Agent의 예시 >

#pip install fake_useragent

from urllib.request import Request, urlopen
from fake_useragent import UserAgent
from bs4 import BeautifulSoup

url_base = "https://www.chicagomag.com/"
url_sub = "chicago-magazine/november-2012/best-sandwiches-chicago/"

url = url_base + url_sub
ua = UserAgent() # user-Agent 에 넣을 내용을 랜덤하게 만들어준다.

req = Request(url,headers={"User-Agent": ua.ie}) 
html = urlopen(req)
soup = BeautifulSoup(html, "html.parser")
print(soup.prettify)

2. BeautifulSoup

태그들로 이루어진 정보들 속에서 내가 원하는 부분을 가져오기 쉽게 도와주는 모듈이다. bs4에 들어있는 BeautifulSoup을 import한다.

  • soup.prettify : html의 구조를 파악하기 쉽게 들여쓰기, 줄바꿈 등을 이용해 바꿔준다.
  • soup.태그이름 : 태그에 해당하는 내용을 반환한다.
  • soup.태그이름.name : 태그의 이름을 반환한다.
  • soup.태그이름.string : 태그 안에 있는 문자열을 반환한다.
  • soup.태그이름[class] : 태그의 클래스값을 반환한다.
  • .get_text() : html형식에서 텍스트를 반환한다.
  • soup.find, soup.select_one : 찾기원하는 태그 중에서 제일 처음에 있는 태그 내용을 반환한다.
  • soup.find_app, soup.select : 찾기원하는 태그를 모조리 찾아서 리스트 형태로 반환한다.
  • find에서는 먼저 태그이름을 넣고 찾길 원하는 세부 사항을 딕셔너리 형식으로 넣어주면 찾아준다. id="", class_="" 등을 이용하여 찾을 수도 있다.
tmp_one.find(class_="sammyRank").get_text()
tmp_one.find("div",{"class":"sammyListing"}).get_text().
tmp_one.find("a")["href"]
  • select에서는
    • 태그이름
    • .클래스이름
    • #아이디이름
    • 상위태그 > 자식태그 > 자식태그
    • 상위태그 자손태그
      형식을 사용하여 원하는 부분을 가져온다.
a = soup.select_one("#mw-content-text > div.mw-parser-output")
profile
나는 무엇이 될것인가!!

0개의 댓글