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
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