[나도코딩] 파이썬 웹 스크래핑(Web Scraping)(User_Agent, BeautifulSoup4)

728x90

 

나도코딩 웹 스크래핑 1~5(HTML, XPath, Requests, 정규식)

https://jyeong0814.tistory.com/29

 

[나도코딩] 파이썬 웹스크래핑(Web Scraping)(HTML, XPath, Requests, 정규식)

얼마 전 데이터 분석 입문 공부할 때 유튜버 나도코딩님의 강의를 들으며 많은 도움을 받았는데 이번에 웹 크롤링에 관심이 생겨 알아보던 중 마침 좋은 영상이 있길래 공부하게 되었습니다. 파

jyeong0814.tistory.com

 

6. User_Agent

import requests

headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}
url = "http://nadocoding.tistroy.com"
res = requests.get(url, headers = headers)
res.raise_for_status()

with open("nadocoding.html", "w", encoding="utf8") as f:
    f.write(res.text)

 

 

7. BeautifulSoup4

# beautifulsoup : 스크래핑 패키징
# lxml : 구문 분석 phaser
import requests
from bs4 import BeautifulSoup

url = "https://comic.naver.com/webtoon"
res = requests.get(url)
res.raise_for_status()

soup = BeautifulSoup(res.text, "lxml") # 가져온 html 문서 -> lmxl 파서를 통해서 beautiful soup 객체로 만듦.
print(soup.title)
print(soup.title.get_text())
print(soup.a) # soup 객체에서 첫번째로 발견되는 a태그 정보 출력
print(soup.a.attrs) # a element의 속성 , 딕셔너리로 반환
print(soup.a["href"]) # a element의 href 속성 '값' 정보 출력

# 대상 페이지에 대해 잘 모르는 경우
print(soup.find("a", attrs = {"class":"Nbtn_upload"} )) # class = "Nbtn_upload" 인 a element 를 찾아줘

# 인기급상승 1~10위 가져오기
rank1 = soup.find("li", attrs = {"class":"rank01"})
print(rank1.a.get_text())
rank2 = rank1.next_sibling.next_sibling # next_sibling : 다음 형제 태그로 이동 
rank3 = rank2.next_sibling.next_sibling
print(rank3.a.get_text())
rank2 = rank3.previous_sibling.previous_sibling # previous_sibling : 이전 형제 태그로 이동
print(rank2.a.get_text()) 
print(rank1.parent) # 부모 태그로 이동
rank2 = rank1.find_next_sibling("li") # 해당 기준을 만족하는 다음 태그 찾기, 개행 상관 X
print(rank2.a.get_text())
rank3 = rank2.find_next_sibling("li")
rank2 = rank3.find_previous_sibling("li")
print(rank2.a.get_text())
rank1.find_next_siblings("li") # 해당 기준 만족하는 모든 형제 태그 찾기

webtoon = soup.find("a", text = "독립일기-시즌2 47화 결막염") # 텍스트에 해당하는 a 태그 찾기
print(webtoon)

 

쿠팡 검색 결과 데이터 가져오기

import requests
import re
from bs4 import BeautifulSoup
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36"}
for i in range(1,6):
    #print("페이지 : ", i)
    url = "https://www.coupang.com/np/search?q=%EB%85%B8%ED%8A%B8%EB%B6%81&channel=user&component=&eventCategory=SRP&trcid=&traid=&sorter=scoreDesc&minPrice=&maxPrice=&priceRange=&filterType=&listSize=36&filter=&isPriceRange=false&brand=&offerCondition=&rating=0&page={}&rocketAll=false&searchIndexingToken=1=5&backgroundColor=".format(i)
    res = requests.get(url, headers = headers)
    res.raise_for_status()
    soup = BeautifulSoup(res.text, "lxml")

    items = soup.find_all("li", attrs={"class":re.compile("^search-product")})
    #print(items[0].find("div", attrs = {"class":"name"}).get_text())
    for item in items:
        # 광고 제품은 제외
        ad_badge = item.find("span", attrs = {"class":"ad-badge-text"})
        if ad_badge:
            #print(" < 광고 상품 제외힙니다 >")
            continue
        # 제품명
        name = item.find("div", attrs = {"class":"name"}).get_text()
        
        # 레노버 제품 제외
        if "레노버" in name:
            #print(" < 레노버 상품 제외합니다 >")
            continue
        # 가격
        price = item.find("strong", attrs = {"class":"price-value"}).get_text()
        # 리뷰 100개 이상, 평점 4.5 이상 되는 것만 조회
        # 평점
        rate = item.find("em", attrs = {"class":"rating"})
        if rate:
            rate = rate.get_text()
        else:
            #print(" < 평점 없는 상품 제외합니다. >")
            continue
        # 평점 수 
        rate_cnt = item.find("span", attrs = {"class":"rating-total-count"})
        if rate_cnt:
                rate_cnt = rate_cnt.get_text()[1:-1]
        else:
            #print(" < 평점 수 없는 상품 제외합니다.>")
            continue
        
        link = item.find("a", attrs={"class":"search-product-link"})["href"]
        
        if float(rate) >= 4.5 and float(rate_cnt) >= 100:
            print(f"제품명 : {name}")
            print(f"가격 : {price}")
            print(f"평점 : {rate}점 ({rate_cnt}개)")
            print("바로가기 : {}".format("https://www.coupang.com" + link))
            print("-"*100) # 줄긋기

 

Daum 영화 데이터 이미지 다운로드

import requests
from bs4 import BeautifulSoup

for year in range(2015,2020):
    url = "https://search.daum.net/search?w=tot&q={}%EB%85%84%EC%98%81%ED%99%94%EC%88%9C%EC%9C%84&DA=MOR&rtmaxcoll=MOR".format(year)
    res = requests.get(url)
    res.raise_for_status()
    soup = BeautifulSoup(res.text, "lxml")
    images = soup.find_all("img", attrs = {"class":"thumb_img"})
    for idx, image in enumerate(images):
        #print(image["src"])
        image_url = image["src"]
        if image_url.startswith("//"):
            image_url = "https:" + image_url
        
        print(image_url)
        image_res = requests.get(image_url)
        image_res.raise_for_status()
        
        with open("movie_{}_{}.jpg".format(year,idx+1), "wb") as f:
            f.write(image_res.content)
            
        if idx >= 4 : # 상위 5개 이미지까지만 다운로드
            break

 

강의 올라왔던 때와 다르게 웹 페이지 코드들이 바뀌어서 따라하며 실습하는데 어려움이 있었다

웹 스크래핑에 대해 대략적인 감은 익힐 수 있었다

 

 

728x90