본문 바로가기
  • Welcome J-Kyu Tstory
국비교육과정/크롤링

웹 크롤링

by regularity 2022. 5. 13.
728x90

#0513(금)_ToDo 

1. Python_Crawling
-크롤링기본 : 기본 태그 및 pkg/라이브러리
-네이버 홈페이지의 제목 및 실시간뉴스 크롤링
-크롤링의 데이터를 csv/txt로 저장하는 방법

2. 네이버 웹툰 크롤링

3.Agent를 이용한 쿠팡의 상품정보 데이터 크롤링

4. 이미지파일 크롤링

5.코스피시가총액의 데이터를 크롤링에 의한 DB화

6.크롤링을 통한 자신만의 PJT화 만들기


Crawling_Study_0513 - Jupyter Notebook.pdf
1.01MB

 

 

#urllib는 파이썬이 인터넷에서 데이터를 받아오는 기능들이 들어있는 패키지임
from urllib.request import urlopen
url="https://www.naver.com/"
html=urlopen(url)  #html은 변수명
print(html.read()) #연결된 url의 정보를 읽어라



#읽어들인 브라우저의 데이터들을 필요한 내용들로 뽑아내기위해서 파싱이 필요
#여기에 따른 라이브러리가 뷰티플숩
import bs4
from bs4 import BeautifulSoup

html_str="<html><div>hello</div></html>"
soup=bs4.BeautifulSoup(html_str,"html.parser")
print(type(soup))
print(soup)
print(soup.find("div").get_text()) #div 태그에서 문자만 꺼내라
# print(soup.findAll("div").get_text()) #div 태그에서 문자만 꺼내라
# print(soup.find_all("div").get_text()) #div 태그에서 문자만 꺼내라


#html을 추가하여 진행
import bs4  #!pip install bs  (!->shell창에 가서 설치해라)
from bs4 import BeautifulSoup

html_str="""
<html>
<body>
    <ul>
        <li>Hello</li>
        <li>bye</li>
        <li>welcome</li>
    </ul>
</body>
</html>
"""

soup=bs4.BeautifulSoup(html_str,"html")
ul=soup.find("ul")
print(ul)#ul_find("li".get_text()) -->Hello 만 가져옴
print()
lis=ul.findAll("li")
print(lis)
for li in lis:
    print(li.get_text(),end=" ")
    
    
    
  
  #'Hello' 내용만 추출하는 방법
import bs4  #!pip install bs  (!->shell창에 가서 설치해라)
from bs4 import BeautifulSoup

html_str="""
<html>
<body>
    <ul>
        <li>Hello</li>
        <li>bye</li>
        <li>welcome</li>
    </ul>
</body>
</html>
"""

soup=bs4.BeautifulSoup(html_str,"html")
ul=soup.find("ul")
# print(ul.find("li").get_text())
lis=ul.findAll("li")
print(type(lis))
print(lis[0].get_text())
print(lis[1].get_text())
print(lis[2].get_text())
#전체를 끄집어내는 경우는
print("*"*70)
for i in lis:
    print(i.get_text())
    
    
  
 #웹싸이트의 크롤링(naver)
##네이버 홈페이지의 제목 (타이틓) 내용 크롤링 하기
import urllib.request
import bs4

url="https://www.naver.com/"
html=urllib.request.urlopen(url)

soup=BeautifulSoup(html,"html.parser") #lxml
ul=soup.find("ul",{"class":"list_nav type_fix"})
#print(ul)
lis=ul.findAll("li")
print(lis)
for li in lis:
    a_tag=li.find("a")
    title=a_tag.get_text()
    link=a_tag.get("href")
    
    print(title)
    print(link)
    print()
    
    
 #네이버의 실시간 정치 뉴스 크롤링
import urllib.request
import bs4

idx=1
url="https://news.naver.com/main/main.naver?mode=LSD&mid=shm&sid1=100"
html=urllib.request.urlopen(url)

soup=bs4.BeautifulSoup(html,"html")
#href 부분
hdline=soup.find("ul",{"class":"section_list_ranking_press _rankingList"})
lis=hdline.findAll("li")
for li in lis:
                #클래스 부분
    a=li.find("a",{"class":"list_tit nclicks('rig.renws2')"})
    print(idx,a.text.strip())
    print(a.get('href'))
    print()
    idx +=1
    
    
    
  #파일화 작업
import urllib.request
import bs4
import csv

list=[]
idx=1
url="https://news.naver.com/main/main.naver?mode=LSD&mid=shm&sid1=100"
html=urllib.request.urlopen(url)

soup=bs4.BeautifulSoup(html,"html")
#href 부분
hdline=soup.find("ul",{"class":"section_list_ranking_press _rankingList"})
lis=hdline.findAll("li")
for li in lis:
    temp=[]
                #클래스 부분
    a=li.find("a",{"class":"list_tit nclicks('rig.renws2')"})
    title=idx,a.text.strip()
    urla=a.get('href')
    print(title)
    print(urla)
    print()
    temp.append(idx)
    temp.append(title)
    temp.append(urla)
    list.append(temp)
    idx +=1
f=open("Hdline.csv","w",encoding="cp949",newline="")
header=["No","Title","Url"]
csvwriter=csv.writer(f)
csvwriter.writerow(header)
for i in list:
    csvwriter.writerow(i)
f.close()
print("완료되었습니다.")
    




#크롤링에 대한 몇가지 기본적인 내용들 (네이버웹툰)
#requests pkg
import requests
from bs4 import BeautifulSoup
url="https://comic.naver.com/webtoon/weekday"
html=requests.get(url)
html.raise_for_status() #비정상연결이면 종료가됨. 연결이 통과됨.(200:정상연결, 400:비정상연결)
soup=BeautifulSoup(html.text,"html")

cartoons=soup.findAll("a",{"class":"title"})
idx=1
for cartoon in cartoons:
    title=cartoon.get_text().strip()
    link="https://comic.naver.com"+cartoon.get("href")
    print(idx,title,link)
    print()
    idx +=1
    
    
  #가우스전자(1~2)웹툰정보 크롤링예제임.
import requests
from bs4 import BeautifulSoup

url="https://comic.naver.com/webtoon/list?titleId=335885"
html=requests.get(url)
soup=BeautifulSoup(html.text,"html")

#만화제목과 링크가져오기
idx=1
total_rate=0
cartoons=soup.findAll("td",{"class":"title"})
for cartoon in cartoons:
    title=cartoon.a.get_text()
    link="https://comic.naver.com/"+cartoon.a.get('href')
    print(idx,title,link)
    idx +=1

    
#평점구하기
cartoons=soup.findAll("div",{"class":"rating_type"})
for cartoon in cartoons:
    rate=cartoon.find("strong").get_text()
#    print(rate)
    total_rate +=float(rate)

print()
print("총점 : ",total_rate)
print("평균 : ",total_rate/len(cartoons))




#정규식 : 주민등록번호, 차량번호, 이메일 주소.
import re
p=re.compile("ca.e")
#. : 하나의 문자를 의미
#^ : 문자열의 시작
#$ : 문자열의 끝

a=p.match("cafe")
def print_match(m):
    if m:
        print("m.group()",m.group()) #일치하는 문자열을 반환
        print("m.string",m.string) #입력받은 문자열
        print("m.start()",m.start())#일치하는 문자열의 시작 index
        print("m.end()",m.end())#일치하는 문자열 끝 인덱스
        print("m.span()",m.span())#일치하는 문자열 끝과시작의 인덱스
    else:
        print("매치되지 않았습니다.")
a=p.match("careless")
print_match(a)
print("="*50)
lst=p.findall("good care cafe case")
print(lst)




#이미지 파일을 크롤링하여 저장하는 내용임.
##다음영화를 검색하고 역대순위별의 5개의 이미지를 다운로드 받는다.
##최근 5년동안의 인기있는 영화를 골라 저장한다.
import requests #from_urllib.request import urlopen
from bs4 import BeautifulSoup
url="https://search.daum.net/search?w=tot&q=%EC%97%AD%EB%8C%80%EA%B4%80%EA%B0%9D%EC%88%9C%EC%9C%84&DA=MOR&rtmaxcoll=MOR"
res=requests.get(url)
res.raise_for_status() #정상연결 유무를 검증
soup=BeautifulSoup(res.text,"html")

images=soup.findAll("img",{"class":"thumb_img"})
for image in images:
    image_url=image["src"]
#    print(image_url)
    if image_url.startswith("//"):
        image_url="https:"+image_url
        
    print(image_url)
#모든 링크구성을 온전하게 매듭을 지음.




#이미지 파일을 크롤링하여 저장하는 내용임.
##다음영화를 검색하고 역대순위별의 5개의 이미지를 다운로드 받는다.
##최근 5년동안의 인기있는 영화를 골라 저장한다.
import requests #from_urllib.request import urlopen
from bs4 import BeautifulSoup
url="https://search.daum.net/search?w=tot&q=%EC%97%AD%EB%8C%80%EA%B4%80%EA%B0%9D%EC%88%9C%EC%9C%84&DA=MOR&rtmaxcoll=MOR"
res=requests.get(url)
res.raise_for_status() #정상연결 유무를 검증
soup=BeautifulSoup(res.text,"html")

images=soup.findAll("img",{"class":"thumb_img"})
for idx,image in enumerate(images): #번호를 할당하여 구성을 시켜주는 함수임.
    image_url=image["src"]
#    print(image_url)
    if image_url.startswith("//"):
        image_url="https:"+image_url
        
    print(image_url)

#그러면 여기에 접속(image_url)하여 이 파일을 지정하여 본다
    image_res=requests.get(image_url) #이미지의 url을 넘겨주어 접속하게 됨
    image_res.raise_for_status() #정상연결유무체크
    #이것을 저장하면 됨
    with open("movie().jpg".format(idx+1),"wb")as f: #여기에 movie1,2,3...
        f.write(image_res.content) #image가 곧 content
        
        #여기에다가 상위 5개 이미지만 가져오기
        if idx >=4: #상위5개의 이미지만 가져오는 것임
            break
            
            
            
 #이미지 파일을 최근 5년동안 연도별로 이미지 파일을 저장하는 코딩임

import requests #from_urllib.request import urlopen
from bs4 import BeautifulSoup

#headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36"}


for year in range(2017,2022):
    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,"html")
    
    images=soup.findAll("img",{"class":"thumb_img"})
    for idx,image in enumerate(images): #번호를 할당하여 구성을 시켜주는 함수임.
        image_url=image["src"]
    #    print(image_url)
        if image_url.startswith("//"):
            image_url="https:"+image_url

        print(image_url)

    #그러면 여기에 접속(image_url)하여 이 파일을 지정하여 본다
        image_res=requests.get(image_url) #이미지의 url을 넘겨주어 접속하게 됨
        image_res.raise_for_status() #정상연결유무체크
        #이것을 저장하면 됨
        with open("movie{}_{}.jpg".format(year,idx+1),"wb")as f: #여기에 movie1,2,3...
            f.write(image_res.content) #image가 곧 content

            #여기에다가 상위 5개 이미지만 가져오기
            if idx >=4: #상위5개의 이미지만 가져오는 것임
                break
                
 #코스피시가총액순위를 네이버에서 검색하여 가져오는 코딩내용
#관련 결과물을 저장하는 코딩

import csv
import re
import requests
from bs4 import BeautifulSoup

url="https://finance.naver.com/sise/sise_market_sum.nhn?sosok=0&page="

filename="시가총액13.csv"
f=open(filename,"w",encoding="cp949",newline="") #만약 뉴라인을 공보처리하여 주지 않으면 한글 다음에 엔터키가 자동으로 들어감
writer=csv.writer(f)
title="N	종목명	현재가	전일비	등락률	액면가	시가총액	상장주식수	외국인비율	거래량	PER	ROE".split("\t")
writer.writerow(title)

for page in range(1,5): #1page만 선택한 경우(50위까지의 데이터)
    res = requests.get(url+str(page))#str로 감싸줌
    res.raise_for_status() #정상유무체크(정상이면 통과 아니면 스톱)
    soup=BeautifulSoup(res.text,"html")
    
    #파싱을 하면 태그가 table과 클래스 type_2임 .. 그 밑의 tbody 그 밑의 tr 그밑의 td를 구성
    data_rows=soup.find("table",{"type_2"}).find("tbody").findAll("tr")
    for row in data_rows:
        columns=row.findAll("td")
        if len(columns)<=1: #의미없는 데이터를 제거해주는 내용
            continue
        data=[column.get_text().strip() for column in columns]#1줄짜리 for문으로 컬럼스안에 컬럼에 대한 컬럼의 내용들을 추출하는 내용
        print(data)
        
        writer.writerow(data)
        
        
        
 #네이버에서 오늘의 날씨를 검색힌 데이터를 크롤링하여 함수화 시킴.

import requests
from bs4 import BeautifulSoup

def crawl_weather():
    url="https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=%EC%84%9C%EC%9A%B8+%EB%82%A0%EC%94%A8"
    
    res=requests.get(url)
    res.raise_for_status()
    soup=BeautifulSoup(res.text,"html")
    cur_temp=soup.find("div",{"class","temperature_text"}).get_text()
    print(cur_temp)
    min_temp=soup.find("span",{"class":"lowest"}).get_text()
    print(min_temp)
    max_temp=soup.find("span",{"class":"highest"}).get_text()
    print(max_temp)

if __name__=="__main__":
    crawl_weather() #오늘의 날씨정보




=====과제======
import requests
from bs4 import BeautifulSoup

def print_news(index,title,link):
    print("{},{}".format(index+1,title))
    print(" (링크 :{})".format(link))

def crawl_weather():
    print("[날씨정보]")
    url="https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=%EC%84%9C%EC%9A%B8+%EB%82%A0%EC%94%A8"
    
    res=requests.get(url)
    res.raise_for_status()
    soup=BeautifulSoup(res.text,"html")
    cur_temp=soup.find("div",{"class","temperature_text"}).get_text()
    print(cur_temp)
    min_temp=soup.find("span",{"class":"lowest"}).get_text()
    print(min_temp)
    max_temp=soup.find("span",{"class":"highest"}).get_text()
    print(max_temp)
    print()


def crawl_headline_news():
    print("="*50)
    print("[헤드라인뉴스]")
    idx=1
    url="https://news.naver.com/main/main.naver?mode=LSD&mid=shm&sid1=100"
    html=urllib.request.urlopen(url)

    soup=bs4.BeautifulSoup(html,"html")
    #href 부분
    hdline=soup.find("ul",{"class":"section_list_ranking_press _rankingList"})
    lis=hdline.findAll("li")
    for li in lis:
                    #클래스 부분
        a=li.find("a",{"class":"list_tit nclicks('rig.renws2')"})
        print(idx,a.text.strip())
        print(a.get('href'))
        print()
        idx +=1

def crawl_like_news():
    print("="*50)
    print("[관심분야 뉴스]")
    idx=1
    url="https://sports.news.naver.com/index"
    html=urllib.request.urlopen(url)

    soup=bs4.BeautifulSoup(html,"html")
    #href 부분
    sport=soup.find("ul",{"class":"today_list"})
    lis=sport.findAll("li")
    for li in lis:
                   
        a=li.find("a",{"class":"link_today"})
        print(idx,a.text.strip())
        print("https://sports.news.naver.com"+a.get('href'))
        print()
        idx +=1

def crawl_live_news():
    print("="*50)
    print("[실시간 뉴스]")
    idx=1
    url="https://www.fnnews.com/newsflash"
    html=urllib.request.urlopen(url)

    soup=bs4.BeautifulSoup(html,"html")
    #href 부분
    live=soup.find("ul",{"class":"list_news"})
    lis=live.findAll("li")
    
    for li in lis:
                   
        a=li.find("a",{"class":"link_news"})
        print(idx,a.text.strip())
        print("https://sports.news.naver.com"+a.get('href'))
        print()
        idx +=1
 
        
        
if __name__=="__main__":
    crawl_weather() 
    crawl_headline_news()
    crawl_like_news()
    crawl_live_news()
    

  


#가우스전자(1~2)웹툰정보 크롤링예제임.
import requests
from bs4 import BeautifulSoup

url="https://comic.naver.com/webtoon/list?titleId=335885"
html=requests.get(url)
soup=BeautifulSoup(html.text,"html")

#만화제목과 링크가져오기
idx=1
total_rate=0
cartoons=soup.findAll("td",{"class":"title"})
for cartoon in cartoons:
    title=cartoon.a.get_text()
    link="https://comic.naver.com/"+cartoon.a.get('href')
    print(idx,title,link)
    idx +=1

    
#평점구하기
cartoons=soup.findAll("div",{"class":"rating_type"})
for cartoon in cartoons:
    rate=cartoon.find("strong").get_text()
#    print(rate)
    total_rate +=float(rate)

print()
print("총점 : ",total_rate)
print("평균 : ",total_rate/len(cartoons))

 

 

728x90

'국비교육과정 > 크롤링' 카테고리의 다른 글

[크롤링] 미니 프로젝트  (0) 2022.05.14

댓글