Language/WebCrawling

scrapy 설치 및 테스트 해보기

아르비스 2020. 7. 6. 15:48

0. 사전설치

  Python이 설치되어 있어야 함.

  pip 필수 

 

PS D:\DB> pip --version
pip 20.1.1 from d:\utils\python\python38\lib\site-packages\pip (python 3.8)

 

 

1. Scrapy 설치

  공식 url : https://docs.scrapy.org/en/latest/intro/install.html#installing-scrapy

PS D:\DB> pip install scrapy

설치 후 확인

PS D:\DB> scrapy --version
Scrapy 2.0.0 - no active project

Usage:
  scrapy <command> [options] [args]

Available commands:
  bench         Run quick benchmark test
  fetch         Fetch a URL using the Scrapy downloader
  genspider     Generate new spider using pre-defined templates
  runspider     Run a self-contained spider (without creating a project)
  settings      Get settings values
  shell         Interactive scraping console
  startproject  Create new project
  version       Print Scrapy version
  view          Open URL in browser, as seen by Scrapy

  [ more ]      More commands available when run from project directory

Use "scrapy <command> -h" to see more info about a command

Scrapy Site Latest Ver 2.2.0 이지만, pip로 설치니 2.0.0이 설치됨.

 

2. lxml 설치 

   libxml2와 libxslt를 사용한 C 확장 라이브러리로서 효율적인 XML과 HTML 파서 역할을 수행

  http://lxml.de/installation.html#installation

 

Installing lxml

If your system does not provide binary packages or you want to install a newer version, the best way is to get the pip package management tool (or use a virtualenv) and run the following: If you are not using pip in a virtualenv and want to install lxml gl

lxml.de

3.  twisted 설치 

    이벤트 구동(Event Drive) 네트워크 프로그래밍 엔진을 기반으로 만들어졌기 떄문에 웹사이트 다운로드 처리를 비동기적으로 실행하며 다운로드 중에도 스크레이핑 처리 

 

* Spider 

  - 어떤 웹 사이트들을 어떻게 크롤링할 것인지 명시하고, 각각의 웹 페이지의 어떤 부분을 스크래핑할 것인지 명시하는 클래스

* Selector

  - 웹 페이지 상의 특정 HTML 요소(element)를 간편하게 선택할 수 있도록 하는 매커니즘을 구현한 클래스

  - CSS 선택자를 직접 사용하거나, xPath를 사용할 수 있음.

* Item

  - 웹페이지에서 원하는 부분을 스크랩하여 저장할 때 사용하는 사용자 정의 구조 클래스

* Item Pipeline

  - 스크래핑 결과물을 item 형태로 구성하였을 때, 이를 자유롭게 가공하거나 다양한 형태로 저장할 수 있도록 하는 클래스

* Settings

   - Spider나 Item Pipeline 등이 어떻게 동작하도록 할 지에 대한 세부적인 설정 사항

 

 

2. xpath

지금까지 배웠던 css selector가 아닌 xpath를 이용해서도 웹페이지의 html element를 선택할 수 있다.

2.1 xpath의 기본 문법

예시 xpath: 네이버 실시간 검색어 순위에서 [copy xpath]로 복사
//*[@id="PM_ID_ct"]/div[1]/div[2]/div[2]/div[1]/div/ul/li[1]/a/span[2]

  • //: 최상위 element를 의미
  • *: 조건에 맞는 하위 element를 모두 살펴봄 (css selector에서 하위 element 검색: 한칸 띄우기)
  • [@id="PM_ID_ct"]: id가 PM_ID_ct 인 element를 선택
    • [@<key>=<value>] 형태 (css selector와 다르게 모든 속성을 @<key>로 표현)
  • /: 바로 아래 element를 살펴봄 (css selector의 > 기호와 같은 의미)
  • [number]: number번째 element를 선택 (0번부터가 아니라 1번부터 시작함)
  • .: 현재 element를 의미
  • not(): 조건이 아닌 element를 찾음
    • not([@id=test})

 

2.4 gmarket best item 200 크롤링

웹페이지에 연결

url = "http://corners.gmarket.co.kr/Bestsellers"
rep = requests.get(url)
response = TextResponse(rep.url, body=rep.text, encoding="utf-8")

베스트 200 아이템 제목 문자열 리스트로 가져오기

titles = response.xpath('//*[@id="gBestWrap"]/div/div[3]/div[2]/ul/li/a/text()').extract()
print(len(titles))
titles[195:199]

200

['일본수출 초극세사이불/백화점납품/ 피톤치드가공10mm', '제로스킨 아이폰 갤럭시 핸드폰케이스 6 7 8 X S 노트', '(국산)고급 반코팅 100켤레 이중코팅 면 목장갑 작업', '[다이소]공식판매처/택배박스/봉투/로고인쇄/당일발송/소량']

 

200개 아이템에서 li 클래스가 first인 데이터만 가져오기

  • 클래스가 first인 아이템은 한 줄에 4개씩 나타나는 상품 중 각 줄의 첫번째 상품
titles = response.xpath('//*[@id="gBestWrap"]/div/div[3]/div[2]/ul/li[@class="first"]/a/text()').extract()
len(titles)

50 200개 아이템에서 li 클래스가 first가 아닌 데이터만 가져오기

  • not()을 사용
titles = response.xpath('//*[@id="gBestWrap"]/div/div[3]/div[2]/ul/li[not(@class="first")]/a/text()').extract()
len(titles)

150