분류 전체보기

Crawling

[크롤링/16]메시지 큐(파이썬 Redis)

- 크롤링과 스크레이핑을 분리해서 비동기적으로 처리하자 우선 크롤링과 스크레이핑은 다르다. 크롤링은 HTML/파일 등을 추출하고 저장하는 것이고, 스크레이핑은 그 결과물인 HTML에서 원하는 데이터를 추출하는 것이다. 그리고 일반적으로 크롤링보다 스크레이핑에서 문제가 더 많이 생긴다. 실제로 회사에서 크롤러를 관리할 때도 크롤링에 실패한 경우 원인을 파악해보면 십중팔구 스크레이핑이 문제였다. 크롤링은 HTML을 긁어오기만 하면 된다. 그 HTML에서 키워드 등 원하는 데이터의 유무를 판단하는 건 스크레이핑의 영역이다. HTML을 긁어오는데서 실패를 할 가능성은 웹 서버 에러를 제외하고는 거의 없지만, 스크레이핑은 데이터의 위치가 바뀌었다던지, 데이터가 더이상 포함되어있지않다던지 다양한 실패 가능성이 있다..

Crawling

[크롤링/15] 크롤러 서버에서 운용하기(Windows/Ubuntu)

주기적으로 크롤러를 자동 실행하여 최신 데이터를 수집해야 하는 경우 다양한 옵션을 생각해볼 수 있다. 클라이언트에서 크롤러를 스케줄러에 등록해서 운용할 수도 있지만, 굳이 서버라고 명시한 것은 여러 가지 이유가 있다. 크롤러가 스케줄에 따라 동작하려면, 스케줄된 시간에 머신이 동작하고 있어야 하며 크롤러가 동작하는 도중에 머신이 종료되면 안 된다.기본적으로 서버는 24시간 돌아간다. 따라서 스케줄 된 시간의 머신 동작 여부나 동작 종료 여부를 걱정하지 않아도 된다. 예전에 회사에서 크롤러를 관리할 때, 서버용으로 사용하는 컴퓨터가 있었는데 회사 전기가 나가서 크롤러가 동작하지 않은 적이 있다. 이런 경우를 생각하면 클라우드 서비스도 좋은 선택지인 것 같다. 1. 윈도우즈 서버에서 크롤러 운용하기 작업 스..

Crawling

[크롤링/14]Scrapy로 Javascript 사용한 페이지 크롤링하기(Splash)

github.com/scrapy-plugins/scrapy-splash scrapy-plugins/scrapy-splash Scrapy+Splash for JavaScript integration. Contribute to scrapy-plugins/scrapy-splash development by creating an account on GitHub. github.com Scrapy는 lxml을 기반으로 만들어져 있어서 자바스크립트를 읽고 실행하지 못한다. 따라서 자바스크립트를 처리하기 위해 Selenium과 PhantomJS를 주로 사용하는데, Scrapy에서도 Splash를 사용하면 자바스크립트를 처리할 수 있다. Splash는 웹킷을 기반으로 만들들어진 헤드리스 브라우저를 사용한 서버다. Spl..

Crawling

[크롤링/13]Scrapy 오류 처리 설정

RETRY_ENABLED(기본값 True) 타임아웃 또는 HTTP 상태 코드 500 등이 발생했을 때d 자동으로 재시도할지 여부 이 설정과 관계 없이 Request.meta 속성으로 dont_rety 키 값을 True로 지정하면 해당 요청은 재시도하지 않는다. yield scrapy.Requests(url, meta={'dont_retry': True}) 잘못된 응답 또는 데이터 손실 오류는 서버 구성 오류에서 네트워크 오류, 데이터 손상에 이르기까지 여러 상황에서 발생할 수 있다. 깨진 응답이 부분적이거나 불완전한 내용을 포함 할 수 있다는 점을 고려하여 깨진 응답을 처리하는 것이 합리적 일지 결정하는 것은 사용자의 몫이다. RETRY_TIMES(기본값 2) 재시도 최대 횟수 재시도 횟수가 2라는건 처..

Crawling

[크롤링/12]Scrapy HTTP 요청/캐시 설정

캐시 설정은 같은 요청을 반복할 때 상대 서버에 가는 부하를 줄일 수 있다. HTTP 캐시 설정을 활성화하면 첫 요청을 제외하고는 대상 서버가 아닌 저장된 캐시를 활용하게 된다. 또한 응답을 캐시에서 받으면 요청 사이에 대기 시간이 들어가지 않으므로 빠른 처리가 가능하다. 1. HTTP 요청 USER_AGENT(기본값 "Scrapy/VERSION (+https://scrapy.org)") 공식 문서: docs.scrapy.org/en/latest/topics/settings.html?highlight=user_agent#user-agent Settings — Scrapy 2.4.1 documentation Here’s a list of all available Scrapy settings, in alph..

Crawling

[크롤링/11]Scrapy 병렬 처리 설정

특정한 웹 사이트를 크롤링할 때 병렬 처리를 하는 것은 민폐다. 하지만 불특정 다수의 웹 사이트를 크롤링할 때는 병렬처리로 크롤링 시간을 단축할 수 있다. Scrapy의 기본 설정은 특정 웹 사이트를 크롤링하는 것에 맞춰져있다. 즉, 불특정 다수의 웹 사이트를 크롤링 하기에는 잘 맞지않다. 하지만 Scrapy는 비동기 아키텍처로 인해 빠른 broad crawling 광범위 크롤링에 좋은 성능을 보여준다. Priority Queue 사용 중지하기 SCHEDULER_PRIORITY_QUEUE = 'scrapy.pqueues.DownloaderAwarePriorityQueue' Priority Queue는 싱글 도메인 크롤링에 적합하다. CONCURRENT_REQUESTS(기본값 16) CONCURRENT_R..

Crawling

[크롤링/10]Scrapy로 크롤링 대상 사이트에 피해주지 않는 설정하기

크롤러를 만들때 중요한건 크롤링 대상 사이트에 피해를 주지않는 것이다. 크롤러는 크롤링 할 사이트가 있어야만 존재할 수 있다. 그러므로 크롤링 대상에 피해를 주지 않기위한 Scrapy 설정들(클릭하면 공식 문서로 이동) Settings — Scrapy 2.4.1 documentation Here’s a list of all available Scrapy settings, in alphabetical order, along with their default values and the scope where they apply. The scope, where available, shows where the setting is being used, if it’s tied to any particular comp..

Crawling

[크롤링/09]크롤러 분류

1. 상태 유무 상태를 가지는 크롤러 - Stateful 상태가 없는 크롤러 - Stateless 상태를 가지는 크롤러의 경우에는 쿠키 송수신 기능이 필요하다(Requests Session, Referer). 2. 자바스크립트 실행 유무 자바스크립트를 실행하는 경우에는 Selenium을 사용하거나, 패턴을 파악해 흉내 내는 방법이 있다. 브라우저 조작 도구인 셀레니움은 일반적인 크롤러에비해 실행 시간이 길고 메모리 소비량이 많다. 따라서 어쩔 수 없는 경우에는 이를 사용해야겠지만, 최대한 피하는 편이 좋다. 헤드리스 브라우저는 일반 웹 브라우저에 비해 메모리 소비량이 적기때문에, 셀레니움을 사용할 때는 헤드리스 브라우저를 사용하는 것이 좋다. 대표적인 헤드리스 브라우저로는 PhantomJS가 있다. 3...

Crawling

[크롤링/08]퍼머링크와 데이터베이스 설계

퍼머링크(Permalink = Permanent + Link)란? 하나의 콘텐츠에 대응되며, 시간이 지나도 대응되는 콘텐츠가 변하지 않는 URL 인터넷에서 특정 페이지에 영구적으로 할당된 URL 주소를 뜻한다. 이 주소는 한 번 정해지면 영원하다는 의미에서, 영구적인(permanent) 주소라는 뜻의 permanent link를 줄여 만든 말이다. - Wiki(https://ko.wikipedia.org/wiki/퍼머링크) 퍼머링크의 장점 검색 엔진의 크롤러가 콘텐츠를 인식하기 쉬움 검색 엔진 최적화가 잘 이루어짐 크롤러의 재실행 크롤러는 보통 반복적인 작업을 위해 만들어지고, 일회성 사용에서 그치는 경우가 적다. 따라서 크롤링한 데이터를 데이터베이스에 저장할 때는 유니크 키를 생각해야한다. 단순하게 저..

Database

[MongoDB]파이썬에서 MongoDB 사용하기

MongoDB에서 공식으로 제공하는 파이썬 바인딩 설치 pip install pymongo pymongo는 독자적인 bson패키지를 가지고 있다. 따라서 bson 패키지를 명시적으로 설치하면 안된다. bson 패키지를 명시적으로 설치하면 pymongo와 호환되지 않는 패키지가 설치된다. 기본 사용법 from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.sample # db = client[sample] collection = db.datas # collection = db[datas] collection.insert_one({딕셔너리}) collection.insert_many({딕셔너리1}, {딕셔너리2}..

Algorithm/Python

[파이썬/백준 20058] 마법사 상어와 파이어스톰/런타임에러(RecursionError) 원인과 해결방법

www.acmicpc.net/problem/20058 20058번: 마법사 상어와 파이어스톰 마법사 상어는 파이어볼과 토네이도를 조합해 파이어스톰을 시전할 수 있다. 오늘은 파이어스톰을 크기가 2N × 2N인 격자로 나누어진 얼음판에서 연습하려고 한다. 위치 (r, c)는 격자의 r행 c www.acmicpc.net 1. 입력 n, q = map(int, input().split()) n = 2**n ice_rink = [list(map(int, input().split())) for _ in range(n)] level = list(map(int, input().split())) 2. 구현 (1) 가장 큰 얼음 덩어리가 차지하는 칸의 개수 import sys sys.setrecursionlimit(10..

Algorithm/Python

[파이썬/백준 20057] 마법사 상어와 토네이도

20057번: 마법사 상어와 토네이도 마법사 상어가 토네이도를 배웠고, 오늘은 토네이도를 크기가 N×N인 격자로 나누어진 모래밭에서 연습하려고 한다. 위치 (r, c)는 격자의 r행 c열을 의미하고, A[r][c]는 (r, c)에 있는 모래의 양을 www.acmicpc.net 시간 줄이려고 global안쓰고 딕셔너리 써봤는데 메모리가 줄어들고 시간은 늘어났다 ✨ 접근 위와 같은 그림을 그리며 패턴을 파악했다 ✨ 코드 딕셔너리 쓰기 def move(cnt, dx, dy, direction): for _ in range(cnt + 1): sx, sy = init['sx'] + dx, init['sy'] + dy init['sx'], init['sy'] = sx, sy if sx < 0 or sy < 0: b..

박한결
'분류 전체보기' 카테고리의 글 목록 (12 Page)