BeautifulSoup vs Scrapy

  • BeautifulSoup은 html문서를 쉽게 파싱 / 자동으로 유니코드로 변환하여 UTP-8로 출력 / lxml, html5lib파서 이용
    - soup = BeautifulSoup( html_doc를 담은 변수, 'html.parser') 형태로 html문서를 넣은 파서를 만들고
    soup.태그명 = 해당 태그 전체 / soup.태그명.name = 텍스트만 출력 / soup.태그명.parent.name = 부모태그명
    soup.find_all(태그명) = 해당 태그명을 가진것 전체 / soup.find( 특성속성(id) = "특정속성 값") = 특정 속성명 가진 것 가져오기
    - re.로 정규표현식을 이용해서 데이터를 가지고 올 수 있다.
    - find_all()안에 리스트형태[]로 넣으면 여러개의 태그 전체를 가져올 수 있다.
    - css에서 많이 쓰는 class속성에 대해, soup.find_all( "태그명(a)", class_ = "클래스명")처럼, 언더바(_)를 붙혀서 css 클래스만 선별할 수 있다.
    - 이미지태그 역시 find_all을 통해 img태그만 불러와서 처리한다.

  • Scrapy는 웹 스크래퍼 프레임워크 / 다양한selector지원 / pipeline으로 데이터 후처리(펄터링 등)/ 로깅 / 이메일을 보내주는 기능

우분투에 파이참 설치

1. 자바8을 설치한다
http://webnautes.tistory.com/939

2. 파이참을 다운로드하고, 터미널에서 다운로드 폴더로 이동한뒤, 해당 tar.xz파일을 풀어준다.
  풀어진 새로운 폴더 > bin 폴더로 이동한 뒤, sh pycharm.sh로 실행시켜본다. (스크립트 런쳐폴더는 /usr/local/bin/charm)
http://hunit.tistory.com/268

3. 파이참을 실행한 상태에서, tools > desktop entry 를 통해 dash에서 파이참이 검색되도록 한다.
   검색하여 찾은 파이참을 launcher에 바로가기를 만든다.

4. 게스트cd삽입으로 가상머신과 호스트컴퓨터 사이 복붙 가능하게 만든다.
https://extrememanual.net/8257
(Ctrl shift v)

5. 크롬도 설치한다.
http://gomcine.tistory.com/entry/%EC%9A%B0%EB%B6%84%ED%88%AC-1604-LT-%EC%97%90-%ED%81%AC%EB%A1%ACchrome-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0

6. 한글도 설치해주자.
http://ngee.tistory.com/326


[우분투 전체환경]에서 설치한 파이참에, [각종 라이브러리들을 설치한 가상환경]을 연결해주기

https://doc.scrapy.org/en/0.24/intro/tutorial.html 를 통해, 튜토리얼 문서를 열고 공부를 해보자.

1. 프로젝트를 실행할, 가상환경으로 들어와서, tutorial이라는 스크래피 프로젝트를 만들자.
image

2. 파이참을 켜서 File>open을 이용해 생성한 프로젝트를 열어보자.
image

  • items는 어떤 데이터를 들고 올 때, 그 데이터를 class형태로 만들 수 있다.
  • pipelines는 데이터를 들고 온뒤, 후처리해줄 것이다.
  • settings는 봇이름 및 스크래피 설정들을 한다
  • spiders 폴더에 크롤링할 내용들을 기입할 것이다.
    image
    ***scrapy모듈이 import안되는 것을 확인할 수 있다.
    파이참은 루트에서 설치되어 실행되는 것이므로, 우리가 각종 라이브러리를 설치한 가상환경을 세팅해줘야한다.


3. 가상환경에서 만든 파이참2.7 크롤링 환경을,  우분투 전체 파이참에서, Project interpreter로 지정해줘야한다.
File> setting > Project : tutorial > Project interpreter > 세팅버튼 > Add local.. > Existing environment
image
image
image

파이참을 통해 어떠한 프로젝트를 열 때, 이렇게 내가 미리 만들어둔 가상환경을,  프로젝트의 interpreter로 연결해줘야한다.
가상환경의 경로는 가상환경명 이다.
가상환경이 설정되면, scrapy모듈의 오류가 없어진다.
image




스크래피 맛만 보기

스크래피의 사용방법은 [웹 크롤링 - Scrapy & Selenium]을 통해서 익히도록하자.

*spiders폴더의 spider파일명/class명은 크게 중요하지않다. 그 안의 변수 name/allowed_domains/ start_urls가 중요하다.
start_urls 는 리스트형태로, 여러개의 사이트를 넣을 수 있다. 각각의 사이트에 대해서 파싱을 순서대로 시행해준다.

*parse함수에서는 reponse.url.split("/")[-2] 를 통해서, 끝에서 2번째 /의 텍스트를 가져올 수 있다.
*parse함수에서 with open(filename, 'wb') as f: 를 통해 filename으로 파일을 하나 생성하고, f변수를 이용해서 f.write하여 파일을 쓸 수 있다. f.write(response.body)를 하면 사이트의 전체 html코드를 가져와 파일로 생성해준다.

*** 파이참의 terminal에서 크롤링을 할 때도, 가상환경으로 workon한 상태에서 해줘야한다.***
실행은 scrapy crawl + spider클래스에 명시한 name으로 크롤링한다.


image
2사이트 대해 html코드를 모두 가져오는 LI와 LU를 가져왔다.


부분적으로 코드를 추출하고 싶을 때는,  터미널-scrapy shell 과 크롬개발자도구의 Copy to xpath를 이용한다
이 때, response.xpath(' ~~~~ /text()').extract() 가 텍스트 전체를 추출했따면
response.xpath(' ~~~~ /text()').re('(\w+):')  라는 정규표현식 코드를 이용해서, 특수문자제외 단어별로 끊어서 리스트로 가져온다.

우분투의 메모장은 dash에서 gedit을 검색하자


***우리가 가지고 오고싶은 데이터는 ul 태그 안에 li태그로 리스트형태이다. xpath를 직접 확인하지말고
    전체 코드 response.xpath('') 안에다가,  //ul/li 를 통해 보이는 리스트를 모두 가져온 뒤, for문으로 꺼내보고
    각 리스트는 꺼낸것.xpath('')에다가 각 서브xpath를 걸어서 추출하고 print하였다.
    세부적인 검색이 없으니, 각종.. 예외사항 리스트들도 같이 출력된다.
image


items.py에서 아이템클래스의 객체를 생성하고, parse에서 그 객체들에 하나씩 담을 때는,
생성자인 yield item을 통해, 각 for문마다 채워진 item반환하면서 리스트로 쌓아준다.

*만약 터미널이 debug모드이면, 출력된 링크들도 확인이 된다.

*** 크롤링한 것을 csv가 아니라 json으로도 저장할 수 있다. ( csv와 -o까진 같고, 파일명만 json으로)
scrapy scrawl acu -o items.json

image


***pipelines에서 각 쌓아진 item별로 작업을 할 수 있고, db에 저장하는 작업도 할 수 있다.

***데이터를 받을 때,인코딩을 지정할 수 있다.

\u~~유니코드를 의미한다.


*******이제 크롤링을 주기적으로 하기 위한 스케쥴링은, 리눅스에서 제공하는 Crontab을 이용한다.

Crontab

리눅스의 기본 서비스로 정해진 시간에 정해진 스크립트를 시작할 수 있다.
/etc/crontab 에 가서 편집을 통해 가능하다.

설정가능항목으로

분 : 0~59 / 시 : 0~23 / 일(1~13) / 월(1~12) / 요일(0~6, 0이 일요일) / 사용자 / 명렁어 형식이다
실행확인은 grep CRON /var/log/syslog 를 활용한다.

30분마다 작업하고 싶다면 30 * * * * * 을 해주면 된다.
정해진 요일의 정해진시간에 하고 싶다면, 분/시간 * * * * 요일을 지정해주면 된다.


실습

1. 크론탭파일에 진입하려면 관리자권한(sudo)으로 편집기(vi)를 통해 들어가야한다.
명령어 위치는 작업하던 가상환경에서 해두 상관없는 것 같다.

sudo vi /etc/crontab
image

수정은 insert를 눌러 인서트모드에서 작업하고, 저장은 다시 모드를 바꾸어 :wq!로 저장하고 나온다.
그런데, 어떤 작업을 넣어주기 위해서는, 작업을 실행할 스크립트 파일을 만들어야한다.

2. 작업수행 스크립트(sh) 만들기

크롤링 스크립트 폴더를 따로 home에 만들자.
image
아직 경로는 모르니, 책에 있는데로 써놓자

+ Recent posts