웹 페이지에서 데이터를 안정적이고 효율적으로 가져 오기


11

최근에 정규식을 사용하여 웹 사이트의 HTML을 구문 분석하여 필요한 데이터를 얻는 것이 최선의 조치가 아니라는 것을 알게되었습니다.

그래서 내 질문은 간단합니다. 그렇다면이 데이터를 얻는 가장 / 가장 효율적이며 일반적으로 안정적인 방법은 무엇입니까?

나는 주목해야한다 :

  • API가 없습니다
  • 데이터를 얻을 수있는 다른 소스는 없습니다 (데이터베이스, 피드 등 없음)
  • 소스 파일에 액세스 할 수 없습니다. (공개 웹 사이트의 데이터)
  • 데이터가 HTML 페이지의 표에 표시되는 일반 텍스트라고 가정 해 봅시다.

나는 현재 프로젝트에 파이썬을 사용하고 있지만 언어 독립적 인 솔루션 / 팁은 좋을 것입니다.

부수적 인 질문으로 : Ajax 호출로 웹 페이지를 구성 할 때 어떻게해야합니까?

편집하다:

HTML 파싱의 경우 데이터를 얻는 안정적인 방법이 없다는 것을 알고 있습니다. 페이지가 변경되는 즉시 구문 분석기가 완료됩니다. 이 경우 안정적인 의미는 페이지를 구문 분석하는 효율적인 방법으로 페이지가 변경 되지 않는 한 항상 동일한 결과 집합 (같은 데이터 세트에 대해)을 나에게 전달하는 효율적인 방법 입니다.


8
스크래핑을 구현하는 방법에 관계없이 웹 페이지를 간단하게 변경하면 쉽게 깨질 수 있습니다. 데이터를 얻는 가장 안정적인 방법은 데이터 작성자에게 연락하여 데이터를 정상적인 형식으로 얻는 거래를 중개하는 것입니다. 때로는 비용이 들지 않습니다.
Joachim Sauer

1
@JoachimSauer-질문은 여전히 ​​'최상의'방법으로 대답 할 수 있습니다.
익명

대부분의 웹 사이트는 동적이며 데이터를 데이터베이스에 저장하기 때문에 웹 사이트에서 데이터베이스를 얻는 것이 가장 좋습니다. 웹 사이트에 API가있는 경우 사용할 수 있습니다. 정적 페이지를 긁어 내고 싶다면 내장 Python urllib 및 HTMLParser 모듈이 잘 작동합니다. PyPi에서 HTML 스크랩을위한 몇 가지 패키지도 제공됩니다.
Ubermensch

사이트 스크래핑은 까다로운 사업입니다. 사이트 소유자가 당신을 원하지 않기 때문에이를 수행하는 안정적인 방법은 실제로 없으며 업계 전체가 사람들의 행동을 막으려 고 노력하고 있습니다.
Steven Evers

1
Webkit과 같은 웹 브라우저를 내장 한 다음 DOM 스크립팅을 사용하여 렌더링 된 페이지에서 정보를 얻을 수 있습니까? 거의 모든 플랫폼은 그렇게하지만, 여기 당신이 Qt는 그것을 할 거라고 방법은 수 doc.qt.nokia.com/4.7-snapshot/qtwebkit-bridge.html
user16764

답변:


2

글쎄, 여기 내 2 센트가 있습니다 :

AJAX가 없거나 쉽게 지울 수있는 경우 HTMLTidy를 사용하여 HTML을 XHTML로 '고정'한 다음 정규식 대신 XPath를 사용하여 정보를 추출하십시오.
잘 구성된 웹 페이지에서 논리적으로 분리 된 정보 엔터티는 서로 다르거 <div>나 다른 태그에 있습니다. 즉, 간단한 XPath 표현식으로 올바른 정보를 쉽게 찾을 수 있습니다. Chrome 콘솔 또는 Firefox 개발자 콘솔에서 테스트하고 한 줄의 다른 코드를 작성하기 전에 작동하는지 확인할 수 있기 때문에 이것은 또한 좋습니다.
이 접근법은 또한 신호 대 잡음비가 매우 높으며, 일반적으로 관련 정보를 선택하는 표현은 단일 라이너이기 때문입니다. 또한 정규 표현식보다 읽기 쉽고 그 목적을 위해 설계되었습니다.

페이지에 AJAX 및 심각한 JavaScript가있는 경우 애플리케이션에 브라우저 구성 요소를 임베드하고 해당 DOM을 사용하여 필요한 이벤트를 트리거하고 XPath를 사용하여 정보를 추출하십시오. 임베드 가능한 브라우저 구성 요소가 많이 있습니다. 대부분의 웹 브라우저는 실제 브라우저를 사용합니다. 이는 웹 페이지가 잘못된 (X) HTML 일 수 있지만 여전히 모든 주요 브라우저에서 훌륭하게 렌더링되기 때문에 좋은 것입니다 ( 실제로, 대부분의 페이지는 결국이 방법을 사용합니다).


감사합니다. XPath를 좀 더 살펴 보겠습니다. 나는 그것을 사용하는 데 익숙하지 않으므로 배우는 것이 좋을 것입니다. +1 :)
Mike

5

내 경험상 .NET 환경을 사용하면 HTML Agility Pack 을 활용할 수 있습니다 .

페이지가 XHTML로 포맷 된 경우 일반 XML 파서를 사용할 수도 있습니다. 상상할 수있는 모든 환경에는 많은 것들이 있습니다.

AJAX에 대한 부가 질문은 일반 HTTP 네트워킹 코드를 사용하여 데이터를 가져 와서 구문 분석 할 수 있습니다.

AJAX 스택이 XML을 반환하면 다시 선택할 수 있습니다. JSON을 반환하면 스트림을 유형이 지정된 객체에 매핑 할 수있는 라이브러리를 고려하십시오. .NET에서는 Newtonsoft.Json을 제안합니다 .


그리고 'HTTP 네트워킹 코드'는 요청이있을 때 서버의 응답을 캡처하는 것을 의미합니까? 제안 해 주셔서 감사합니다. 꼭 검토하겠습니다. +1
Mike

바로 그거죠. .NET에서는 System.Net.WebClient 또는 RestSharp | restsharp.org . Droid 용 Mono에서도 사용했습니다.
gsscoder

4

HTML 구문 분석은 잘못된 마크 업 (태그 수프)을 처리해야하므로 완전히 간단한 작업이 아닙니다. 수년 동안 브라우저는 오류를 처리하기 위해 거의 동일한 전략을 구현했으며 HTML5 사양에서 알고리즘이 구현되었습니다 (예 : HTML5 사양은 HTML5가 아닌 작업과 관련하여 수행 할 작업을 지정합니다).

는 HTML을 구문 분석하는 모든 주요 언어에 대한 라이브러리입니다 (예 : this) .

어쨌든 당신이 얻는 것은 어떤 의미에서도 안정적이지 않습니다. 웹 페이지 형식이 변경 될 때마다 스크레이퍼를 조정해야합니다.


고마워, 나는 Beautiful Soup 을 사용 하여 일을 끝냈습니다. 나는 그것이 안정적이지 않을 것이라는 것을 알고 있습니다. 아마도 내 질문에서 그것을 분명히해야합니다. +1 당신을 위해 :)
Mike

4

부수적 인 질문으로 : Ajax 호출로 웹 페이지를 구성 할 때 어떻게해야합니까?

아약스 호출이 이루어지면, 일부 변수가있는 POST 또는 GET URL 일 가능성이 큽니다.

엔드 포인트와 매개 변수가 무엇인지 알아보기 위해 JavaScript를 조사하겠습니다. 그 후 반환 된 데이터가 json / xml / 일반 텍스트 또는 부분 HTML 일 가능성이 큽니다.

위의 정보를 알면 간단히 해당 엔드 포인트에 GET 또는 POST 요청을 작성하고 리턴 된 데이터를 구문 분석하십시오.


2
많은 서비스가 HTTP 헤더를 검사하여 HTTP_X_REQUESTED_WITHis임을 확인해야 XMLHttpRequest합니다. 좋은 것은 POST 요청에 대해 일종의 XSRF 보호를 구현하므로 해당 마술 쿠키도 필요합니다. 일부 공개 API에 의해 의도적으로 노출되지 않은 AJAX 엔드 포인트를 간지럽 히는 것은 약간 어색한 느낌이 들며 출력 (또는 요청 정책)이 변경되면 스크레이퍼가 파손되기 쉽습니다.
Tim Post

@TimPost 당신은 100 % 정확합니다. 나는 그것의 "icky"에 동의하지만 :) 공용 API가 없으면 반드시 필요합니다.
Darknight

나는 내 자신의 AJAX 기반 응용 프로그램에서 이것을 사용할 수 있습니다 (그리고 '자신'에 의해 나는 그것을 썼다는 것을 의미하지 않지만 설정은 내 것이 아닙니다).하지만 다른 서버의 시스템을 우회하려고 시도하지 않고 @@에 동의해야합니다. TimPost는 일종의 'icky'인 것 같습니다. 그러나 좋은 생각입니다. 감사합니다! +1!
Mike

1

이를 위해 안정적이고 좋은 방법은 없습니다. HTML 웹 페이지는 컴퓨터로 조작하지 않았습니다. 인간 사용자를위한 것이지만 필요한 경우 브라우저와 일부 자바 스크립트를 사용하는 것이 좋습니다. 나는 일할 때 타사 사이트에서 정보를 추출해야하는 프로젝트에 참여했습니다. 이 애플리케이션은 Chrome 확장 프로그램으로 개발되었습니다. 응용 프로그램 논리는 페이지로드가 완료된 후 사이트에 삽입 된 자바 스크립트를 사용하여 작성됩니다. 추출 된 데이터는 http 서버를 통해 데이터베이스로 전송됩니다. 최선의 방법은 아니지만 작동합니다. 추신 : 사이트 소유자는 우리에게 그러한 일을하도록 승인했습니다.


HTML 페이지는 컴퓨터에서 파싱하지 않아야하지만 때로는 다른 옵션이없는 경우가 있습니다. 또한 어떤 방식 으로든 상업적이지 않은 개인 프로젝트에 공개적으로 사용 가능한 정보를 사용하고 있는데, 명시적인 승인이 필요하지 않다고 생각합니까? 입력 해 주셔서 감사합니다! 당신도 +1;)
Mike

@MikeHeremans 웹 사이트에서 정보를 얻을 수있는 권한이 있는지 확인하려면 ToS 및 robots.txt를 읽으십시오. 두 가지 모두 정보를 자동으로 긁어 낼 권리를 거부하지 않는 경우 대부분의 경우 합법적으로 확인해야합니다. 물론, IANAL ...
K.Steff

: 당신이 언급 한 프로젝트의 코드를보고 싶은 경우 code.google.com/p/acao-toolkit/source/browse/...을 . content_script.js를 확인하십시오. 페이지에 삽입 된 코드입니다.
nohros
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.