반응형
반응형
# 본 프로그램은 텍스트 데이터를 빈도 분석
# 작성자 이성재
# 프로그램명 Frequency Analysis2.py

from bs4 import BeautifulSoup
import requests
from konlpy.tag import Okt
from collections import Counter
from wordcloud import WordCloud,STOPWORDS
import matplotlib.pyplot as plt

# 네이버 뉴스 검색하는 크롤링
def get_titles(search_word, start_num , end_num):
    title_list = []

    # start_num ~ end_num 까지 크롤링
    while 1:
        if start_num > end_num:
            return title_list
            break
        # print(title_list) 한 페이지에 제목을 한바퀴 돌 때 한 페이지 제목이 다 들어가 있음
        # 두번 돌면 .append 되어가지고 두개에 리스트가 아닌 한개의 리스트에 넣어짐

        url = 'https://search.naver.com/search.naver?where=news&sm=tab_jum&query={}&start={}'\
            .format(search_word,start_num) # 줄바꿈할 떈 이렇게 써야한다
        # print(url)

        req = requests.get(url)

        if req.ok : # .ok 참일시 제대로 URL 주소를 가져왔을 때
            html = req.text
            soup = BeautifulSoup(html, 'html.parser')

            # 뉴스제목 뽑아오기
            titles = soup.select('.news_area a[title]') # class는 앞에 .을 붙힘 .news_area 그 안에 a태그 안에[]는 속성값

            # list에 넣어준다
            for title in titles:
                title_list.append(title.text)
                # print(title.text) # [올림픽] 도쿄 밝힌 희망의 성화…하나될 시간, 스포츠의 이름으로 (종합) ...
        start_num += 10

# 문장을 형태소로 분류
def sentence_tag(title_list):
    okt = Okt()
    sentences_tag = []

    # 형태소 분석하여 리스트에 넣기
    for sentence in title_list : # title_list에서 제목을 받아온 걸 sentence에 하나씩 넣는다
        morph = okt.pos(sentence) # 형태소 분석하는 과정 ('나',Noun)...
        sentences_tag.append(morph) # 형태소 분리한 걸 리스트에 넣음
        # print(morph)
    # print ("sentences_tag = ",sentences_tag) append를 했기 때문에 [[...],[...]] 형식으로 나옴
    return sentences_tag


# 단어별 카운트
def word_count(sentences_tag):
    noun_adj_list = []

    # 명사와 형용사만 구분하여 noun_adj_list에 넣기
    for sentence in sentences_tag :
        for word , tag in sentence: # word는 '도쿄' tag는 'Noun'
            print(word + " " + tag)
            if tag in ['Noun' , 'Adjective']:
                noun_adj_list.append(word) # 명사랑 형용사를 넣는 과정

    # 형태소별 count
    counts = Counter(noun_adj_list)
    # print(counts) # Counter({'aa': 2, 'dd': 1, 'cc': 1, 'bb': 1, 'ee': 1}) 이거처럼 개수를 분류해줌
    tags = counts.most_common() # most_common() 배열로 변환하는 함수
    # print(tags)
    return tags

# 단어별로 카운트된 데이터를 이미지화
def wordCloud_Image(word_count_list):

    # wordCloud 생성 (한글 폰트중 일부는 지원 않되는 것이 있음)
    wc = WordCloud(font_path="C:/Winodws/Fonts/batang.ttc", background_color = 'white', width = 800, height = 600)
    # 이미지할 때 필요한 설정 어떤 폰트로 어떤 바탕화면으로 어떤 크기로 할지
    counts = (dict(word_count_list)) # 배열로 만든 걸 사전형으로 변환
    # print(counts)

    cloud = wc.generate_from_frequencies(counts)
    plt.figure(figsize=(10,8))
    plt.axis('off')
    plt.imshow(cloud)
    plt.show()

title_list  = get_titles("올림픽",1, 200)
sentences_tag = sentence_tag(title_list)
word_count_list = word_count(sentences_tag)
wordCloud_Image(word_count_list)

뉴스기사를 타이핑해서 빈도분석을 해 가장 관심을 두는게 뭔지 알아보도록 하려고 합니다.

 

BeautifulSoup으로 뉴스 제목을 파싱합니다 titles = soup.select('.news_area a[title]')에서 내용이 제목에 해당하기 때문에 파싱을 이렇게 했습니다 그 후 리스트에 제목들을 담습니다.

 

리스트에 담은 제목들을 이제 형태소 분석을 합니다.

 

  • morph = okt.pos(sentence)
    • Okt()라는게 있는데 전에 했던 Twitter()랑 동일합니다.

 

for sentence in sentences_tag :
    for word , tag in sentence: # word는 '도쿄' tag는 'Noun'
        print(word + " " + tag)
        if tag in ['Noun' , 'Adjective']:
            noun_adj_list.append(word) # 명사랑 형용사를 넣는 과정

이제 형태소 분석한 거 중에서 명사와 형용사만 빼내오려고 합니다 tag에는 형태소들이 들어가 있습니다. 거기에서 Noun(명사)와 Adjective(형용사)가 있으면 리스트에 담는 과정입니다.

 

  • counts = Counter(noun_adj_list)
    • 담아둔 리스트의 빈도분석을 실행합니다.

 

wc = WordCloud(font_path="C:/Winodws/Fonts/batang.ttc", background_color = 'white', width = 800, height = 600)
# 이미지할 때 필요한 설정 어떤 폰트로 어떤 바탕화면으로 어떤 크기로 할지
counts = (dict(word_count_list)) # 배열로 만든 걸 사전형으로 변환
# print(counts)

 

WordCloud로 빈도분석한 걸 이미지화 하도록 하겠습니다 font_path에다가는 저장되어 있는 Font를 경로 잡아주시면 되겠습니다. (지원 안 되는 폰트도 있음) background_color 바탕색을 의미하고 width, height로 넓이를 지정할 수 있습니다.

 

    cloud = wc.generate_from_frequencies(counts)
    plt.figure(figsize=(10,8))
    plt.axis('off')
    plt.imshow(cloud)
    plt.show()

이거는 그냥 그대로 입력하시면 됩니다. (저도 잘 모르겠습니다. ㅠ)

 

그럼 이런식으로 나오게 됩니다.

반응형
반응형

 

https://www.lfd.uci.edu/~gohlke/pythonlibs/#jpype 에서 JPype1-1.2.0-cp38-cp38-win_amd64.whldownload합니다. (최신버전 있으면 써도 상관 없습니다.)

파이참에서 Teminal로 들어가 설치해줍시다.

  • pip install JPype1-1.2.0-cp38-cp38-win_amd64.whl
  • pip install konlpy

 

주의할 점은 다운 받은 파일하고 Teminal 경로하고 같아야합니다 저는 이미 깔려있어가지고 저 모양인 거지 경로를 일치시켜주세요

 

# 본 프로그램은 텍스트 데이터를 빈도 분석하기 전 기초편입니다.
# 작성자 이성재
# 프로그램 wc_base03.py
# 코엔엘파이 라이브러리는 다른 라이브러리에 비해 설치가 조금 까다로운 편이며
# 설치가 정사적으로 되었으면 형태소 분리를 테스트한다.

from konlpy.tag import Twitter
twitter = Twitter()

sentance = '아버지가 방에 들어 가신다.'
tagging = twitter.pos(sentance)
print(tagging)
'''
출력 : 
[('아버지', 'Noun'), ('가', 'Josa'), ('방', 'Noun'), ('에', 'Josa'), ('들어', 'Verb'), ('가신다', 'Verb'),
 ('.', 'Punctuation')]
'''

# 단어 뭉치가 리스트(배열)로 들어있을 경우
title_list = [
    '인천시 연수구 , 을 강연 ICLC 성공개최..지역 10개 대학 간담회',
    '인천일보 대표 고통안전 챌린지 동참',
    '안산대, 2021년도 인천 경기북부 총장협의회 개최'
]

twitter = Twitter()
sentences_tag = []
# 형태소 분석하여 리스트에 넣기
for sentence in title_list :
    word = twitter.pos(sentence)
    sentences_tag.append(word)
    print(word)
'''
출력 : 
[('인천', 'Noun'), ('시', 'Noun'), ('연수구', 'Noun'), (',', 'Punctuation'), ('을', 'Josa'), ('강연', 'Noun'),
 ('ICLC', 'Alpha'), ('성공', 'Noun'), ('개최', 'Noun'), ('..', 'Punctuation'), ('지역', 'Noun'), ('10', 'Number'),
 ('개', 'Noun'), ('대학', 'Noun'), ('간담', 'Noun'), ('회', 'Noun')]
[('인천', 'Noun'), ('일보', 'Noun'), ('대표', 'Noun'), ('고통', 'Noun'), ('안전', 'Noun'), ('챌', 'Verb'), ('린지', 'Noun'),
 ('동참', 'Noun')]
[('안산대', 'Noun'), (',', 'Punctuation'), ('2021년', 'Number'), ('도', 'Foreign'), ('인천', 'Noun'), ('경기', 'Noun'),
 ('북부', 'Noun'), ('총장', 'Noun'), ('협의', 'Noun'), ('회', 'Noun'), ('개최', 'Noun')]
'''

Twitter()에 해당하는 객체를 만들어줍니다 twitter.pos(형태소 분석할 문장) 이러면 알아서 분류해줍니다

반응형
반응형

📝동적 크롤링

동적인 데이터를 수집하는 방법을 말한다.

동적인 데이터란 입력, 클릭, 로그인 등과 같이 페이지 이동이 있어야 보이는 데이터를 말한다.

정적크롤링 수집하는 속도가 느리다는 단점이 있지만 더 많은 정보를 수집할 수 있다는 장점

 

 

셀레니움이라는 것을 사용하여 동적 크롤링하겠습니다.

일단 Chrome으로 진행해주시고 Chromdriver라는게 필요합니다.

 

https://sites.google.com/chromium.org/driver/downloads

 

ChromeDriver - WebDriver for Chrome - Downloads

Current Releases If you are using Chrome version 92, please download ChromeDriver 92.0.4515.43 If you are using Chrome version 91, please download ChromeDriver 91.0.4472.101 If you are using Chrome version 90, please download ChromeDriver 90.0.4430.24 If y

sites.google.com

여기에서 다운 받아주세요 버전은 최신 버전으로 다운 받아주세요

 

내가 쓰는 Chrome 버전하고 호환이 되어야합니다. 따로 확인하는 법은 잘 모르겠고 밑에 코드 돌려서 에러 나오면 버전이 안 맞다고 하니까 그 버전으로 바꿔주시면 되겠습니다.

# 본 프로그램은 동적인 웹페이지를 크롤링하는 프로그램입니다.
# 작성 시작일 2021. 04. 16
# 수정일 2023.06.14 Selenimum Version 변경으로 인한 수정
# 작성자 이성재
# Selenium.py
# Python 3.11 Selenium 4.1.0, Chrom Version 114

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service as ChromeService
import time
import urllib.request

# 크롬 열고 검색하기
path = "C://chromedriver/chromedriver.exe" # 웹 드라이버가 있는 경로

options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)
service = ChromeService(executable_path=path)
driver = webdriver.Chrome(service=service, options=options)

driver.get("https://www.google.co.kr/imghp?hl=ko") # 구글 이미지 메인 페이지
elem = driver.find_element(By.NAME, 'q') # driver.find_element_by_name("q") # 검색 부분에 name이 q이다
elem.send_keys("배우") # 검색하고자 하는 것
elem.send_keys(Keys.RETURN) # 엔터값 전송 크롤링이라는 글자를 입력하고 엔터를 누르는 과정


# 페이지 끝까지 스크롤 내리기
SCROLL_PAUSE_TIME = 1 # 대기시간을 1초로 셋팅

# 스크롤 깊이 측정하기 자바스크립트문을 실행시킴
last_height = driver.execute_script("return document.body.scrollHeight")

while True:
    # 스크롤 끝까지 내리기
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    # 페이지 로딩 기다리기
    time.sleep(SCROLL_PAUSE_TIME)

    # 더 보기 요소가 있을 경우 클릭하기
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        try:
            driver.find_element(By.CSS_SELECTOR, '.mye4qd').click() # 더 보기에 css name이 mye4qd이다
        except:
            break
    last_height = new_height

# 이미지를 찾고 , 다운받기
image_path = "c:/actor/" # 이미지 저장될 경로 설정
images_list = driver.find_elements(By.CSS_SELECTOR, '.rg_i.Q4LuWd') # driver.find_elements_by_css_selector(".rg_i.Q4LuWd")
# class 명이 rg_i Q4LuWd 이지만 .으로 구분하고 css가 2개 적용된 거임 # images_list는 배열이다 즉 여러개 이미지의 정보를 넣는다

count = 1

for image in images_list:

    try :
        image.click() # 크롬 브라우저에서 작은 이미지를 클릭하는 효과와 동일
        time.sleep(2) # 2초 기다린다.


        # f12을 사용하여 개발자모드에서 검사-> copy -> Copy Xpath를 해서 경로를 가지고 온다
        imgUrl = driver.find_element(By.XPATH,"//*[@id=\"Sva75c\"]/div[2]/div/div[2]/div[2]/div[2]/c-wiz/div/div/div/div[3]/div[1]/a/img").get_attribute("src")

        # "" 안에 " 기호를 쓰기위해 \ 로 감싸준다

        # 이미지를 urllib.request를 사용하여 저장
        # xpath 값 ,  저장될 공간 + 크롤링(이름)
        urllib.request.urlretrieve(imgUrl, image_path+"actor" + str(count) + ".jpg")

        count = count + 1

    except Exception as e:
        print("이미지를 저장할 수 없습니다.")
        print(e)
        pass # 에러 발생시 무시하고 계속 진행

# 프로그램 종료
driver.close()

 

  • path = "chromedriver/chromedriver.exe"
    • 다운 받은 chromdriver 있는 경로를 설정해주세요 저는 이 .py있는 곳에 chromedriver라는 폴더에 넣어놨습니다.
  • driver = webdriver.Chrome(path)
    • 경로에 있는 chrome driver를 로드합니다

 

  • elem = driver.find_element_by_name("q")
    • name = "q"라고 되어있는 검색 부분을 가져옵니다.
  • elem.send_keys("배우")
    • send_keys를 통해 driver가 "배우"라는 검색어를 입력하게 합니다.
  • elem.send_keys(Keys.RETURN)
    • Keys.RETURN이라고 넣어주면 엔터를 누르는 과정입니다.
  • SCROLL_PAUSE_TIME = 1
    • 스크롤 Pause 시간
  • last_height = driver.execute_script("return document.body.scrollHeight")
    • chromedriver한테 return document.body.scrollHeight 이러한 스크립트문을 하라고 명령합니다
    • 스크롤바가 있을 때 그 깊이를 측정하는 과정입니다.
  • driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    • 검색시 처음 나오는 화면이 0이고 document.body.scrollHeight(맨 밑)까지 스크롤바를 내리게 합니다.
  • time.sleep(SCROLL_PAUSE_TIME)
    • 대기시간을 1초를 주는 과정입니다.

 

코드는 엄청 빨리실행되는데 반해 검색해서 가려진 이미지들이 다 뜨는데 시간차이가 있기 때문에 그렇습니다.

 

# 더 보기 요소가 있을 경우 클릭하기
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        try:
            driver.find_element(By.CSS_SELECTOR, '.mye4qd').click() # 더 보기에 css name이 mye4qd이다
        except:
            break
    last_height = new_height

new_height에 다시 깊이를 잽니다 밑에 사진의 결과 더보기가 나올때까지 내려가야합니다.

 

 

📝동작과정 요약

  1. 먼저 현재 보이는 부분 깊이를 잽니다(last_height)
  2. 스크롤을 내립니다 (스크롤을 다 내리면 결과 더보기가 먼저 나오지 않고 로딩하면서 좀 더 사진이 나옵니다.)
  3. 거기에 보이는 부분 깊이를 잽니다 (new_height)
  4. new_height랑 last_height값은 다릅니다. 그 후 last_height에 new_height값을 넣어줍니다
  5. new_height는 끝에 도달하지 않는 이상 계속 갱신되니까 if문에 들어가지 않습니다.
  6. new_height 값과 last_height값이 같아진다는 거는 결과 더보기까지 내려갔다는 소리이니까 결과더보기에 해당하는 mye4qd라는 클래스를 가진 버튼을 클릭하게 합니다.

 

 

 

결과 더보기에 대한 class명입니다.

 

  • images_list = driver.find_elements_by_css_selector(".rg_i.Q4LuWd")
    • 이미지에 대한 요소를 저장하는 리스트를 만들어 넣습니다.
    • 사진 class명을 보면 rg_i랑 Q4LuWd라는 클래스를 가집니다.

 

  • image.click()
    • 이미지를 클릭

 

📝Xpath

Xpath는 마크업 언어에서 특정 요소를 찾기 위한 경로(path)를 나타내는 언어입니다. 여기에선 이미지의 실질적 경로를 의미하죠

 

클릭했을때 나오는 사진을 검사를 눌러 나오는 태그오른쪽 클릭 후  Copy - Copy Xpath를 합시다.

 

driver.find_elements_by_xpath로 Xpath값을 넣습니다.

그냥 붙혀넣으면 빨간줄이 생기는데 왜 생기냐면 더블쿼테이션 안에 더블 쿼테이션이 들어가서 그렇습니다.

"를 그냥 문자로 인식하게 하려면 \" 이렇게 쓰면 됩니다 \"가 그냥 " 문자로 표현한다고 생각하면 됩니다.

 

 

실행시키면 C드라이브 actor라는 폴더에 이미지가 저장이 됩니다.

 

반응형
반응형
# 본프로그램은 정적인 웹페이지를 크롤링 하는 프로그램입니다.
# 작성 시작일자 2021. 03. 19
# 작성자 이성재
# 할리스매장 클롤링연습01
# 프로그램명 HollysBeautifulSoup.py
# 첫페이지만 크롤링하는 예제
import requests
from bs4 import BeautifulSoup as bs
import pandas as pd

html = requests.get('http://web.codetector.co.kr:8080/kmview/bigdata01.do')
soup = bs(html.text,'html.parser')

# 크롤링 할 영역을 찾는다
tbody_tag = soup.find('tbody') # tobdy태그에 들어감
print(tbody_tag) # 출력 : <tbody id="data_uniq1"> <tr class="t....

# 반복되는 영역을 찾는다 (findAll로 찾으면 데이터가 배열형태로 저장된다)
tr_tag_list = tbody_tag.findAll('tr') # tr을 전부 찾아서 list에 넣는다
print(tr_tag_list) # 출력 : [<tr class="tr_...   tr_tag값 확인해보기
print(len(tr_tag_list)) # 출력 : 10   tr_tag_list 속에 몇개 인지

# 크롤링한 결과가 최종적으로 저장되는 변수배열
result = []

for tr_tag in tr_tag_list: # tr_tag_list에서 하나씩 순차적으로 값을 꺼내온다.

    # td 태그중에 각각의 영역에 해당하는 데이터를 저장한다.
    zone    = tr_tag.find('td',{'class':'text-center zone'}).text # 지역
    store   = tr_tag.find('td',{'class':'text-center store'}).text # 매장명
    open    = tr_tag.find('td',{'class':'text-center open'}).text # 현황
    address = tr_tag.find('td',{'class':'text-center address'}).text # 주소
    tel     = tr_tag.find('td',{'class':'text-center tel'}).text # 전화번호

    # 각각의 변수에 잘 저장되어 있는지 확인을 해본다
    # print(zone + "," + store + "," + open + "," + address + "," + tel)

    # 변수배열에 순차적으로 저장한다.
    result.append([zone, store , open , address, tel])



# pandas 라이브러리를 이용해 csv파일로 저장
print(result[0]) # 출력: ['서울 서대문구', '신촌점', '영업중', '서울특별시 서대문구 연세로 34 (창천동 31-12)  할리스', '02-393-2004']
# result값이 배열이므로 배열값중 하나(첫번째)를 화면에 표시해본다.
bigdata_table = pd.DataFrame(result, columns=('zone','store','open','address','tel'))
bigdata_table.to_csv("HollysCSV.csv", encoding="utf-8", mode ='w' ,index = True) # ./ 자기 밑에

 

request.get으로 주소를 가져옵니다 그리고 그 주소에 해당하는 HTML태그를 가져옵니다

Tbody태그에 있는 tr줄이 10개 이므로 각각 td와 해당 클래스명으로 접근해서 10번 반복해줍니다.

반복하는 와중에 해당 텍스트값을 빈 리스트에 append해서 여러개 리스트값으로 보관합니다.

 

이제 이걸 csv파일로 저장해보도록하겠습니다.

그걸 위해 필요한게 pandas패키지입니다. import해주세요

 

 

  • bigdata_table =pd.DataFrame(result, columns=('zone','store','open','address','tel'))
  • pd.DataFrame(넣을자료, columns=('각 세로줄 제목들...'))
    • csv파일을 만들 구성입니다

 

  • bigdata_table.to_csv("HollysCSV.csv",encoding="utf-8",mode ='w',index = True
  • to_csv("파일명", encoding="인코딩방식", mode="작성모드", index= = True)
    • table자료를 csv로 변환시키면서 이름을 지어주고 encoding방식 mode는 ='w' write여야 겠죠?
반응형
반응형

파이썬 깔아주시고 IDE는 파이참을 이용하려고 합니다.

 

📝정적크롤링

변하지 않는 데이터를 의미합니다. 즉 한 페이지 안에서 원하는 정보가 모두 드러나는 것을 크롤링하는 것입니다.

 

이 정적 크롤링을 하기 위해서 BeautifulSoup이라는 패키지를 사용하려고 합니다.

import requests
from bs4 import BeautifulSoup as bs

html = requests.get('https://search.naver.com/search.naver?'
                    'sm=tab_hty.top&where=nexearch&query=%EB%82%A0%EC%94%A8&oquery=%EB%'
                    '82%A0%EC%94%A8&tqi=hZrKcsprvOsssQswMTwssssssUh-229279') # 주소를 받는다
soup = bs(html.text,'html.parser') # HTML 소스코드 가져옴

data1 = soup.find('div',{'class':'detail_box'}) # soup의 div라는 태그를 찾고 그 중에서 detai1_box라는 태그를 가져온다
print(data1) # 출력 : <div class="detail_box"> <dl class="indicator"> <dt>....

data2 = data1.findAll('dd') # 가져온 것중에서 dd태그를 다 가져온다 (리스트로 담김)
print(data2) # 출력 : [<dd class="lv2"><span class="num">48㎍/㎥</span>보통<span class="ico"></span></dd>, <dd cla

dust01 = data2[0].find('span',{'class':'num'}).text # dd태그 중에서 span이란 태그를 찾고 그 중에서 num이라는 클래스 선언한 거 찾기
print(dust01) # 출력 : 48㎍/㎥

dust02 = data2[1].find('span',{'class':'num'}).text # 초미세먼지
print(dust02) # 출력 : 32㎍/㎥

O3 = data2[2].find('span',{'class':'num'}).text # 오존
print(O3) # 출력 : 0.092ppm

data3 = soup.find('div',{'class':'main_info'}) # main_info 클래스 안에 있는 거 다 보여줌
print(data3) # 출력 : <div class="main_info"> <span class

degree = data3.find('span',{'class':'todaytemp'}).text # text 안 붙히면 <span class="todaytemp">13</span>가 출력 됨
print(degree) # 출력 : 31
import requests
from bs4 import BeautifulSoup as bs

tag = "<p class='big_data01' id='uniq01'> Hello World </p>"
soup = bs(tag,'html.parser')

# 태그 이름으로 특정
data01 = soup.find('p')
print(data01) # 출력 : <p class="big_data01" id="uniq01"> Hello World </p>

data01_text = soup.find('p').text # Hello World
print(data01_text) # 출력 :

# 클래스 이름으로 특정
data03 = soup.find(class_='big_data01')
print(data03) # 출력 : <p class="big_data01" id="uniq01"> Hello World </p>

data03_text = soup.find(class_='big_data01').text
print(data03_text) # 출력 : Hello World

 

import 해주는 법은 from bs4 import BeautifulSoup 이라고 쳐주면 빨간줄이 생기실텐데 Alt + Enter 누르시면

Import 할 수 있게 도와줍니다. Import 해주면 해당 패키지를 설치해줍니다.

 

  • html = requests.get(url주소)
    • 가 크롤링할 url주소를 가져옵니다.
  • soup = bs(html.text,'html.parser')
    • url주소의 html태그를 다 가져옵니다

 

크롤링하는 방법이 여러개 있습니다. 

📝1. 태그 + class명으로 가져오기

  • data1 = soup.find('div',{'class':'detail_box'})
    • soup.find(태그명,{class : 클래스명}) 태그안에 있는 정보 태그들을 다 가져 올 수 있습니다.
    • 여기에서는 div태그 class명이 detail_box라는 것은 해당 클래스 안에 들어있는 것들을 의미합니다

📝2. 태그로만 가져오기

  • data2 = data1.findAll('dd')
  • soup.findAll(태그명)
  • 태그명에 해당하는 모든 태그 값을 다 가져옵니다. 만약 여러 개일시 리스트로 담습니다 인덱스로 개별 접근할 수 있습니다.

 

📝3. class명으로만 가져오기

  • data03 = soup.find(class_='big_data01')
  • soup.find(class_=클래스명)
  • 해당 클래스 정보를 다 가져옵니다.

 

그런데 soup.find같은 걸로 가져와서 출력해도 태그도 같이 출력됩니다 그 안에 내용물이 중요한데 말이죠 그 내용물을 가져오기위한 것이 .text라는 것입니다 이 함수는 실질적인 내용만 가져오게 해줍니다.

반응형