웹 페이지에서 데이터를 안정적이고 효율적으로 가져 오기 없습니다. (공개 웹 사이트의 데이터) 데이터가

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

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

나는 주목해야한다 :

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

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

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

편집하다:

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



답변

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

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

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


답변

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

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

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

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


답변

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

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

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


답변

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

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

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

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


답변

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