웹 사이트에서 정보를 가져오기 위해 기본 웹 크롤러를 구축하는 방법

웹 사이트에서 정보를 가져오기 위해 기본 웹 크롤러를 구축하는 방법

웹 사이트 또는 웹 크롤러에서 정보를 읽는 프로그램에는 모든 종류의 유용한 응용 프로그램이 있습니다. 주식 정보, 스포츠 경기 결과, 트위터 계정의 텍스트를 긁어 모으거나 쇼핑 웹사이트에서 가격을 가져올 수 있습니다.





이러한 웹 크롤링 프로그램을 작성하는 것은 생각보다 쉽습니다. Python에는 웹사이트에서 정보를 추출하는 스크립트를 작성하기 위한 훌륭한 라이브러리가 있습니다. Scrapy를 사용하여 웹 크롤러를 만드는 방법을 살펴보겠습니다.





스크래피 설치

스크랩 웹을 스크랩하고 웹 크롤러를 구축하기 위해 만들어진 Python 라이브러리입니다. 빠르고 간단하며 많은 노력 없이 여러 웹 페이지를 탐색할 수 있습니다.





Scrapy는 PIP(Pip Installs Python) 라이브러리를 통해 사용할 수 있습니다. Windows, Mac 및 Linux에 PIP를 설치하는 방법 .

Python 가상 환경을 사용하면 시스템 파일만 남겨두는 가상 디렉터리에 Scrapy를 설치할 수 있기 때문에 선호됩니다. Scrapy의 문서에서는 최상의 결과를 얻으려면 이 작업을 수행할 것을 권장합니다.



디렉터리를 생성하고 가상 환경을 초기화합니다.

노트북에서 게임을 더 잘 실행하는 방법
mkdir crawler
cd crawler
virtualenv venv
. venv/bin/activate

이제 PIP 명령을 사용하여 해당 디렉토리에 Scrapy를 설치할 수 있습니다.





pip install scrapy

Scrapy가 제대로 설치되었는지 확인하기 위한 빠른 확인

scrapy
# prints
Scrapy 1.4.0 - no active project
Usage:
scrapy [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)
...

웹 크롤러를 구축하는 방법

이제 환경이 준비되었으므로 웹 크롤러 구축을 시작할 수 있습니다. 배터리에 관한 Wikipedia 페이지에서 몇 가지 정보를 스크랩해 보겠습니다. https://en.wikipedia.org/wiki/Battery_(전기) .





크롤러를 작성하는 첫 번째 단계는 다음에서 확장되는 Python 클래스를 정의하는 것입니다. 스크랩.스파이더 . 이를 통해 Scrapy의 모든 기능에 액세스할 수 있습니다. 이 클래스를 호출하자 거미1 .

스파이더 클래스에는 몇 가지 정보가 필요합니다.

  • 에게 이름 거미를 식별하기 위해
  • 에게 시작 URL 크롤링할 URL 목록이 포함된 변수(이 튜토리얼의 예는 Wikipedia URL)
  • 에게 구문 분석() 정보를 추출하기 위해 웹 페이지를 처리하는 데 사용되는 방법
import scrapy
class spider1(scrapy.Spider):
name = 'Wikipedia'
start_urls = ['https://en.wikipedia.org/wiki/Battery_(electricity)']
def parse(self, response):
pass

모든 것이 제대로 실행되고 있는지 확인하는 빠른 테스트입니다.

scrapy runspider spider1.py
# prints
2017-11-23 09:09:21 [scrapy.utils.log] INFO: Scrapy 1.4.0 started (bot: scrapybot)
2017-11-23 09:09:21 [scrapy.utils.log] INFO: Overridden settings: {'SPIDER_LOADER_WARN_ONLY': True}
2017-11-23 09:09:21 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.memusage.MemoryUsage',
'scrapy.extensions.logstats.LogStats',
...

로깅 끄기

이 클래스로 Scrapy를 실행하면 지금 당장은 도움이 되지 않는 로그 정보가 인쇄됩니다. 이 초과 로그 정보를 제거하여 간단하게 만들어 보겠습니다. 사용 경고 파일의 시작 부분에 코드를 추가하여 명령문.

import logging
logging.getLogger('scrapy').setLevel(logging.WARNING)

이제 스크립트를 다시 실행하면 로그 정보가 인쇄되지 않습니다.

크롬 인스펙터 사용하기

웹 페이지의 모든 것은 HTML 요소에 저장됩니다. 요소는 DOM(문서 개체 모델)에 정렬됩니다. DOM을 이해하는 것은 웹 크롤러를 최대한 활용하는 데 중요합니다. 웹 크롤러는 정보를 찾기 위해 페이지의 모든 HTML 요소를 검색하므로 배열 방식을 아는 것이 중요합니다.

Google 크롬에는 HTML 요소를 더 빨리 찾는 데 도움이 되는 도구가 있습니다. 인스펙터를 사용하여 웹 페이지에 표시되는 모든 요소에 대한 HTML을 찾을 수 있습니다.

  • Chrome에서 페이지로 이동
  • 보려는 요소에 마우스를 놓습니다.
  • 마우스 오른쪽 버튼을 클릭하고 선택 검사 메뉴에서

이 단계를 수행하면 다음과 같은 개발자 콘솔이 열립니다. 집단 탭이 선택되었습니다. 콘솔 하단에 요소 트리가 표시됩니다. 이 트리는 스크립트에 대한 정보를 얻는 방법입니다.

제목 추출

스크립트가 우리를 위해 일부 작업을 수행하도록 합시다. 웹 페이지의 제목 텍스트를 가져오는 간단한 크롤링.

일부 코드를 추가하여 스크립트를 시작하십시오. 구문 분석() 제목을 추출하는 메소드.

...
def parse(self, response):
print response.css('h1#firstHeading::text').extract()
...

NS 응답 인수는 이라는 메서드를 지원합니다. CSS() 제공한 위치를 사용하여 페이지에서 요소를 선택합니다.

이 예에서 요소는 h1.first제목 . 첨가

::text

스크립트는 요소의 텍스트 내용을 제공합니다. 마지막으로, 발췌() 메서드는 선택한 요소를 반환합니다.

Scrapy에서 이 스크립트를 실행하면 제목이 텍스트 형식으로 인쇄됩니다.

[u'Battery (electricity)']

설명 찾기

이제 제목 텍스트를 스크랩했으므로 스크립트로 더 많은 작업을 수행해 보겠습니다. 크롤러는 제목 뒤의 첫 번째 단락을 찾아 이 정보를 추출합니다.

다음은 Chrome 개발자 콘솔의 요소 트리입니다.

페이스 북에서 팔로잉은 무엇을 의미합니까
div#mw-content-text>div>p

오른쪽 화살표(>)는 요소 간의 부모-자식 관계를 나타냅니다.

이 위치는 모든 NS 전체 설명을 포함하는 일치하는 요소. 첫 번째를 얻으려면 NS 요소는 다음 코드를 작성할 수 있습니다.

response.css('div#mw-content-text>div>p')[0]

제목처럼 CSS 추출기를 추가합니다.

::text

요소의 텍스트 내용을 가져옵니다.

response.css('div#mw-content-text>div>p')[0].css('::text')

마지막 표현은 다음을 사용합니다. 발췌() 목록을 반환합니다. 파이썬을 사용할 수 있습니다 가입하다() 모든 크롤링이 완료되면 목록에 합류하는 기능입니다.

def parse(self, response):
print ''.join(response.css('div#mw-content-text>div>p')[0].css('::text').extract())

결과는 텍스트의 첫 번째 단락입니다!

An electric battery is a device consisting of one or more electrochemical cells with external connections provided to power electrical devices such as flashlights, smartphones, and electric cars.[1] When a battery is supplying electric power, its positive terminal is
...

JSON 데이터 수집

Scrapy는 정보를 텍스트 형식으로 추출할 수 있어 유용합니다. Scrapy를 사용하면 JSON(JavaScript Object Notation) 데이터도 볼 수 있습니다. JSON은 정보를 정리하는 깔끔한 방법이며 웹 개발에 널리 사용됩니다. JSON은 Python에서 꽤 잘 작동합니다. 또한.

데이터를 JSON으로 수집해야 하는 경우 다음을 사용할 수 있습니다. 생산하다 Scrapy에 내장된 문.

다음은 yield 문을 사용하는 새 버전의 스크립트입니다. 첫 번째 p 요소를 텍스트 형식으로 가져오는 대신 모든 p 요소를 가져와 JSON 형식으로 구성합니다.

작업 관리자에서 100 디스크는 무엇을 의미합니까?
...
def parse(self, response):
for e in response.css('div#mw-content-text>div>p'):
yield { 'para' : ''.join(e.css('::text').extract()).strip() }
...

이제 출력 JSON 파일을 지정하여 스파이더를 실행할 수 있습니다.

scrapy runspider spider3.py -o joe.json

스크립트는 이제 모든 p 요소를 인쇄합니다.

[
{'para': 'An electric battery is a device consisting of one or more electrochemical cells with external connections provided to power electrical devices such as flashlights, smartphones, and electric cars.[1] When a battery is supplying electric power, its positive terminal is the cathode and its negative terminal is the anode.[2] The terminal marked negative is the source of electrons that when connected to an external circuit will flow and deliver energy to an external device. When a battery is connected to an external circuit, electrolytes are able to move as ions within, allowing the chemical reactions to be completed at the separate terminals and so deliver energy to the external circuit. It is the movement of those ions within the battery which allows current to flow out of the battery to perform work.[3] Historically the term 'battery' specifically referred to a device composed of multiple cells, however the usage has evolved additionally to include devices composed of a single cell.[4]'},
{'para': 'Primary (single-use or 'disposable') batteries are used once and discarded; the electrode materials are irreversibly changed during discharge. Common examples are the alkaline battery used for flashlights and a multitude of portable electronic devices. Secondary (rechargeable) batteries can be discharged and recharged multiple
...

여러 요소 스크래핑

지금까지 웹 크롤러는 페이지에서 제목과 한 종류의 요소를 스크랩했습니다. Scrapy는 또한 하나의 스크립트에서 다양한 유형의 요소에서 정보를 추출할 수 있습니다.

주말 동안 최고의 IMDb 박스 오피스 히트작을 추출해 봅시다. 이 정보는 http://www.imdb.com/chart/boxoffice , 각 측정항목에 대한 행이 있는 표에서.

NS 구문 분석() 메소드는 행에서 둘 이상의 필드를 추출할 수 있습니다. Chrome 개발자 도구를 사용하여 테이블 내부에 중첩된 요소를 찾을 수 있습니다.

...
def parse(self, response):
for e in response.css('div#boxoffice>table>tbody>tr'):
yield {
'title': ''.join(e.css('td.titleColumn>a::text').extract()).strip(),
'weekend': ''.join(e.css('td.ratingColumn')[0].css('::text').extract()).strip(),
'gross': ''.join(e.css('td.ratingColumn')[1].css('span.secondaryInfo::text').extract()).strip(),
'weeks': ''.join(e.css('td.weeksColumn::text').extract()).strip(),
'image': e.css('td.posterColumn img::attr(src)').extract_first(),
}
...

NS 영상 선택자는 다음을 지정합니다. 이미지 의 후손이다 td.posterColumn . 올바른 속성을 추출하려면 |_+_| 표현식을 사용하십시오.

스파이더를 실행하면 JSON이 반환됩니다.

::attr(src)

더 많은 웹 스크레이퍼 및 봇

Scrapy는 사용자가 요청하는 모든 종류의 웹 크롤링을 수행할 수 있는 상세한 라이브러리입니다. HTML 요소에서 정보를 찾는 것과 관련하여 Python 지원과 결합하면 이기기 어렵습니다. 웹 크롤러를 구축하든 웹 스크래핑의 기초에 대해 배우든 간에 유일한 한계는 얼마나 많은 것을 배울 의향이 있느냐 하는 것입니다.

크롤러 또는 봇을 구축하는 더 많은 방법을 찾고 있다면 다음을 시도할 수 있습니다. Python을 사용하여 Twitter 및 Instagram 봇 구축 . Python은 웹 개발에서 몇 가지 놀라운 것을 구축할 수 있으므로 이 언어를 탐색할 때 웹 크롤러를 뛰어 넘는 가치가 있습니다.

공유하다 공유하다 트위터 이메일 알아야 할 Windows 명령 프롬프트(CMD) 명령 15가지

명령 프롬프트는 여전히 강력한 Windows 도구입니다. 다음은 모든 Windows 사용자가 알아야 할 가장 유용한 CMD 명령입니다.

다음 읽기
관련 항목
  • 프로그램 작성
  • 웹마스터 도구
  • 프로그램 작성
  • 파이썬
  • 코딩 튜토리얼
  • 웹 크롤러
저자 소개 앤서니 그랜트(40편 게재)

Anthony Grant는 프로그래밍 및 소프트웨어 분야의 프리랜서 작가입니다. 그는 프로그래밍, Excel, 소프트웨어 및 기술을 다루는 컴퓨터 공학 전공자입니다.

앤서니 그랜트가 참여한 작품 더보기

뉴스레터 구독

뉴스레터에 가입하여 기술 팁, 리뷰, 무료 전자책 및 독점 거래를 확인하십시오!

구독하려면 여기를 클릭하세요.