[크롤링] selenium, xpath, scrapy
서론
웹 크롤링은 3일에 걸쳐 진행되었는데,
마지막 날에는 selenium과 xpath, scrapy를 이용해 크롤링하는 방법을 배웠다.
갈수록 난도가 높아졌는데, 특히 scrapy를 이용한 방법은 많이 어려웠다.
Selenium
셀레니움이란?
브라우저의 자동화 목적으로 만들어진, 다양한 브라우저와 언어를 지원하는 라이브러리이다.
브라우저의 자동화가 왜 필요할까?
웹 페이지를 개발했을 때, 브라우저에서 동작되는 웹서비스 뒤에는 코드가 있고, 그 코드가 동작해서 브라우저 상에서 기능들이 동작한다.
서비스를 만들고 나서는 주기적으로 서비스를 업데이트(코드를 수정)하는데,
배포 전에 각 기능들이 클라이언트의 입장에서 잘 작동이 되는지 확인해봐야 한다.
클라이언트의 입장에서 서비스 내 모든 기능을 다 테스트하려면 번거로움이 있다.
그래서 이 기능들을 다 사용하도록 자동화시킨 것이 셀레니움이다.
이 셀레니움을 이용해 크롤링도 할 수 있다!
셀레니움을 이용한 크롤링 방법은, 브라우저를 파이썬 코드로 컨트롤해서 브라우저에 있는 데이터를 수집하는 방법이다.
셀레니움 다루기
셀레니움을 이용하려면 먼저 크롬 브라우저가 있어야 한다.
그리고 파이썬에서는 selenium 패키지가 필요하다.
!pip install selenium #셀레니움 패키지 설치
daum 검색창에 검색하기
- 프로세스
- 브라우저 띄우기
- 페이지 이동
- input 창에 문자열 입력
- 검색 버튼 클릭
- 브라우저 종료
Headless
셀레니움을 위의 예시처럼 사용한다면 웹브라우저창이 화면에 나타난다.
헤드리스 방법은, 브라우저를 화면에 띄우지 않고 메모리 상에서만 브라우저를 실행해 크롤링하는 방법이다.
헤드리스 방법을 사용하면 윈도우(os 말하는게아님)가 지원되지 않는 환경(커맨드라인만 뜨는 서버컴퓨터와 같은 환경)에서 셀레니움을 사용할 수 있다.
크롬 버전 60이상부터 지원한다고 하는데, 요즘 사용하는 크롬은 거의 102, 103, 104버전이라서 거의 다 지원된다고 보면 된다.
selenium을 통해 iframe에 있는 데이터 수집하기
iframe에 있는 데이터 중에 대표적인 유형이 중고나라이다.
네이버 중고나라 카페에 있는 글 목록은 iframe 형태로 되어있다.
- 프로세스
- 웹 브라우저 열기 및 페이지 이동
- 검색 창에 '맥북' 입력하고 검색 버튼 누르기
- 게시글 목록 데이터 수집
- 웹 브라우저 종료
Xpath
xpath도 html의 element를 선택하는 방법으로, scrapy에서 기본적으로 사용하는 selector이다.
여기서 scrapy란, 파이썬 코드로 웹페이지의 데이터를 수집하는 프레임워크이다.
scrapy 설치하기.
!pip install scrapy
xpath 문법
//*[@id="nx_footer_related_keywords"]/div/div[2]/ul/li/a/div/text()
- //
최상위 엘리먼트 (document 상 가장 위에 있는 엘리먼트 선택) - *
모든 하위 엘리먼트로, CSS selector에서 띄어쓰기와 비슷 - [@id="nx_footer_related_keywords"]
속성값으로 엘리먼트 선택 - /
한단계 하위 엘리먼트로, CSS selector에서 '>'와 비슷 - [n]
n번째 엘리먼트
beatifulsoup과 비교했을 때 xpath의 장점
앞에서 beautifulsoup으로 선택할 때는 하위 엘리먼트(카테고리)의 경우 전체 하위 엘리먼트를 선택했다가 반복문을 통해 각각의 엘리먼트를 선택했다.
하지만 xpath는 반복문 돌릴 필요 없이 각각의 엘리먼트를 한번만에 선택해서 출력할 수 있다.
Scrapy
scrapy는 파이썬 코드로 웹페이지의 데이터를 수집하는 프레임워크인데,
프레임워크는 '빈칸 채워넣기'라고 이해하면 쉽다.
항상 똑같이 들어가는 코드를 프레임워크가 제공해, 변하는 코드만 작성해도 구현이 가능하다.
목적에 따라 다양한 프레임워크가 존재한다.
scrapy를 사용하기 위해서 yield와 iterator, generator에 대한 이해가 필요하다.
iterable, iterator
iterable: 순서가 있는 데이터 집합
iterator: next 함수를 실행하여 값을 발생시키는 값 생성기
generator
generator : iterator를 간단하게 구현한 문법
yield
일반 함수를 generator로 만들어 주는 명령어이다.
next 함수를 실행해서 yield를 만나면 코드 실행이 중단된다.
데이터들을 순서대로 사용하려고 하면 원래의 경우에는 리스트에 다 저장해야 하는데
iterator, generator를 사용하면 메모리를 줄일 수 있어 코드의 실행 속도가 빨라지는 효과가 있다.
이제 scrapy를 사용해서 크롤링 해보자!
스크래피를 사용하면 비동기 방식으로 데이터를 수집해서, 데이터 수집 속도가 빠르다.
비동기 방식?
비동기 방식하니까 또 졸프 때의 악몽이 떠오른다. 자바스크립트의 비동기 방식이 이해 안가서 며칠 밤을 날렸던.. ㅂㄷㅂㄷ
하지만 컴공은 밤샌만큼 성장하는 것 같다~~!(ㅋㅋ 자기위로하기..)
본론으로 가서.,
동기 방식은 말그대로 동기적으로 수행된다는 것이다.
만약 내가 req를 보내서 rep를 받는 데까지 기다리는 네트워크 타임이 있다고 하면, 그 네트워크 타임이 끝날 때까지 기다리고, rep를 받고 나서야 다음 req를 보낼 수 있다.
그래서 데이터를 받는 순서가 명확하다. 시작한 걸 끝내야 다음 걸 시작할 수 있기 때문이다.
하지만 네트워크 타임이 끝날 때까지 기다리는 게 비효율적이지 않은가?
그래서 나온 개념이 비동기 방식이다. 비동기 방식은 네트워크 타임 동안 다른 코드를 실행하게 한다.
처음 req를 보내고 rep를 받기 전까지 네트워크 타임동안, 새로운 req를 요청할 수 있다.
그래서 코드 순서대로 결과 도착이 보장되지 않지만, 그만큼 시간이 절약된다.
scrapy의 프로젝트를 실행시키면?
스크래피는 프레임워크니까, 프로젝트를 만들어 실행하면 일련의 순서를 거쳐서 실행된다.
- spider.py 실행
spider.py에 어떤 순서로 실행할 지 정의가 되어있기 때문에, 프로젝트를 실행시키면 spider.py부터 찾는다. - items.py 대로 모양이 만들어짐.
items.py가 데이터 구조에 대해 정의한 파일이기 때문이다. - pipelines.py 실행
DB에 저장하라고 작성하면 DB에 저장하고, 메신저로 보내라고 하면 메신저로 보내는 등 수집 후의 작업을 정의한 파일이다.
G마켓의 베스트 200 상품 데이터를 수집하자.
- 프로세스
- scrapy 프로젝트 생성
- xpath 찾기
- items.py 코드 작성을 통해 모델 만들기
여기서 모델은 ai 모델이 아닌, 데이터의 구조를 말한다. 수집할 데이터의 컬럼을 정의한다. - spider.py 코드 작성
핵심이 되는 부분이다. 여기에 크롤링 절차를 정의한다. - scrapy 프로젝트 실행