728x90
#0513(금)_ToDo
1. Python_Crawling
-크롤링기본 : 기본 태그 및 pkg/라이브러리
-네이버 홈페이지의 제목 및 실시간뉴스 크롤링
-크롤링의 데이터를 csv/txt로 저장하는 방법
2. 네이버 웹툰 크롤링
3.Agent를 이용한 쿠팡의 상품정보 데이터 크롤링
4. 이미지파일 크롤링
5.코스피시가총액의 데이터를 크롤링에 의한 DB화
6.크롤링을 통한 자신만의 PJT화 만들기
#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 |
---|
댓글