1. 웹 스크래핑 requests 응답
import requests
def request():
res=requests.get("https://copro505.tistory.com/")
print("응답코드:", res.status_code) #200이면 정상
response = requests.get("http://nadocoding.tistory.com")
response.raise_for_status() #문제가 있는 경우 자동종료
print("응답코드:", response.status_code)
if response.status_code == requests.codes.ok:
print("정상입니다.")
else:
print("문제가 생겼습니다. [ 에러코드", res.status_code, "]")
request()
2. 웹 스크래핑 데이터 저장해보기
import requests
#스크래핑 데이터 저장해보기
def mycopro_html():
response = requests.get("http://copro505.tistory.com")
response.raise_for_status()
#현재 디렉토리에 mycopro.html로 저장 : with구문
with open("mycopro.html", "w", encoding="utf8") as f:
f.write(response.text)
mycopro_html()
3. 정규식 연습 1
import re
#ca?e
#care, cafe, case, cave
p = re.compile("ca.e") #p는 pattern의 약자를 의미한다.
#원하는 형태 :정규식
#. (ca.e): 하나의 문자를 의미 > care, cafe, case(O) |caffe(X)
#^ (^de): 문자열의 시작 > desk, destination(O) |fade(X)
#$ (se$): 문자열의 끝>case, base(O) | face(X)
m = p.match("case")
print(m.group()) #매치되면 출력
m = p.match("good")
print(m.group()) #매치되지 않으면 에러 출력
def print_match(m):
if m:
print(m.group())
print("매칭됨")
else:
print("매칭되지 않음")
4. 정규식 연습 2
import re
#ca?e
#care, cafe, case, cave
p = re.compile("ca.e") #p는 pattern의 약자를 의미한다.
#원하는 형태 :정규식
#. (ca.e): 하나의 문자를 의미 > care, cafe, case(O) |caffe(X)
#^ (^de): 문자열의 시작 > desk, destination(O) |fade(X)
#$ (se$): 문자열의 끝>case, base(O) | face(X)
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()) #일치하는 문자열의 끝 index
print("m.span()", m.span()) #일치하는 문자열의 시작/끝 index
else:
print("매칭되지 않음")
m =p.match("careless") #match : 주어진 문자열의 처음부터 일치하는지 확인
print_match(m)
print()
m =p.search("good care") #search : 주어진 문자열 중에 일치하는게 있는지 확인
print_match(m)
print()
list =p.findall("good care cafe") #findall: 일치하는 모든 것을 리스트 형태로 반환
print(list)
#1. p = re.compile("원하는 형태")
#2. m = p.match("비교할 문자열") : 주어진 문자열의 처음부터 일치하는지 확인
#3. m = p.search("비교할 문자열") : 주어진 문자열 중에 일치하는게 있는지 확인
#4. list = p.findall("비교할 문자열") :일치하는 모든 것을 "리스트" 형태로 반환
#원하는 형태 :정규식
#. (ca.e): 하나의 문자를 의미 > care, cafe, case(O) |caffe(X)
#^ (^de): 문자열의 시작 > desk, destination(O) |fade(X)
#$ (se$): 문자열의 끝>case, base(O) | face(X)
5. requests 응답이 없을 때, 추가로 headers 정보 전송하여 응답 오류 해결하기
import requests
#requests 응답이 없을 때, 추가로 headers 정보 전송하여 응답 오류 해결하기
#User- Agent확인 : https://www.whatismybrowser.com/detect/what-is-my-user-agent/
def nadocoding():
url ="http://nadocoding.tistory.com"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"}
response = requests.get(url, headers=headers)
response.raise_for_status()
with open("nadocoding.html", "w", encoding="utf8") as f:
f.write(response.text)
print("파일 저장 완료")
nadocoding()
6. BeautifulSoup활용, 스크래핑 함수들1
import requests
from bs4 import BeautifulSoup
def bs4_use():
url = "https://comic.naver.com/webtoon/weekday"
res = requests.get(url)
res.raise_for_status()
soup = BeautifulSoup(res.text, "lxml") #soup 객체
# print(soup.title)
# print(soup.title.get_text())
# print(soup.a) #soup객체에서 첫번째로 발견되는 a 요소 정보를 출력
# print(soup.a.attrs) #soup객체에서 a요소의 속성 정보를 출력
# print(soup.a["href"]) #soup객체에서 a요소의 href속성 "값" 정보를 출력
# print(soup.find('a', attrs={'class':'Nbtn_upload'})) #a태그에 해당하는 첫번째 요소를 가져오는데, 그 조건이 class="Nbtn_upload인 a elemnet를 찾아줘
# print(soup.find(attrs={'class':'Nbtn_upload'})) #class="Nbtn_upload인 a elemnet를 찾아줘
#Nbtn_upload 속성이 하나이기 때문이 태그 지정 없이 가능
print(soup.find("li", attrs={'class':'rank01'})) #인기급상승 1위
rank1 = soup.find("li", attrs={'class':'rank01'})
print(rank1.a)
print()
print(rank1.a.get_text()) #1등
# print()
# print(rank1.next_sibling) #아무 것도 안 나옴
# rank2=rank1.next_sibling.next_sibling #웹 문서상에 줄바꿈이 있어서 두번 해야 한다.
# print(rank2.a.get_text())
# rank3=rank2.next_sibling.next_sibling
# print(rank3.a.get_text())
# rank2 = rank3.previous_sibling.previous_sibling
# print(rank2.a.get_text())
# print(rank1.parent)
# rank2 = rank1.find_next_sibling("li") #2등 next_sibling을 두번 사용 할 필요X
# print(rank2.a.get_text())
# rank3 = rank2.find_next_sibling("li") #3등
# print(rank3.a.get_text())
# rank2 = rank3.find_previous_sibling("li") #2등
# print(rank2.a.get_text())
rank1.find_next_siblings("li") #형제"들"을 가져옴
print(rank1.a.get_text())
bs4_use()
6-1. BeautifulSoup활용, 스크래핑 함수들1
import requests
from bs4 import BeautifulSoup
def bs4_use():
url = "https://comic.naver.com/webtoon/weekday"
res = requests.get(url)
res.raise_for_status()
soup = BeautifulSoup(res.text, "lxml")
cartoonsBox = soup.find('ol', attrs={"class": "asideBoxRank"}) # 전체 영역에서 'a' 태그를 찾지 않고 인기 급상승 영역으로 범위 제한
cartoons = cartoonsBox.find_all('a') # 인기 급상승 영역에서 'a'태그 모두 찾아 변수 cartoons에 할당
i = 1
# 반복문으로 제목 가져오기(터미널 창 출력 및 엑셀 저장)
for cartoon in cartoons:
title = cartoon.get("title")
print(f"{str(i)}위: {title}")
data = [str(i), title]
i += 1
bs4_use()