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
'PYTHON > 기타' 카테고리의 다른 글
파이썬에서의 날짜와 시간 관련 자료형 (0) | 2024.02.21 |
---|---|
Jupyter Notebook에 아나콘다 가상환경 커널 생성 및 연결하기 (2) | 2024.02.16 |
[데이터 분석] 파이썬 태양열 신재생 에너지 분석(수평면 산란 일사량,풍속과 태양열 발전량의 상관관계) (0) | 2024.01.05 |
[데이터 분석] Matplotlib, Seaborn 연습 (0) | 2024.01.05 |
[데이터 분석] Pandas 연습 (0) | 2024.01.05 |