Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 Scrapy로 시작하는 웹 스크래핑 완벽 가이드

웹 크롤러 개발을 위한 최고의 프레임워크 중 하나로 꼽히는 것이 바로 Scrapy입니다. Scrapy는 다양한 고수준 기능을 제공하는 인기 있는 웹 스크래핑·크롤링 프레임워크로, 복잡한 웹사이트도 비교적 손쉽게 데이터를 긁어올 수 있게 도와줍니다.

Scrapy 설치하기

윈도우 환경에서 Scrapy 설치는 아주 간단합니다. pip 또는 conda(아나콘다 사용 시) 중 편한 패키지 관리자를 활용하면 되며, Scrapy는 파이썬 2와 3 버전 모두에서 동작합니다.

pip install Scrapy

아나콘다를 사용한다면 아래 명령어를 입력하세요.

conda install –c conda-forge scrapy

설치가 정상적으로 완료되면 터미널에서 scrapy 명령어를 바로 사용할 수 있습니다.

C:\Users\rajesh>scrapy
Scrapy 1.6.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 설치가 끝났으면 startproject 명령어를 실행해 첫 번째 프로젝트의 기본 골격을 만들어 보겠습니다. 터미널을 열고 프로젝트를 저장할 디렉터리로 이동한 뒤 scrapy startproject <프로젝트명>을 입력하면 됩니다. 여기서는 프로젝트 이름으로 scrapy_example을 사용합니다.

C:\Users\rajesh>scrapy startproject scrapy_example
New Scrapy project 'scrapy_example', using template directory 'c:\python\python361\lib\site-packages\scrapy\templates\project', created in:
C:\Users\rajesh\scrapy_example

You can start your first spider with:
cd scrapy_example
scrapy genspider example example.com

C:\Users\rajesh>cd scrapy_example
C:\Users\rajesh\scrapy_example>tree /F
Folder PATH listing
Volume serial number is 8CD6-8D39
C:.
│ scrapy.cfg
│
└───scrapy_example
  │ items.py
  │ middlewares.py
  │ pipelines.py
  │ settings.py
  │ __init__.py
  │
  ├───spiders
  │ │ __init__.py
  │ │
  │ └───__pycache__
  └───__pycache__

또 다른 방법으로는 scrapy shell을 실행해 대화형 방식으로 웹 스크래핑을 진행할 수 있습니다. 아래처럼 fetch 함수로 원하는 URL을 불러오면 됩니다.

In [18]: fetch("https://www.wsj.com/india")
2019-02-04 22:38:53 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.wsj.com/india> (referer: None)

Scrapy 크롤러는 다운로드한 정보를 담은 response 객체를 반환합니다. 이 객체에 무엇이 들어 있는지 확인해 보겠습니다.

In [19]: view(response)
Out[19]: True

명령을 실행하면 기본 브라우저에서 해당 웹페이지가 열리고, 다음과 같은 화면을 볼 수 있습니다.

파이썬 Scrapy로 시작하는 웹 스크래핑 완벽 가이드

실제 웹페이지와 상당히 비슷하게 보이죠? 즉, 크롤러가 웹페이지 전체를 성공적으로 다운로드했다는 의미입니다.

이제 크롤러가 실제로 어떤 데이터를 갖고 있는지 자세히 살펴보겠습니다.

In [22]: print(response.text)
<!DOCTYPE html>
<html data-region="asia,india" data-protocol="https">
  <head>
    <title>The Wall Street Journal & Breaking News, Business, Financial and Economic News, World News and Video</title>
    <meta name="description" content="WSJ online coverage of breaking news and current headlines from the US and around the world."/>
    <meta name="keywords" content="News, breaking news, latest news, US news, headlines, world news, business, WSJ"/>
    ...
  </head>
  ... 그 밖에도 수많은 태그와 메타 정보가 포함되어 있습니다.

웹페이지에서 핵심 정보 추출하기

웹페이지 제목 추출하기

Scrapy는 class, id 같은 CSS 선택자를 기반으로 HTML에서 정보를 추출하는 기능을 제공합니다. 웹페이지 제목의 CSS 선택자를 찾으려면 해당 요소에서 마우스 오른쪽 버튼을 클릭한 후 '검사(inspect)' 메뉴를 선택하면 됩니다.

파이썬 Scrapy로 시작하는 웹 스크래핑 완벽 가이드

그러면 브라우저 창에 개발자 도구가 열립니다.

파이썬 Scrapy로 시작하는 웹 스크래핑 완벽 가이드

화면에서 확인할 수 있듯이, wsj-headline-link 클래스는 제목을 감싸고 있는 모든 앵커(<a>) 태그에 공통으로 적용되어 있습니다. 이 정보를 활용해 response 객체 안에서 전체 기사 제목을 찾아보겠습니다.

파이썬 Scrapy로 시작하는 웹 스크래핑 완벽 가이드

response.css()는 전달받은 CSS 선택자에 해당하는 콘텐츠를 추출하는 함수입니다. 몇 가지 예제를 더 살펴보겠습니다.

In [24]: response.css(".wsj-headline-link::text").extract_first()

Out[24]: 'China Fears Loom Over Stocks After January Surge'

::text 없이 선택자만 지정하면 태그 전체를 그대로 가져올 수도 있습니다.

In [25]: response.css(".wsj-headline-link").extract_first()

Out[25]: '<a class="wsj-headline-link" href="https://www.wsj.com/articles/china-fears-loom-over-stocks-after-january-surge-11549276200">China Fears Loom Over Stocks After January Surge</a>'

웹페이지의 모든 링크 가져오기

페이지에 존재하는 모든 링크(href 속성)를 한 번에 수집하려면 아래 코드를 사용하면 됩니다.

links = response.css('a::attr(href)').extract()

실행 결과

['https://www.google.com/intl/en_us/chrome/browser/desktop/index.html',
'https://support.apple.com/downloads/',
'https://www.mozilla.org/en-US/firefox/new/',
'https://windows.microsoft.com/en-us/internet-explorer/download-ie',
'https://www.barrons.com',
'https://bigcharts.marketwatch.com',
'https://www.wsj.com/public/page/wsj-x-marketing.html',
'https://www.dowjones.com/',
'https://global.factiva.com/factivalogin/login.asp?productname=global',
'https://www.fnlondon.com/',
'https://www.mansionglobal.com/',
'https://www.marketwatch.com',
'https://newsplus.wsj.com',
'https://privatemarkets.dowjones.com',
'https://djlogin.dowjones.com/login.asp?productname=rnc',
'https://www.wsj.com/conferences',
'https://www.wsj.com/pro/centralbanking',
'https://www.wsj.com/video/',
'https://www.wsj.com',
'https://www.bigdecisions.com/',
'https://www.businessspectator.com.au/',
'https://www.checkout51.com/?utm_source=wsj&utm_medium=digitalhousead&utm_campaign=wsjspotlight',
'https://www.harpercollins.com/',
'https://housing.com/',
'https://www.makaan.com/',
'https://nypost.com/',
'https://www.newsamerica.com/',
'https://www.proptiger.com',
'https://www.rea-group.com/',
……
……]

기사별 댓글 수 추출하기

WSJ(The Wall Street Journal) 페이지의 기사별 댓글 수도 간단히 가져올 수 있습니다.

In [38]: response.css(".wsj-comment-count::text").extract()

Out[38]: ['71', '59']

지금까지 살펴본 내용은 Scrapy를 활용한 웹 스크래핑의 기초 입문 단계일 뿐입니다. Scrapy를 깊이 있게 활용하면 파이프라인 구성, 미들웨어 작성, 대규모 분산 크롤링 등 훨씬 더 다양한 작업을 자동화할 수 있습니다.