본문 바로가기
카테고리 없음

[파이썬] 'beautifulsoup4', 'csv' 이용한 웹 스크래핑 기초2

by ㅇㅇ우너자나나 2021. 9. 17.

조건)

1. bs4를 이용한 다음영화 인기순위 가져오기

2. 2015년부터 2020년에 해당되는 상위 5개 영화의 링크를 출력

3. 2015년부터 2020년에 해당되는 상위 5개 영화의 이미지를 파일로 저장

 

 

 

1. 전체 코드

import requests
from bs4 import BeautifulSoup

# for image in images:
#     image_url = image["src"]
#     if image_url.startswith("//"): # 만약 //으로 시작한다면 이라는 함수. boolean 에 맞춰 true/false 값을 리턴한다
#         image_url = "https:" + image_url

for year in range(2015, 2020): # 2015~2019
    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):
        image_url = image["src"] 
        if image_url.startswith("//"): # 만약 //으로 시작한다면 이라는 함수. boolean 에 맞춰 true/false 값을 리턴한다
            image_url = "https:" + image_url

        print(image_url)
        image_res = requests.get(image_url) # 페이지 정보를 파일로 저장하기 위해 requests를 이용해 새롭게 접근.
        image_res.raise_for_status()

        with open("movie_{}_{}.jpg".format(year, idx+1), "wb") as f:
            f.write(image_res.content) # 이 resource가 가지고 있는 content 정보를 파일로 사용

        if idx >= 4: # 상위 5개의 이미지까지만 다운로드
            break

 

2. 결과

 

 

 

 

 

 


 

조건)

1. 네이버증권 사이트에서 시가총액 200등 위로 정보 가져오기

2. csv 라이브러리를 사용하여 엑셀파일로 저장

 

 

1. 전체 코드

import csv # csv 형태로 저장하기 위해 사용
import requests
from bs4 import BeautifulSoup


url = "https://finance.naver.com/sise/sise_market_sum.nhn?sosok=0&page="
filename = "시가총액1-200.csv"
f = open(filename, "w", encoding="utf-8-sig", newline="") #newline은 매 줄마다 띄어쓰기 하나 생기는데, newline 공백으로 하면 줄만 바꿀 수 있다.
# utf8이 아닌 utf-8-sig 사용한다. utf8은 txt파일에서 열면 한글깨짐 없지만, utf-8-sig는 엑셀에서 열어도 한글깨짐 없다.
writer = csv.writer(f) # csv로 파일 작성

title = "N	종목명	현재가	전일비	등락률	액면가	시가총액	상장주식수	외국인비율	거래량	PER	ROE	토론실".split("\t")
# ["N", "종목명", "현재가", ...] 이런식으로 리스트형태로 넣어줄 것이다. split("\t") 하게되면 tab으로 구분된 애들이 리스트 형태로 들어간다.
# print(type(title))
writer.writerow(title) # writerow는 리스트형태로 넣어야한다.

for page in range(1, 5):
    res = requests.get(url + str(page))
    res.raise_for_status()
    soup = BeautifulSoup(res.text, "lxml")

    data_rows = soup.find("table", attrs={"class":"type_2"}).find("tbody").find_all("tr")
    for row in data_rows:
        columns = row.find_all("td") # row(tr엘리먼트)내부의 td 엘리먼트 찾기
        if len(columns)<=1: # 의미 없는 데이터(tbody내부의 tr엘리먼트 중에)는 건너뛰기 위함. <tr>...<tr>로 된 곳.
            continue
        data = [column.get_text().strip() for column in columns] # for문 너무 많아서 여기선 한줄 for문 실행
        # 불필요한것들을 제거하기 위해 .strip()을 사용한다.
        #print(data)
        writer.writerow(data) #리스트형태로 넣어주면 된다.
        # 왜 writerow???

 

 

2. 결과