본문 바로가기

분류 전체보기261

[API 데이터 수집, 활용] 트위터(X)에서 데이터 수집하기 개인계정은 더 이상 api를 사용할 수 없다...# !pip3 install requests-oauthlib# https://api.twitter.com/1.1/statuses/home_timeline.json은 사용자의 타임라인을 나타내는 JSONimport osfrom requests_oauthlib import OAuth1Sessionimport osfrom dotenv import load_dotenvload_dotenv()# 환경변수에서 인증 정보를 추출합니다.CONSUMER_KEY = os.getenv('CONSUMER_KEY')CONSUMER_SECRET = os.getenv('CONSUMER_SECRET')ACCESS_TOKEN = os.getenv('ACCESS_TOKEN')ACCESS_.. 2025. 1. 1.
[변화 감지하기] 크롤링 대상의 변화에 대응하기 정규 표현식으로 가격이 제대로 나오는지 확인하기import revalue = '3,000'# 숫자와 쉼표만을 포함한 정규 표현식에 매치하는지 확인합니다.if not re.search(r'^[0-9,]+$', value): # 값이 제대로 돼 있지 않다면 예외를 발생시킵니다. raise ValueError('Invalid price')Voluptuous로 유효성 검사하기# pip install voluptuousfrom voluptuous import Schema, Match # 다음 4개의 규칙을 가진 스키마를 정의합니다schema = Schema({ # 규칙1: 객체는 dict 자료형 'name': str, # 규칙2:na.. 2025. 1. 1.
[CacheControl] 변경된 데이터만 추출하기 캐시와 관련된 HTTP 헤더HTTP 헤더설명Last-Modified콘텐츠의 최종 변경일을 나타냅니다ETag콘텐츠의 식별자를 나타냅니다. 콘텐츠가 변경되면 ETag의 값도 함께 바뀌게 됩니다Cache-Control콘텐츠를 캐시해도 괜찮은지 등의 캐시 방침을 나타냅니다PragmaCache-Control과 비슷한 것이었지만 현재는 하위 호환성 때문에 남아 있습니다Expires콘텐츠의 유효 기간을 나타냅니다CacheControl을 사용해 캐시 처리하기import requests# pip install CacheControlfrom cachecontrol import CacheControl session = requests.session()# session을 래핑한 cached_session 만들기cached_.. 2025. 1. 1.
[HTTP 통신 오류] HTTP 상태 코드 & 파이썬에서 오류 처리하기 상태 코드설명100 Continue요청이 연결돼 있습니다.200 OK요청이 성공했습니다301 Moved Permanently요청한 리소스가 영구적으로 이동했습니다302 Found요청한 리소스가 일시적으로 이동했습니다.304 Not Modified요청한 리소스가 변경되지 않았습니다400 Bad Request클라리언트의 요청에 문제가 있으므로 처리할 수 없습니다401 Unauthorized인증되지 않았으므로 처리할 수 없습니다403 Forbidden요청이 허가되지 않습니다404 Not Found요청한 리소스가 존재하지 않습니다408 Request Timeout(*)일정 시간 내에 요청이 완료되지 않았습니다500 Internal Server Error(*)서버 내부에 문제가 발생했습니다502 Bad Gatew.. 2025. 1. 1.
[크롤러 만들기] 파이썬으로 크롤러 만들기 목록 페이지에서 URL 목록 추출하기import requestsimport lxml.htmlresponse = requests.get('http://www.hanbit.co.kr/store/books/new_book_list.html')root = lxml.html.fromstring(response.content)for a in root.cssselect('.view_box a'): url = a.get('href') print(url)코드 설명코드에서 `root.cssselect('.view_box a')`는 HTML 문서에서 특정 요소들을 선택하기 위해 CSS 선택자를 사용하는 부분입니다. 여기서 `.view_box a`는 다음과 같은 의미를 가집니다:1. `.view_box`: 클래스 .. 2025. 1. 1.
[MySQL 접속] 파이썬에서 MySQL에 저장하기 !pip3 install pymysqlimport pymysqlpymysql.install_as_MySQLdb()import MySQLdbprint("mysqlclient is installed and working!")import MySQLdb# 데이터베이스 연결 테스트connection = MySQLdb.connect( host="localhost", user="****", passwd="**********", db="scraping")print("Connected to the database successfully!")connection.close() import MySQLdb# MySQL 서버에 접속하고 연결을 변수에 저장합니다.# 사용자 이름과 비밀번호를 지정한 뒤 scra.. 2025. 1. 1.
[RSS 스크레이핑] feedparser로 RSS 스크레이핑하기 import feedparser# 알라딘 도서 RSS를 읽어 들입니다.d = feedparser.parse('http://www.aladin.co.kr/rss/special_new/351')# 항목을 순회합니다.for entry in d.entries: print('이름:', entry.title) print('링크:', entry.link) print() 2024. 12. 31.
[RSS 스크레이핑] feedparser 이해하기 pip install feedparser>>> import feedparser# parse() 함수에 파일 경로, 파일 객체, XML 문자열 등을 지정합니다.>>> d = feedparser.parse('it.rss')# parse() 함수에 URL을 지정하면 피드를 파싱할 수 있습니다.>>> d = feedparser.parse('www.aladin.co.kr/rss/new_all/351')>>> d.version # 피드의 버전을 추출합니다'rss20'》 type(d) # parse() 함수의 반환값은 FeedParserDict 객체입니다.>>> d.feed.title # 피드의 타이틀을 추출합니다.'분야별 신간 특선 - 컴퓨터/모바일'》 d['feed']['title'] # 딕셔너리처럼 사용할 수도.. 2024. 12. 31.
[Beautiful Soup] Beautiful Soup로 스크레이핑하기 from bs4 import BeautifulSoup# HTML 파일을 읽어 들이고 BeautifulSoup 객체를 생성합니다.with open('full_book_list.html') as f: soup = BeautifulSoup(f, 'html.parser')# find_all() 메서드로 a 요소를 추출하고 반복을 돌립니다.for a in soup.find_all('a'): # href 속성과 글자를 추출합니다. print(a.get('href'), a.text) 2024. 12. 31.
[Beautiful Soup] 이해하기 from bs4 import BeautifulSoup# 첫 번째 매개변수에 파일 객체를 지정해 BeautifulSoup 객체를 생성합니다.# BeautisulSoup()에는 파일 이름 또는 URL을 지정할 수 없습니다.# 두 번째 매개변수에는 파서의 종류를 지정합니다.>>> with open('full book_list.html') as f:... soup = BeautifulSoup(f, 'html.parser')# BeautifuSoup 생성자에는 HTML 문자열을 전달할 수도 있습니다.›> soup = BeautifulSoup(""'... ... ... ... 오늘의 과일... ... ... ... 포도... ... ... ''', 'html.parser')》 soup.h1 # Soup.h1.. 2024. 12. 31.
[lxml] lxml로 스크레이핑 import lxml.html# HTML 파일을 읽어 들이고, getroot() 메서드로 HtmlElement 객체를 생성합니다.tree = lxml.html.parse('full_book_list.html')html = tree.getroot()# cssselect() 메서드로 a 요소의 리스트를 추출하고 반복을 돌립니다.for a in html.cssselect('a'): # href 속성과 글자를 추출합니다. print(a.get('href'), a.text) 2024. 12. 31.
[lxml] lxml 기본 사용법 이해 # lxml로 스크레이핑하기!pip3 install lxml!pip3 install cssselectimport sysimport sslfrom urllib.request import urlopenssl._create_default_https_context = ssl._create_unverified_contextf = urlopen('https://www.hanbit.co.kr/store/books/full_book_list.html')# HTTP 헤더를 기반으로 인코딩 방식을 추출합니다(명시돼 있지 않을 경우 utf-8을 사용하게 합니다).encoding = f.info().get_content_charset(failobj="utf-8")# 인코딩 방식을 표준 오류에 출력합니다.print('encod.. 2024. 12. 31.
[Request] 웹 페이지 간단하게 추출하기 》 import requests # 라이브러리를 읽어 들입니다.r = requests.get('http://hanbit.co.kr') # get() 함수로 웹 페이지를 추출합니다.》 type(r) # get() 함수의 반환값은 Response 자료형입니다.‹class 'requests models Response'>》 .status_code # status_code 속성으로 HTTP 상태 코드를 확인합니다.200》 r.headers['content-type'] # headers 속성으로 HTTP 헤더를 딕셔너리로 추출합니다.'text/html; charset=UTF-8'》 r.encoding # encoding 속성으로 HTTP 헤더를 기반으로 인코딩을 추출합니다.'UTF-8'>>> r.text # te.. 2024. 12. 31.
[스크레이핑 흐름] 파이썬으로 스크레이핑하는 흐름 import sqlite3def fetch_and_print_data(db_path): """ SQLite 데이터베이스에서 저장된 도서 데이터를 추출하고 출력합니다. """ # 데이터베이스를 다시 엽니다. conn = sqlite3.connect(db_path) c = conn.cursor() # 저장한 데이터를 추출합니다. c.execute('SELECT * FROM books') # 쿼리의 결과는 fetchall() 메서드로 추출할 수 있습니다. for row in c.fetchall(): # 추출한 데이터를 출력합니다. print(row) # 연결 종료 conn.close()if __name__ == '__ma.. 2024. 12. 31.
[저장하기] 데이터베이스(SQLite3)에 저장하기 import sqlite3# top_cities.db 파일을 열고 연결을 변수에 저장합니다.conn = sqlite3.connect('top_cities.db')# 커서를 추출합니다.c = conn.cursor()# execute() 메서드로 SQL 구문을 실행합니다.# 스크립트를 여러 번 사용해도 같은 결과를 출력할 수 있게 cities 테이블이 존재하는 경우 제거합니다.c.execute('DROP TABLE IF EXISTS cities')# cities 테이블을 생성합니다.c.execute(''' CREATE TABLE cities ( rank integer, city text, population integer )''')# execute() 메서드의.. 2024. 12. 31.
[저장하기] JSON 형식으로 저장하기 import jsoncities = [ {'rank': 1, 'city': '상하이', 'population': 24150000}, {'rank': 2, 'city': '카라치', 'population': 23500000}, {'rank': 3, 'city': '베이징', 'population': 21516000}, {'rank': 4, 'city': '텐진', 'population': 14722100}, {'rank': 5, 'city': '이스탄불', 'population': 14160467},]# 사람이 읽기 쉬운 형태로 출력# 2개의 공백으로 들여쓰기print(json.dumps(cities, ensure_ascii=False, indent=2))# json 형식으로 저.. 2024. 12. 31.
[저장하기] CSV 형식으로 저장하기 # 중첩 리스트를 CSV 형식으로 저장하기import csv# 파일을 엽니다. newline=''으로 줄바꿈 코드의 자동 변환을 제어합니다.with open('top_cities.csv', 'w', newline='', encoding='utf-8') as f: # csv.writer는 파일 객체를 매개변수로 지정합니다. writer = csv.writer(f) # 첫 번째 줄에는 헤더를 작성합니다. writer.writerow(['rank', 'city', 'population']) # writerows()에 리스트를 전달하면 여러 개의 값을 출력합니다. writer.writerows([ [1, '상하이', 24150000], [2, '카.. 2024. 12. 31.
[RSS 파싱] XML(RSS) 스크레이핑 # 기상청 RSS 다운로드# 서울/경기도 지역의 중기 예보 날씨# http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=109# ElementTree 모듈을 읽어 들입니다.from xml.etree import ElementTree# parse() 함수로 파일을 읽어 들이고 ElementTree 객체를 만듭니다.tree = ElementTree.parse('rss.xml')# getroot() 메서드로 XML의 루트 요소를 추출합니다.root = tree.getroot()# findall() 메서드로 요소 목록을 추출합니다.# 태그를 찾습니다(자세한 내용은 RSS를 열어 참고해주세요).for item in root.findall('channel/i.. 2024. 12. 31.
[스크레이핑] 정규 표현식으로 스크레이핑 import refrom html import unescape# 이전 절에서 다운로드한 파일을 열고 html이라는 변수에 저장합니다.with open('dp.html') as f: html = f.read()# re.findall()을 사용해 도서 하나에 해당하는 HTML을 추출합니다.for partial_html in re.findall(r'', html, re.DOTALL): # 도서의 URL을 추출합니다. url = re.search(r'', partial_html).group(1) url = 'http://www.hanbit.co.kr' + url # 태그를 제거해서 도서의 제목을 추출합니다. title = re.sub(r'', '', partial_html) .. 2024. 12. 31.
[문자 코드 다루기] meta 태그에서 인코딩 방식 추출하기 import reimport sysfrom urllib.request import urlopenf = urlopen('http://www.hanbit.co.kr/store/books/full_book_list.html')# bytes 자료형의 응답 본문을 일단 변수에 저장합니다.bytes_content = f.read() # charset은 HTML의 앞부분에 적혀 있는 경우가 많으므로# 응답 본문의 앞부분 1024바이트를 ASCII 문자로 디코딩해 둡니다.# ASCII 범위 이위의 문자는 U+FFFD(REPLACEMENT CHARACTER)로 변환되어 예외가 발생하지 않습니다.scanned_text = bytes_content[:1024].decode('ascii', errors='replace')#.. 2024. 12. 31.