본문 바로가기

Data science/크롤링

(24)
SelectorList 객체 메서드 정리 메서드설명extract()노드 목록을 문자열 list로 추출extract_list()노드 목록의 첫 번째 요소를 문자열로 추출re(regex)노드 목록에서 매개변수로 지정한 정규 표현식에 해당하는 노드 중에서 첫 번째 것만 문자열 list로 추출re_first(regex)노드 목록에서 매개변수로 지정한 정규 표현식에 해당하는 노드 중에서 첫 번째 것만 문자열 list로 추출css(query)노드 목록 요소에 대해 매개변수로 지정한 CSS 선택자에 해당하는 목록을 SelectorList로 추출xpath(query)노드 목록 요소에 대해 매개변수로 지정한 XPath(query)에 해당하는 목록을 SelectorList로 추출
PDF 파싱 import sysfrom pdfminer.converter import PDFPageAggregatorfrom pdfminer.layout import LAParams, LTContainer, LTTextBoxfrom pdfminer.pdfinterp import PDFPageInterpreter, PDFResourceManagerfrom pdfminer.pdfpage import PDFPagedef find_textboxes_recursively(layout_obj): ''' 재귀적으로 텍스트 박스(LTTextBox)를 찾고 텍스트 박스들을 리스트로 반환한다. ''' # LTTextBox를 상속받은 객체의 경우 리스트에 곧바로 넣어서 반환한다. if isinstance..
유튜브 크롤링 import osfrom apiclient.discovery import build# 환경변수에서 API 키 추출하기YOUTUBE_API_KEY = os.environ.get('YOUTUBE_API_KEY')'''YouTube API 클라이언트를 생성build() 함수의 첫 번째 매개변수에는 API 이름두 번째 매개변수에는 API 버전을 지정한다.키워드 매개변수 developerKey에는 API 키를 지정한다.'''youtube = build('youtube', 'v3', developerKey=YOUTUBE_API_KEY)'''키워드 매개변수로 매개변수를 지정하고search.list 메서드를 호출한다.list() 메서드를 실행하면 googleapiclient.http.HttpRequest가 반환 된다...
Mac API 환경변수 설정 1. 터미널을 열기 이후open -e ~/.zshrcexport [key_name]='api_key' (쉼표 써야함)source ~/.zshrcecho $[key_name] 안전하고 깔끔하게 api key를 사용할 수 있다.
email 보내기 import smtplibfrom email.mime.text import MIMETextfrom email.header import Header# MIMEText 객체로 메일을 생성한다.msg = MIMEText('메일 본문')# 제목에 한글이 포함될 경우 Header 객체를 사용한다.msg['Subject'] = Header('메일 제목', 'utf-8')msg['From'] = 'me@example.com'msg['To'] = 'you@example.com'# SMTP의 첫 번쨰 매개변수에 SMTP 서버의 호스트 이름을 지정한다.with smtplib.SMTP('localhost') as smtp: # 메시지 전송 smtp.send_message(msg)
Schema(크롤링 대상의 변화) from voluptuous import Schema, Matchschema = Schema({ # 규칙 1 객체는 dict 자료형 'name' : str, # 규칙 2 name은 str 자료형 'price' : Match(r'^[0-9,]+$') # 규칙 3 price가 정규 표현식에 맞는지 확인}, required=True) # 규칙 4 dict의 키는 필수# Schema 객체는 함수처럼 호출해서 사용한다.# 매개변수에 대상을 넣으면 유효성 검사를 수행한다.schema({ 'name' : '포도', 'price' : '3,000'})schema({ 'name' : None, 'price' : '3,000',}) # 유효성 검사 탈락
session, Cached import requestsfrom cachecontrol import CacheControlsession = requests.session()# session을 래핑한 cached_session 만들기cached_session = CacheControl(session)# 첫 번째는 캐시돼 있지 않으므로 서버에서 추출한 이후 캐시한다.response = cached_session.get('https://docs.python.org/3/')print(response.from_cache)# ETag와 Last-Modified 값을 사용해 업데이트됐는지 확인한다.# 변경사항이 없는 경우에는 콘테츠를 캐시에서 추출해서 사용하므로 빠른 처리가 가능하다.response = cached_session.get('htt..
Error 처리 (2) import requestsfrom retrying import retry# stop_max_attempt_number로 최대 재시도 횟수를 지정한다.# wait_exponential_multiplier로 특정한 시간 만큼 대기하고 재시도하게 한다. 단위는 밀리초@retry(stop_max_attempt_number=3, wait_exponential_multiplier=1000)def main(): response = fetch('https://httpbin.org/status/200,404,503') if 200
Error 처리 (1) import timeimport requests# 일시적인 오류를 나타내는 상태 코드를 지정한다.TEMPORARY_ERROR_CODES = (408, 505, 502, 503, 504)def main(): response = fetch('https://httpbin.org/status/200,404,503') if 200 = max_retries: # 재시도 횟수 상한을 넘으면 예외 발생 raise Exception('Max retries exceeded') # 지수 함수적으로 재시도 간격을 증가시킨다. wait = 2 ** (retries - 1) print('Waiting {0}..
robots import urllib.robotparserrp = urllib.robotparser.RobotFileParser()# set_url로 robots.txt URL을 설정한다.rp.set_url('https://www.donga.ac.kr/robots.txt')# read로 robots.txt를 읽어 들인다.print(rp.read())# can_fetch의 첫 번째 매개변수에는 User-Agent 문자열,# 두 번째 매개변수에 URL을 지정하면 해당 URL을 크롤링해도 괜찮은지 알 수 있다.print(rp.can_fetch('mybot', 'https://www.donga.ac.kr/'))
절대경로, 상대경로 import requestsimport lxml.htmldef main(): """ 세션을 사용하면 쿠키와 같은 상태 정보를 저장할 수 있고, 요청(Request)과 응답(Response) 사이에 연결 상태를 유지할 수 있다. 이를 이용하면 사용자 인증이 필요한 웹 사이트에 접근할 수 있거나, 쿠키를 사용해서 접근 제한이 걸려 있거나, 상태 정보가 저장되어 있는 웹 사이트에 지속적인 접근이 가능하다. """ session = requests.Session() # scrape_list_page() 함수를 호출해서 제너레이터를 추출한다. response = session.get('https://www.hanbit.co.kr/store/books/new_book_list...
MySqldb import MySQLdb# MySQL 서버에 접속하고 연결을 변수에 저장한다.# 사용자 이름과 비밀번호를 저장한 뒤 scraping 데이터베이스를 사용한다.# 접속에 사용할 문자 코드는 utf8mb4로 지정한다.conn = MySQLdb.connect(db='scraping', user='scraper', passwd='password', charset='utf8mb4')# 커서를 추출한다.C = conn.cursor()# execute() 메서드로 SQL 구문을 실행한다.C.execute('DROP TABLE IF EXISTS cities')#cities 테이블을 생성한다C.execute(''' CREATE TABLE cities( rank integer, citiy t..
RSS import feedparser# parse 함수에 파일 경로, 파일 객체, xml 문자열 등을 지정한다.d = feedparser.parse('it.rss')# parse 함수에 URL을 지정하면 피드를 파싱할 수 있다.d = feedparser.parse('http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108')print(d.version) # 피드이 버전을 추출한다.# parse 함수의 반환값은 FeedParserDict 객체이다.print(type(d))# 피드의 타이틀을 추출한다.print(d.feed.title)# 딕셔너리 사용print(d['feed']['title'])# 피드 링크 추출print(d.feed.link)# 피드 ..
BeautifulSoup from bs4 import BeautifulSoupwith open('dp.html', 'r') as f: soup = BeautifulSoup(f, 'html.parser')# find_all 메서드로 a 요소를 추출하고 반복을 돌린다.for a in soup.find_all('a'): print(a.get('href'), a.text)
lxml import lxml.html# parse() 함수로 파일 경로를 지정할 수 있다.tree = lxml.html.parse('dp.html')# parse() 함수로 URL을 지정할수도 있지만 추출할 떄 미세한 설정을 할 수 없으므로 추천하지 않는다.# tree = lxml.html.parse('https://gokimkq123.github.io/CV.github.io/')# 파일 객체를 지정해서 파싱할 수도 있다.from urllib.request import urlopentree = lxml.html.parse(urlopen('https://gokimkq123.github.io/CV.github.io/'))print(type(tree))html = tree.getroot() # getroot() 메서..
Python 크롤링 함수설명urlopen(URL)url의 기본 데이터를 가져온다.info().get_content_charset(failobj='')문자열로 디코딩 하기 위해 웹페이지의 인코딩 방식을 알아낸다failobj 는 정보를 못 받아왔을때 default로 할 인코딩 방식 지정.read().decode(encoding)웹페이지를 디코딩 하는 형식re.findall(정규식, 문자열, 옵션)정규식과 매치되는 모든 문자열을 리스트로 가져온다이때 re.DOTALL은 .메타 문자는 \n을 매치하지 않는데 \n도 매치되도록 하는 옵션이다re.search()정규식으로 문자열 매치 하는 함수이때 group()은 정규식이 ()으로 묶인걸 인덱스로 나타내준다group(0)은 전체 매치 내용group(1)은 (첫번째 그룹)내용re.sub..
Python 정규 표현식 정리
re 모듈로 스크레이핑 실습 # 정규 표현식으로 스크레이핑하기 import re from html import unescape with open('dp.html') as f: html = f.read() # 전에 저장시킨 dp파일을 열고 html 변수에 저장 for temp_html in re.findall(r'
re 모듈 기본 사용법 import re # re 모듈 사용 print(re.search(r'a.*c','abc123DEF')) # re.search 함수는 두 번째 매개변수의 문자열이 첫 번째 매개변수의 정규 표현식에 맞는지 확인할 수 있다. print(re.search(r'a.*d','abc123DEF')) # 만약 첫 번째 매겨변수의 표현식에 맞지 않으면 none을 반환한다. print(re.search(r'a.*d','abc123DEF',re.I)) # re.I를 지정하면 대소문자를 무시한다. m = re.search(r'a(.*)c','abc123DEF') print(m.group(0)) # group 메서드로 일치한 값을 추출한다. # 매개변수에 0을 지정하면 매치된 모든 값을 반환한다. # 매개변수에 n(자연수)을..
html 인코딩 방식 추출 HTTP 헤더에서 인코딩 방식 추출하기 #인코딩 방식을 추출하고 디코딩후 dp.html에 저장시키기 import sys from urllib.request import urlopen f = urlopen('http://hanbit.co.kr/store/books/full_book_list.html') file = open('dp.html','w') encoding = f.info().get_content_charset(failobj="utf-8") # HTTP 헤더를 기반으로 인코딩 방식 추출(값이 없다면 utf-8을 기본으로 사용) print('encoding:',encoding,file=sys.stderr) # 인코딩 방식을 표준 오류에 출력 text = f.read().decode(encoding)..
urllib 기초 from urllib.request import urlopen # urllib 헤더 모듈 사용 f = urlopen('http://hanbit.co.kr') # urlopen()는 HTTPResponse 자료형의 객체를 반환 print(f.read()) # read() 메서드로 HTTP 응답 본문(bytes 자료형)을 추출 print(f.getheader('Content-Type')) # http 헤더의 값을 추출
Wget 실습(원하는 부분 가져오기) 사용 사이트 : https://www.hanbit.co.kr/store/books/full_book_list.html 한빛출판네트워크 더 넓은 세상, 더 나은 미래를 위한 아시아 출판 네트워크 :: 한빛미디어, 한빛아카데미, 한빛비즈, 한빛라이프, 한빛에듀 www.hanbit.co.kr wget https://www.hanbit.co.kr/store/books/full_book_list.html 이런 file이 생성되고 들어가서 html코드를 살펴본다. a태그로 묶인 부분이 책의 제목을 나타낸다. 제목만 가져올려면 정규표현 식을 사용하면 되지만 너무 어려워서 생략해야 할 거 같다.
Wget 실습(실제 사이트 크롤링) 크롤링 사이트 : https://www.hanbit.co.kr/ 한빛출판네트워크 더 넓은 세상, 더 나은 미래를 위한 아시아 출판 네트워크 :: 한빛미디어, 한빛아카데미, 한빛비즈, 한빛라이프, 한빛에듀 www.hanbit.co.kr 주의 : 서버에 무리가 갈 수 있기 때문에 다음과 같이 옵션을 준다. 1. -l 옵션 : 링크를 한 번만 더 타고 들어가기 2. -w 옵션 : 다운로드 간격을 1초로 지정 3. -np 부모 디렉토리는 크롤링 x 4. --restrict-file-name=nocontrol로 URL에 한국어 등이 포함돼 있을 경우 한국어 파일명으로 저장. wget -r -np -w 1 -l 1 --restrict-file-name=nocontrol https://www.hanbit.co.kr/
Wget 옵션 옵션 설명 -V Wget의 버전 출력 -h 도움말 출력 -q 진행 상황 등을 출력 x -O file에 저장 -c 이전 상태에서 계속 이어서 파일 다운 -r 링크를 돌며 재귀적으로 다운 -l depth 재귀적으로 다운할 때 depth깊이로 제한 -w 재귀적으로 다운할 때 다운로드 간격 시간 조정 -np 재귀적으로 다운할 때 부모 디렉토리는 크롤링 x -l 재귀적으로 다운할 때 list에 포함된 디렉토리만 순회 -N 파일이 변경됐을 때만 다운로드 -m 미러링 전용 옵션 활성화