웹 사이트에서 데이터를 스크랩하는 가장 좋은 방법은 무엇입니까? [닫은]


107

웹 사이트에서 콘텐츠를 추출해야하지만 응용 프로그램은 해당 데이터에 프로그래밍 방식으로 액세스 할 수있는 응용 프로그래밍 인터페이스 나 다른 메커니즘을 제공하지 않습니다.

웹 페이지 스크래핑 및 데이터 세트 구축을위한 클릭 앤 고 기능을 제공하는 Import.io 라는 유용한 타사 도구를 찾았습니다 . 유일한 것은 데이터를 로컬에 보관하고 구독 계획에 가입하고 싶지 않다는 것뿐입니다. .

이 회사는 웹 페이지를 스크랩하고 데이터 세트를 구축하기 위해 어떤 기술을 사용합니까? 일부 웹 스크래핑 프레임 워크 pjscrapeScrapy 가 이러한 기능을 제공 할 수 있음을 발견했습니다.


4
PHP는 당연히 의문의 여지가 없습니다. 분명히 잘못된 것입니다. gist.github.com/krakjoe/b1526fcc828621e840cb
Joe Watkins

정말 멋져 보이는 @JoeWatkins, 실행하려면 특별한 PHP 구성이 필요합니까? 그리고 아래에 제공된 도구 / 언어와 비교하여 성능은 어떻습니까?
0x1ad2

1
그것은 PHP와의 pthreads의 스레드 안전한 빌드를 필요로 읽을 github.com/krakjoe/pthreads/blob/master/README.md을 당신이 :) 다른 도움, 나 또는 누군가하려는 경우, 당신은 채팅에서 나를 찾을 수 있습니다
조 왓킨스

@ 0x1ad2 데이터를 로컬에 보관하려면 웹 API 대신 소프트웨어 ( datascraping.co )를 사용 해보세요 . 대부분의 도구는 Xpath, CSS 선택기 및 REGEX를 사용하여 웹 사이트에서 데이터를 추출하고 Data Scraping Studio는이 세 가지 기능을 모두 지원합니다.
Vikash Rathee 2015

두 가지 방법이 있습니다. 하나는 많은 노력이 필요한 무료 / 오픈 소스 라이브러리를 사용하여 직접 배포하는 것입니다. scrape.it을 사용하여 모든 사이트에 대해 문자 그대로 ajax 웹 크롤러를 생성 할 수 있습니다 . 유료 도구이지만 import.io 또는 kimono과 같은 무료 도구가 렌더링 할 수 없을 때 작동했습니다.
I Love Python

답변:


271

좋은 웹 스크래핑 프레임 워크로 시작하고 싶을 것입니다. 나중에 너무 제한적이라고 결정할 수 있으며 자신의 라이브러리 스택을 모을 수 있지만 스크래핑 경험이 많지 않으면 디자인이 pjscrape 또는 스크래피보다 훨씬 나빠질 것입니다.

참고 : 여기서는 기본적으로 크롤링 및 스크래핑이라는 용어를 서로 바꿔 사용할 수 있습니다. 이것은 Quora 질문에 대한 제 답변의 사본입니다. 꽤 깁니다.

도구

선호하는 브라우저에 따라 Firebug 또는 Chrome 개발 도구에 매우 익숙해집니다. 이는 데이터를 가져 오는 사이트를 탐색하고 찾고있는 데이터가 포함 된 URL과 응답을 구성하는 데이터 형식을 파악할 때 절대적으로 필요합니다.

HTTP와 HTML에 대한 좋은 실무 지식이 필요하며 중간 프록시 소프트웨어에서 괜찮은 사람을 찾고 싶을 것입니다. HTTP 요청 및 응답을 검사하고 쿠키와 세션 정보 및 쿼리 매개 변수가 전달되는 방식을 이해할 수 있어야합니다. Fiddler ( http://www.telerik.com/fiddler ) 및 Charles Proxy ( http://www.charlesproxy.com/ )는 널리 사용되는 도구입니다. 저는 mitmproxy ( http://mitmproxy.org/ )를 많이 사용합니다. 저는 마우스보다는 키보드에 가깝기 때문입니다.

즉각적인 피드백으로 다양한 코드를 시험해 볼 수있는 일종의 콘솔 / 쉘 / REPL 유형 환경은 매우 중요합니다. 이와 같은 리버스 엔지니어링 작업은 시행 착오가 많으므로이를 쉽게 수행 할 수있는 워크 플로가 필요합니다.

언어

PHP는 기본적으로 나 왔으며이 작업에 적합하지 않으며이 영역에서 라이브러리 / 프레임 워크 지원이 열악합니다. Python (Scrapy는 훌륭한 시작점)과 Clojure / Clojurescript (놀라 울 정도로 강력하고 생산적이지만 학습 곡선이 큼)은이 문제에 대한 훌륭한 언어입니다. 새로운 언어를 배우지 않고 이미 Javascript를 알고 있으므로 JS를 고수하는 것이 좋습니다. 나는 pjscrape를 사용하지 않았지만 그들의 문서를 빨리 ​​읽으면 꽤 좋아 보인다. 그것은 잘 맞으며 아래에서 설명하는 문제에 대한 훌륭한 솔루션을 구현합니다.

정규식에 대한 참고 사항 : HTML을 구문 분석하기 위해 정규식을 사용하지 마십시오. 많은 초보자가 이미 정규식에 익숙하기 때문에이를 수행합니다. 큰 실수입니다. xpath 또는 css 선택기를 사용하여 html을 탐색하고 정규식 만 사용하여 html 노드 내부의 실제 텍스트에서 데이터를 추출합니다. 이것은 이미 당신에게 명백 할 수 있습니다. 시도해 보면 금방 명백해집니다.하지만 많은 사람들이 어떤 이유로이 길을가는 데 많은 시간을 낭비합니다. xpath 또는 css 선택자를 두려워하지 마십시오. 정규식보다 배우기 쉽고 정확한 문제를 해결하도록 설계되었습니다.

자바 스크립트가 많은 사이트

예전에는 http 요청을하고 HTML 응답을 구문 분석해야했습니다. 이제 표준 HTML HTTP 요청 / 응답과 대상 사이트의 자바 스크립트 부분에 의해 만들어진 비동기 HTTP 호출이 혼합 된 사이트를 거의 확실하게 다루어야합니다. 여기에서 프록시 소프트웨어와 firebug / devtools의 네트워크 탭이 매우 편리합니다. 이에 대한 응답은 html 또는 json 일 수 있으며 드물게 xml 또는 다른 것입니다.

이 문제에 대한 두 가지 접근 방식이 있습니다.

낮은 수준의 접근 방식 :

사이트 자바 스크립트가 호출하는 ajax URL과 해당 응답의 모양을 파악하고 동일한 요청을 직접 할 수 있습니다. 따라서 http://example.com/foobar 에서 html을 가져와 데이터 한 조각을 추출한 다음 http://example.com/api/baz?foo=b ... 에서 json 응답을 가져와야 할 수 있습니다. 다른 데이터를 가져옵니다. 올바른 쿠키 또는 세션 매개 변수를 전달하는 것을 알고 있어야합니다. 매우 드물지만 때때로 ajax 호출에 필요한 일부 매개 변수가 사이트의 자바 스크립트에서 수행 된 미친 계산의 결과 일 수 있습니다. 리버스 엔지니어링은 성 가실 수 있습니다.

임베디드 브라우저 접근 방식 :

HTML에있는 데이터와 ajax 호출에서 들어오는 데이터를 파악해야하는 이유는 무엇입니까? 모든 세션과 쿠키 데이터를 관리하고 계십니까? 사이트를 탐색 할 때 브라우저와 사이트 자바 스크립트가 그렇게 할 필요가 없습니다. 그게 요점입니다.

phantomjs와 같은 헤드리스 브라우저 엔진에 페이지를로드하면 페이지가로드되고 javascript를 실행하고 모든 ajax 호출이 완료되면 알려줍니다. 적절한 클릭을 트리거하는 데 필요한 경우 자체 자바 스크립트를 삽입하거나 적절한 데이터를로드하기 위해 사이트 자바 스크립트를 트리거하는 데 필요한 모든 것을 삽입 할 수 있습니다.

이제 두 가지 옵션이 있습니다. 완성 된 html을 뱉어 내고 파싱하거나 파싱 및 데이터 형식화를 수행하고 데이터를 추출하는 페이지에 자바 스크립트를 삽입합니다 (아마도 json 형식으로). 이 두 가지 옵션을 자유롭게 혼합 할 수도 있습니다.

어떤 접근 방식이 가장 좋습니까?

그에 따라 저수준 접근 방식에 익숙하고 편안해야합니다. 임베디드 브라우저 접근 방식은 무엇이든 작동하며 구현하기가 훨씬 쉽고 스크래핑에서 가장 까다로운 문제 중 일부가 사라집니다. 또한 이해해야 할 매우 복잡한 기계입니다. HTTP 요청 및 응답뿐만 아니라 요청, 임베디드 브라우저 렌더링, 사이트 자바 스크립트, 삽입 된 자바 스크립트, 자체 코드 및 임베디드 브라우저 프로세스와의 양방향 상호 작용입니다.

임베디드 브라우저는 렌더링 오버 헤드로 인해 규모가 훨씬 느리지 만 많은 다른 도메인을 스크랩하지 않는 한 거의 문제가되지 않습니다. 요청 속도를 제한해야하는 경우 단일 도메인의 경우 렌더링 시간이 완전히 무시 될 수 있습니다.

속도 제한 / 봇 동작

당신은 이것을 아주 잘 알고 있어야합니다. 합리적인 속도로 대상 도메인에 요청해야합니다. 웹 사이트를 크롤링 할 때 잘 작동하는 봇을 작성해야합니다. 이는 robots.txt를 존중하고 요청으로 서버를 망치지 않는 것을 의미합니다. 여기서 실수 나 과실은 서비스 거부 공격으로 간주 될 수 있으므로 매우 비 윤리적입니다. 허용되는 속도는 요청하는 사람에 따라 다릅니다. 1req / s는 Google 크롤러가 실행되는 최대 값이지만 Google이 아니며 Google만큼 환영받지 못할 수도 있습니다. 합리적으로 천천히 유지하십시오. 각 페이지 요청 사이에 2 ~ 5 초를 제안합니다.

봇을 식별하는 사용자 에이전트 문자열로 요청을 식별하고 봇의 목적을 설명하는 웹 페이지가 있습니다. 이 URL은 에이전트 문자열에 포함됩니다.

사이트에서 귀하를 차단하려는 경우 쉽게 차단할 수 있습니다. 스마트 엔지니어는 봇을 쉽게 식별 할 수 있으며, 몇 분의 작업으로 인해 몇 주 동안의 작업으로 인해 스크래핑 코드가 변경되거나 불가능해질 수 있습니다. 관계가 적대적이라면 대상 사이트의 똑똑한 엔지니어가 크롤러를 작성하는 천재 엔지니어를 완전히 방해 할 수 있습니다. 스크래핑 코드는 본질적으로 취약하며 쉽게 악용됩니다. 이 응답을 유발하는 것은 어쨌든 거의 확실히 비 윤리적이므로 잘 작동하는 봇을 작성하고 이에 대해 걱정하지 마십시오.

테스팅

단위 / 통합 테스트 담당자가 아니십니까? 안 됐네요. 이제 하나가되어야합니다. 사이트는 자주 변경되며 코드도 자주 변경됩니다. 이것은 도전의 큰 부분입니다.

현대 웹 사이트를 스크래핑하는 데는 많은 움직이는 부분이 있으며, 좋은 테스트 방법이 많은 도움이 될 것입니다. 이러한 유형의 코드를 작성하는 동안 발생하는 많은 버그는 손상된 데이터를 자동으로 반환하는 유형입니다. 회귀를 확인하기위한 좋은 테스트 없이는 당신이 알아 차리지 못한 채 한동안 쓸모없는 손상된 데이터를 데이터베이스에 저장하고 있음을 알게 될 것입니다. 이 프로젝트를 통해 데이터 유효성 검사 (사용할 좋은 라이브러리 찾기) 및 테스트에 매우 익숙해 질 것입니다. 포괄적 인 테스트가 필요하고 테스트하기 매우 어려운 문제를 결합하는 다른 문제는 많지 않습니다.

테스트의 두 번째 부분에는 캐싱 및 변경 감지가 포함됩니다. 코드를 작성하는 동안 이유없이 동일한 페이지에 대해 서버를 계속해서 망치고 싶지는 않습니다. 단위 테스트를 실행하는 동안 코드가 손상되었거나 웹 사이트가 재 설계 되었기 때문에 테스트가 실패하는지 알고 싶습니다. 관련된 URL의 캐시 된 사본에 대해 단위 테스트를 실행합니다. 캐싱 프록시는 여기서 매우 유용하지만 적절하게 구성하고 사용하기가 까다 롭습니다.

사이트가 변경되었는지도 알고 싶습니다. 사이트를 재 설계하고 크롤러가 손상된 경우 캐시 된 사본에 대해 실행 중이기 때문에 단위 테스트가 여전히 통과됩니다! 라이브 사이트에 대해 드물게 실행되는 또 다른 소규모 통합 테스트 세트가 필요하거나 정확한 문제를 기록하고 문제를 알리고 크롤링을 중지하는 크롤링 코드의 양호한 로깅 및 오류 감지가 필요합니다. 이제 캐시를 업데이트하고 단위 테스트를 실행하고 변경해야 할 사항을 확인할 수 있습니다.

법적인 문제

어리석은 일을한다면 여기 법은 약간 위험 할 수 있습니다. 법이 관련되면 정기적으로 wget 및 curl을 "해킹 도구"라고 부르는 사람들을 상대하는 것입니다. 당신은 이것을 원하지 않습니다.

상황의 윤리적 현실은 브라우저 소프트웨어를 사용하여 URL을 요청하고 일부 데이터를 보는 것과 자체 소프트웨어를 사용하여 URL을 요청하고 일부 데이터를 보는 것 사이에 차이가 없다는 것입니다. Google은 세계에서 가장 큰 스크래핑 회사이며 사랑을 받고 있습니다. 사용자 에이전트에서 봇 이름을 식별하고 웹 크롤러의 목표와 의도에 대해 공개하면 법이 Google이 무엇인지 이해하므로 여기에서 도움이됩니다. 가짜 사용자 계정을 만들거나 사이트의 영역에 액세스하면 안되는 (robots.txt에 의해 "차단"되거나 어떤 종류의 승인 악용으로 인해) 그늘진 일을하고 있다면 비 윤리적 인 행동을하고 있음을인지하십시오. 그리고 기술에 대한 법의 무지는 여기서 매우 위험 할 것입니다. 말도 안되는 상황이지만 실제 상황입니다.

성실한 시민으로서 새로운 검색 엔진을 시도하고 구축하고, 실수를하거나 소프트웨어에 버그가있어 해커로 보일 수 있습니다. 현재의 정치적 현실을 고려할 때 원하는 것이 아닙니다.

어쨌든이 거대한 벽의 글을 쓸 사람은 누구일까요?

내 인생에서 웹 크롤링 관련 코드를 많이 작성했습니다. 저는 컨설턴트, 직원 및 창업 창업자로서 10 년 이상 웹 관련 소프트웨어 개발을 해왔습니다. 초기에는 펄 크롤러 / 스크래퍼와 PHP 웹 사이트를 작성했습니다. XMLHTTPRequest가 아이디어가되기 전에 Jesse James Garrett이 이름을 ajax로 지정하기 전에 csv 데이터를 웹 페이지에로드하는 숨겨진 iframe을 임베드 할 때 ajax를 수행했습니다. jQuery 이전, json 이전. 저는 30 대 중반인데,이 사업에서는 고대인으로 여겨집니다.

저는 대규모 크롤링 / 스크래핑 시스템을 두 번 작성했습니다. 한 번은 미디어 회사 (Perl)의 대규모 팀용으로, 최근에는 소규모 팀의 경우 검색 엔진 스타트 업 (Python / Javascript)의 CTO로 작성했습니다. 저는 현재 컨설턴트로 일하며 주로 Clojure / Clojurescript로 코딩합니다 (일반적으로 훌륭한 전문가 언어이며 크롤러 / 스크래퍼 문제를 즐겁게 만드는 라이브러리가 있습니다)

저는 성공적인 크롤링 방지 소프트웨어 시스템도 작성했습니다. 원하지 않는 봇을 식별하고 방해하려는 경우 스크랩 할 수없는 사이트를 작성하는 것은 매우 쉽습니다.

나는 다른 유형의 소프트웨어보다 크롤러, 스크레이퍼 및 파서를 작성하는 것을 더 좋아합니다. 도전적이고 재미 있으며 놀라운 것을 만드는 데 사용할 수 있습니다.


4
나는 PHP가 나쁜 선택이라는 것에 동의했지만 올바른 라이브러리를 사용하면 그렇게 나쁘지 않습니다. 정규식 및 배열 / 스팅 조작은 서 투르지만 장점은 빠르고 어디서나 가능합니다.
pguardiario 2014 년

3
이것을 즐거움으로 만드는 몇 개의 라이브러리와 아주 간단하고 아주 쉽게 만드는 많은 라이브러리가있는 환경에서 ... 왜 "너무 나쁘지 않은"것에 만족하겠습니까? 동의합니다. PHP (및 FORTRAN, C, VB 등)에서 수행 할 수 있지만 문제가 정말 간단하지 않으면 작업에 적합한 도구를 사용하는 것이 훨씬 더 좋습니다. 그리고 다시 말하지만, 해결해야 할 매우 간단한 문제가 없다면 ... 정규식이 어디에나 있다는 것이 중요합니까? 라이브러리 설치는 거의 모든 스크래핑 문제보다 훨씬 간단합니다. 그리고 실제로 정규식은 종종이 문제에 대해 매우 느립니다.
Jesse Sherlock

5
당신이 바로 수 있습니다,하지만 난 있다는 사실을 알고 PHP에서 쉽게 그것을 할 수 없습니다. PHP에서 떠나기 전에 저는 거의 10 년의 전문적인 PHP 경험이있었습니다. 저는 Python에서 대규모 스크래핑 시스템을 구축하는 데 1 년 이상을 보냈습니다. PHP에서 사용할 수없는 멋진 라이브러리가 없거나 Python에서 사용할 수있는 간결한 메타 프로그래밍 기술 없이는 수행하는 것을 상상할 수 없습니다. . 이것이 제가 Clojure로 옮긴 이유이기도합니다. 더욱 강력한 메타 프로그래밍 능력을 얻기 위해서입니다.
Jesse Sherlock

4
Enlive는 프로젝트 특정 코드에 대한 Clojure 자체의 힘과 함께 가장 큰 승자입니다. 스키마는 정보 추출 코드의 큰 부분 인 훌륭한 유효성 검사 라이브러리입니다. 저는 현재 Mahout과 일부 js 실행을위한 Nashorn / Rhino와 같은 Java 세계와의 쉬운 상호 운용에 정말 만족합니다. 그리고 Clojure 사람들은 github.com/shriphani/subotai 와 같은 libs를 작성하는 유형입니다. 이므로 필요하지 않습니다. ... ... 다음 코멘트에 계속
제시 셜록에게

3
또한 실제 브라우저가 필요하고 phantomjs / casperjs를 사용해야 할 때 clojurescript (종종 cljx를 사용하여 clj와 cljs간에 공유되는 코드)를 사용하여 clojurescript 대신 페이지에 삽입하는 js를 작성하는 것이 정말 좋습니다. . Core.async는 서버에서 동시 크롤링 코드를 조정하고 js 환경 내에서 콜백 지옥을 벗어나는 데 유용합니다 (phantomjs 내부의 core.async cljs 코드로 브라우저 자동화를 조정하는 것은 대안에 비해 천국입니다).
Jesse Sherlock

21

예, 직접 할 수 있습니다. 페이지의 소스를 파악하고 원하는 방식으로 구문 분석하기 만하면됩니다.

다양한 가능성이 있습니다. 좋은 콤보는 python-requests (urllib2 위에 빌드 urllib.request되고 Python3에 있음)와 BeautifulSoup4 를 사용하는 것입니다.이 메서드는 요소를 선택하는 방법이 있고 CSS 선택자를 허용합니다 .

import requests
from BeautifulSoup4 import BeautifulSoup as bs
request = requests.get("http://foo.bar")
soup = bs(request.text) 
some_elements = soup.find_all("div", class_="myCssClass")

일부는 xpath 구문 분석 또는 jquery와 같은 pyquery, lxml 또는 다른 것을 선호 합니다 .

원하는 데이터가 일부 JavaScript에 의해 생성 되면 위의 내용이 작동하지 않습니다. python-ghost 또는 Selenium이 필요합니다. 후자 는 PhantomJS와 결합되어 훨씬 가볍고 설치가 간단하며 사용하기 쉽습니다.

from selenium import webdriver
client = webdriver.PhantomJS()
client.get("http://foo")
soup = bs(client.page_source)

자신의 솔루션을 시작하는 것이 좋습니다. 그렇게함으로써 Scrapy의 이점을 이해하게 될 것입니다.

추신 : scrapely 살펴보기 : https://github.com/scrapy/scrapely

pps : 프로그래밍 지식없이 시각적으로 정보 추출을 시작하려면 Portia를 살펴보십시오 : https://github.com/scrapinghub/portia


anwser에게 감사합니다. 유일한 문제는 Python이 내 기술에 없다는 것입니다. 동일한 작업을 수행 할 수있는 다른 좋은 프로그래밍 언어가 있습니까? 저는 주로 PHP와 Javascript로 작업합니다.
0x1ad2

혼란스러워서 죄송합니다 (제 질문에서 Python 프레임 워크를 언급했습니다).하지만 Python이 최선의 방법이라면 배울 수 있습니다.
0x1ad2

Python은 스크래피를 매우 쉽게 만듭니다. 배우기도 쉽습니다. 현재 잘 작동하는 최고의 스크레이퍼는 스크레이퍼입니다. 그들은 또한 아주 좋은 문서를 가지고 있습니다.
Abhishek 2014 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.