파이썬 공부에 유용한 사이트들
파이썬이나 다른 프로그래밍 언어들 연습문제 풀고 단계별로 학습할 수 있는 곳
꾸준히 문제를 풀면 좋습니다!
Baekjoon Online Judge
https://www.acmicpc.net/
SW Expert Academy
https://swexpertacademy.com/main/main.do
Programmers
https://www.programmers.co.kr/
ex) 거꾸로 배열해도 같은 단어 또는 문장이 되는 회문인지 판별하는 함수를 정의하세요.
함수에 문자열을 입력받고 회문이면 True 아니면 False를 반환하도록 정의하세요.
# 함수 이름 : is_palindrome
# 반환 값 : True 또는 False
palindrome = input("문자를 입력하세요.")
def is_isplindrome(input_string):
# input_string : 회문
input_string = input_string.replace(" ", "")
length = len(input_string)
for i in range(length//2):
if input_string[i] != input_string[length - 1 - i]:
# 반만 검사하면 되고, 정수만 수에 넣으려고 씀. 이 예제의 포인트!
return False
return True
result = is_isplindrome(palindrome)
print(result)
palindrome = input("문자를 입력하세요.")
def is_isplindrome(input_string):
input_string = input_string.replace(" ", "")
return input_string == input_string[::-1]
result = is_isplindrome(palindrome)
print(result)
reversed()
내장 함수, reversed("안녕하세요")
원본은 그대로 두고 뒤집힌 새로운 것을 출력return한다.
그래서 문자열처럼 immutable한 것도 처리됨.
def get_biggest(a, b, c, d, e):
numbers = [a, b, c, d, e]
numbers.sort(reverse=True)
map(numbers, str)
result = "".join(numbers)
for i in numbers :
result += str(i)
return int(result)
print(get_biggest("안", "녕", "하", "세", "요"))
li1 = [1, 2, 3, 4, 5]
li1.reverse() # 원본이 뒤집힙니다.
string3 = "".join(string2)
for line in f:
print(line.strip())
# 시험문제 풀이 두가지. 같은 내용. 잘 읽히면서도 자원을 덜 쓰는 방법을 선택하는 것이 좋다.
def solution(my_string, n):
answer = ''
if 1 <= len(my_string) <= 1000 and 1 <= n <= len(my_string):
answer = my_string[:n]
return answer
def solution(my_string, n):
return my_string[:n]
requests data crawling 데이터 크롤링
import requests
파이썬으로 데이터를 받고 보내고 하겠다.
외부라이브러리니까 터미널에서 받아오세요 pip install requests
데이터 수집(다양한 방법) -> 데이터 분석/처리(데이터 가공) -> 인공지능 모델 학습 -> 인공지능 모델 평가 -> 사용
https hypertext transfer protocol secure
request 요청 - response 응답
client 요청하는 자(웹브라우저: crom, edge) - server 정보 보여주는 자(서버)
html hypertext markup language 웹사이트를 표현하기 위한 언어: 시각적으로 번역해준다고 할 수 있다.
tag <html></html> 태그와 태그 사이
html parsing 파싱 : 잘 읽고 분석하는 거. 걸러내는 것.
import requests
url = "https://www.naver.com/"
response = requests.get(url)
html = response.text
status = response.status_code # status code
print(status)
print(html)
crawling 크롤링
웹사이트(website), 하이퍼링크(hyperlink), 데이터(data), 정보 자원을 자동화된 방법으로 수집, 분류, 저장하는 것.
크롤링을 위해 개발된 소프트웨어를 크롤러(crawler)라 한다. 크롤러는 주어진 인터넷 주소(URL)에 접근하여 관련된 URL을 찾아내고, 찾아진 URL들 속에서 또 다른 하이퍼링크(hyperlink)들을 찾아 분류하고 저장하는 작업을 반복함으로써 여러 웹페이지를 돌아다니며 어떤 데이터가 어디에 있는지 색인(index)을 만들어 데이터베이스(DB)에 저장하는 역할을 한다.
크롤링과 유사 개념으로 소프트웨어를 통해 대상 웹사이트와 같은 데이터 소스에서 데이터 자체를 추출하여 특정 형태로 저장하는 스크래핑(scraping) - 데이터 스크래핑(data scraping)이라고도 한다 - 이 있다. 빅데이터 분석에서는 크롤링을 통해 필요한 데이터가 어디 있는지 알아내고, 이를 스크래핑을 통해 수집, 저장 하여 분석에 사용하는 것처럼 두 기술을 결합하여 사용하기도 한다.
크롤링 기술이 악용되어 정보를 무단으로 복제하게 되면 지식재산권 침해 문제가 발생할 수 있다. 이러한 경우를 사전에 방지하기 위해 웹 페이지 소유자는 웹 페이지에 로봇 배제 표준(robots exclusion standard)을 사용하여 접근 제한에 대한 설명을 robots.txt에 기술한다. 또는 ‘noindex’ 메타 태그(meta tag)를 사용하여 크롤러로 검색 색인이 생성되는 것을 차단할 수 있다.
(IT용어사전, 한국정보통신기술협회)
http 상태 코드
# 요청 성공
200 : OK
# 다른 페이지로 바로 연결
302 : 리다이렉트
# 클라이언트 리퀘스트에 오류가 있는 경우
400 : 요청이 잘못됨 Bad Request
401 : Unauthorized 비인증됨
403 : Forbidden 접근 권한 없음
404 : Not Found 요청받은 내용이 없음 (요청을 안한 게 아니라..) 주소 오류일 때가 가장 많음
405 : Method Not All 접근 방법이 잘못됨
500 : Internal Server Error 서버 에러. 개발을 잘못한 경우가 많음
501 : Not Implemented 구현 안됨
502 : Bad Gateway 잘못된 응답. 보통 서버 운영프로그램 문제
파이썬으로 데이터 크롤링하기 (웹이 아니라)
URL 구조
프로토콜: //호스트주소:포트번호/경로?쿼리
ip 주소 : 숫자로 된, 인터넷에 연결된 특정 컴퓨터 서버를 가리킬 때 사용.
domain: 별명.
포트번호: 서버가 말하길 서버에 문이 많은데 이 문으로만 주고 받을 거야.
※ 주소창에서는 16진수로만 쓰기로 해서 주소창에서 다른 곳으로 복붙하면 글자가 깨진다.
쿼리 : 경로와 다른 추가적인 데이터. 검색페이지 같은 거. 미리 만들어두기 어려운 페이지들.
https://naver.com/경로?~~~~~~~~~
물음표 뒤에 쿼리이름=값&쿼리이름=값 이런 식으로 씀
(query=치킨) 쿼리에 치킨을 집어 넣어서 검색을 요청한다.
import requests
search_url = " https://search.naver.com/search.naver?sm=tab_hty.top&where=image&query= "
keyword = "맥주"
url = search_url + keyword
response = requests.get(url)
# print(response.text)
print(type(response.text))
BeautifulSoup
html 파싱(parsing)
새 터미널 열고 받아오세용 pip install beautifulsoup4 입력
request에서 요청하고 불러오면 파싱한다.
html을 객체 구조화해서 사용
from bs4 import BeautifulSoup
# html 태그 구조를
<태그이름 속성=속성값>내용</태그이름>
<html><head></head><body></body></html>
# 아래와 같이 객체 구조로 사용할 수 있게 만들어주는
html.head
html.body
html = "<html><body>Hello</body></html>" # html 문자열
soup = BeautifulSoup(html, "html.parser")
# 객체를 만드는 작업. "" 안의 내용은 어떤 식으로 파싱할 건지 정해주는 것.
print(soup)
print(type(soup))
print(soup.body.text) # 멤버접근 연산자 . 으로 구조 표현. 객체형태로 사용가능.
print(type(soup.body.text))
print(type(response.text)) # <class 'str'>
parsing 파싱
컴퓨터에서 컴파일러 또는 번역기가 원시 부호를 기계어로 번역하는 과정의 한 단계로, 각 문장의 문법적인 구성 또는 구문을 분석하는 과정. 즉 원시 프로그램에서 나타난 토큰(token)의 열을 받아들여 이를 그 언어의 문법에 맞게 구문 분석 트리(parse tree)로 구성해 내는 일이다. 파싱은 크게 하향식 파싱과 상향식 파싱으로 나눌 수 있다.
(IT용어사전, 한국정보통신기술협회)
Syntactic Analysis 구문 분석
문장, 즉 일련의 문자열을 자연어의 경우 형태소로 분리하고, 해당 구문론적 관계를 도식화하여 명확히 하는 분석 절차이다. 프로그래밍 언어의 경우 넓은 의미로는 문자열(소스 코드)로부터 일련의 자구(token)를 추출하는 전처리 단계인 어휘 분석과 토큰들로부터 파스트리(parse tree) 혹은 구문트리(syntax tree)를 만드는 후처리 단계의 두 단계를 합한 일련의 처리 단계를 구문분석이라고 한다. 좁은 의미로는 어휘 분석으로 생성된 토큰을 입력으로 하여 구문트리를 생성하는 후처리 단계만을 구문분석이라고 부르기도 한다.
일반적으로 프로그램의 컴파일은 어휘분석 혹은 스캔, 구문분석, 의미분석, 중간표현 생성, 코드 생성 등의 단계로 이루어지는데, 구문분석은 인터프리터나 컴파일러에 포함된 구문분석기, 즉 파서(parse)가 담당하는 주요 작업이다. 파서는 어휘분석 결과물인 일련의 토큰으로부터 구조적인 구문트리를 생성하여 구문분석을 수행하는 프로그램이다. 이는 프로그래밍 언어학, 자연어처리, 기계 번역 등의 분야에 적용되는 기술로 이들 연구에서는 인간의 자연어를 분석하기 위해 이러한 구문 분석 기법을 적용하고자 한다.
접근 방법에 따라 하향식 구문 분석과 상향식 구문 분석으로 나눌 수 있는데, 하향식 구문 분석은 문장을 좌측에서 우측으로 한 문자씩 읽으며 뿌리노드로부터 시작하여 단말노드를 생성하는 방식이다. 반대로 상향식 구문 분석은 트리를 단말노드부터 뿌리노드를 향하여 위쪽 방향으로 파스트리를 생성해나가는 방식이다.
(두산백과 두피디아, 두산백과)
Parsing 파싱, Parser 파서, 구문 분석 :: bpDev (tistory.com)
맥주 이미지 불러오기
import requests
from bs4 import BeautifulSoup
search_url = " https://www.google.com/search?tbm=isch&q= "
keyword = "맥주"
url = search_url + keyword
response = requests.get(url)
html = response.text
soup = BeautifulSoup(html, "html.parser")
print(soup.body.div) # body 내용 호출됨
print(soup.find('div'))
print(soup.find_all('div')) # div를 리스트 형태로 가져온다.
print(soup.find_all('div')[4]) # 4번째 div
images = soup.find_all('img', attrs={'class': ['_image', '_listimage']})
print(type(images))
# # # container = soup.find('div', attrs={'id': 'container'})
imgs = soup.find_all('img') # 이미지 태그들
img = imgs[1] # 첫번째 이미지 태그
print(img['src']) # 주소만 쏙 빼옴
import os # 운영체제 작동하게
folder_name = "imgs" # '이미지들' 이름 변수에 넣고
if not os.path.exists(folder_name):
# 만약 폴더네임이라는 폴더가 존재하지 않는다면
os.mkdir(folder_name)
# 폴더네임이라는 폴더를 만들어라
for idx, img in enumerate(imgs[1:]):
# 반복하면서 idx와 i에 인덱스 번호를 매기고 1부터 수를 올려라
#enumerate [(0, 1번요소), (1, 2번 요소)]
print(idx, "번째 이미지 저장")
# 위에서 받은 idx 수랑 "번째 이미지 저장"을 출력하라
file_name = f"{keyword}_{idx}.gif"
# file_name에 검색한 명칭과 인덱스번호(순서)와 .확장자를 붙인 문자열을 할당하라
file_path = os.path.join(folder_name, file_name)
# file_path에 folder_name과 file_name이 합쳐진 경로를 할당하라
img_response = requests.get(img['src']) # 요청한 이미지를 찾아와라
# print(img_data) # 이미지 데이터가 2진 컴퓨터 언어로 출력됨
img_data = img_response.content
# 요청한 이미지에 있는 내용을 img_data에 할당한다.
with open(file_path, "wb") as f:
# os를 통해서 file_path에 할당된 경로로,
2진수 형식의 파일을 아랫줄 내용으로 생성해서(써서) 저장하라.
f.write(img_data) # 내용: 요청한 이미지 데이터
# with문을 쓸 수 있기 위해 변수들을 만들어 줌.
웹 CSS class 속성의 이름을 활용해서 정보를 찾는다.
container = soup.find_all('img', attrs={'class':['rg_i Q4LuWd']})
print(container)
# enumerate 번호 붙여주는 이터러블 돌려서
li1 = ["김연아", "류현진", "손흥민"]
for name in enumerate(li1):
print(name)
""" 결과출력
(0, '김연아')
(1, '류현진')
(2, '손흥민')
"""
# 다시 쓸 것이다: 저장한다
# 셀레니움(selenium)??? 나중에 찾아보세요. ????
News crawling 뉴스 크롤링
import requests # 정보 요청
import os
from bs4 import BeautifulSoup # 객체 형태로 파싱해줌
folder_name = "네이버 과학 뉴스"
file_name = f"{folder_name}.txt"
if not os.path.exists(folder_name): # 만약 폴더네임이라는 폴더가 존재하지 않는다면
os.mkdir(folder_name)
file_path = os.path.join(folder_name, file_name)
# file_path에 folder_name과 file_name이 합쳐진 경로를 할당하라
url = " https://news.naver.com/main/main.naver?mode=LSD&mid=shm&sid1=105 "
# headers={"User-Agent": "Mozilla/5.0"} 크롤링 방지 회피
response = requests.get(url, headers={"User-Agent": "Mozilla/5.0"})
html = response.text
soup = BeautifulSoup(html, "html.parser") # 객체화 했다.
div = soup.body.find('div', attrs={'class': 'list_body'})
headlines = div.find_all('a', attrs={'class': 'cluster_text_headline'})
for headline in headlines:
cont_text = headline.text.strip()
# # 텍스트 파일 만들어서 저장하세요~
with open(file_path, "a", encoding='utf-8') as f:
f.write(cont_text)
# f.write("\n")
article_response = requests.get(headline['href'])
article_soup = BeautifulSoup(article_response.text, "html.parser")
article = article_soup.find('div', attrs={"id": "dic_area"})
for article1 in article:
cont_cont = article1.text.strip()
with open(file_path, "a", encoding='utf-8') as f:
f.write(cont_cont)
f.write("\n")
# f.write("\n")
pip
pip install requests
pip install BeautifulSoup
https://www.crummy.com/software/BeautifulSoup/bs4/doc/
https://pypi.org/project/beautifulsoup4/
오픈 함수의 매개 변수 종류
# 읽기 모드로 파일 열기
with open('file.txt', 'r') as f:
content = f.read()
print(content)
# 쓰기 모드로 파일 열고 내용 쓰기
with open('file.txt', 'w') as f:
f.write('Hello, world!')
# 이어쓰기 모드로 파일 열고 내용 추가하기
with open('file.txt', 'a') as f:
f.write('\nHow are you.')
# 읽기 모드로 이진 파일 열기
with open('binary_file.bin', 'rb') as f:
content = f.read()
# 쓰기 모드로 이진 파일 열기
with open('binary_file.bin', 'wb') as f:
f.write(b'\x00\x01\x02\x03\x04')
# 읽기 모드로 텍스트 파일 열기
with open('example.txt', 'rt') as f:
content = f.read()
# 텍스트 파일 읽고 쓰기 모드 열기
with open('example.txt', 'r+t') as f:
content = f.read()
f.write('Nice to meet you.')