2017-03-08 5 views
0

저는 소비재를 거래하는 온라인 상점을 운영하고 있습니다. 온라인 상점은 소비자 수요에 따라 시장 가격이 항상 유동적입니다.많은 수의 URL을 긁어내는보다 효과적인 방법이 있습니까 (> 30k)?

나는 최근에 ~ 30k 개의 URL 목록을 통해 작동하는 루비 스크립트 (rake task)를 매일 실행하여 경쟁자의 가격을 기록하기 시작했으며 관련 자료 몇 개를 채웠다. 탄성 검색 지수. 모든 사이트가 자바 스크립트를 실행하지 않고 필요한 데이터를 올바르게 렌더링하지는 않기 때문에 Nokogiri와 PhantomJS를 사용합니다.

내 프로그램은 현재 실행 중에 ~ 4GB의 메모리를 소비하며, PhantomJS는이 소비의 대부분을 차지합니다 (~ 2.5GB). 스크립트도 실행하는 데 많은 시간이 걸립니다. 정확히 얼마나 길지는 모르겠지만 10 시간 이상이라고 생각합니다.

저는 메모리 소비를 줄이고 스크래핑 속도를 향상시키는 방법에 대한 제안을 매우 열어두고 있습니다. 제 경쟁자가 저에게 멋진 JSON API를 제공하기를 바랍니다.하지만 유감스럽게도 그런 종류의 관계는 없습니다.

+0

* JavaScript없이 스크랩 할 수있는 사이트의 경우 대체 경로를 구현하십시오. 동시성 증가 - 실제 CPU 부하를 기반으로 한 스로틀. (또한 다른 1.5GB는 어디로 가고 있습니까? : - /) – user2864740

+0

인터넷 검색을 통해 찾을 수있는 일반적인 모범 사례를 토대로 의견을 제시해주십시오. 특정 정보가 필요하면 시스템 및 코드에 대한 세부 정보를 제공해야합니다. "[ask]"및 "[mcve]"를 참조하십시오. –

+0

매일 스 크립트를 실행하지 말고, 스로틀 링을 보조 코드에서 계속 실행하십시오. 페이지가 마지막으로 확인 된 시간을 추적하고 n 시간 이내에 다시하지 마십시오. 좋은 시민이된다는 것은 다른 사람의 호스트 나 대역폭을 꺾지 않는다는 것을 명심하십시오. 마지막으로 본 이후 페이지가 변경되었는지 확인하려면 HTTP HEAD 요청을 사용하십시오. –

답변

-2

마무리 작업이 필요하기 때문에 단일 스레드에서 스크래퍼를 실행한다고 가정합니다. 스크립트를 여러 스레드에서 실행하는 것을 고려해야합니다. https://www.tutorialspoint.com/ruby/ruby_multithreading.htm

+1

나는 당신의 제안에 따라 여러 스레드에서 실행 해보려고한다. 왜 이것이 전체 실행 시간을 단축 할 것이라고 생각 하느냐에 따라이 대답이 왜 하향 투표되었는지 확실하지 않습니다. –

1

처리량을 떨어 뜨리지 않고 스크래핑 속도를 높이고 메모리 소비를 낮게 유지할 수있는 몇 가지 사항이 있습니다.

메모리 소비를 줄이려면 URL을 데이터 구조를 통해 메모리에 저장하는 대신 플랫 파일이나 데이터베이스에 보관할 수 있습니다.

몇 번의 반복 작업 만 수행하면 데이터 구조가 비워집니다.

URL 스크랩 당 평균 소요 시간이 1.2 초 (10 * 60 * 60/30000 = 1.2)보다 길기 때문에 순차적으로 요청한다고 가정합니다. 하나의 요청이 완료 될 때까지 코드가 완료 될 때까지 기다릴 수 있으므로 한 번에 여러 요청에 대한 비동기 호출을 수행 할 수 있습니다.

"Building blocks of a scalable web crawler"은 확장 가능한 스크래핑을위한 대부분의 측면을 설명합니다.

다음은 내가 제공 한 코드에 대한 정보가 없기 때문에 가능한 몇 가지 제안 사항입니다.

+0

[Typhoeus and Hydra] (https://github.com/typhoeus/typhoeus)는 HTTP에 대해 특히 우수한 병렬 처리 조합을 만듭니다. –

+0

사실 나는 많은 정보를 메모리에 저장하는 대신 플랫 파일을 사용하기 시작했습니다. PDF 링크에 감사드립니다. 유용한 자료입니다. –

2

가장 확실한 작업은 전체 브라우저 처리가 필요한 사이트를 식별하고 필요없이 직접 찢어 낼 수있는 것입니다.

둘째, 실행중인 JavaScript 애플리케이션을 검사하여 사용중인 API에서 직접 필요한 데이터를 얻을 수있는 방법이 있는지 확인하는 것입니다. 일반적으로 서버 측과 통신하는 일종의 JSON API가 있다는 클라이언트 측 애플리케이션 (예 : Angular, React, Ember)의 경우입니다. 해당 API와 직접 인터페이스 할 수 있다면 실제로 데이터 수집 프로세스를 대폭 간소화 할 수 있습니다. HTML을 전혀 파싱하지 않아도됩니다!

루비는 일반적으로 처리에 있어서는 꽤 좋지만, 항상 가장 효율적인 것은 아닙니다. 고려해야 할 점은 JRuby와 쓰레드를 사용하면 성능이 향상 될 수 있다는 것입니다. 일반적으로 초기 메모리 풋 프린트를 줄이지 만 ~ 40 % 더 빠르게 실행되는 드롭 인 대체품입니다.

노드를 사용할 가능성을 탐색 할 수도 있습니다.js는 Ruby의 많은 JavaScript 런타임과 비교하여 JavaScript를 가져 오거나 실행하는 더러운 작업을 많이 수행합니다. Ruby 백엔드에 내용을 넘겨 주어 더 많은 처리를 할 수있는 꽤 좋은 프리 페처 (pre-fetcher) 역할을 할 수도 있습니다.

그런 하이브리드 시스템을 구축하는 것은 대기열 또는 지속성 메커니즘으로 작동하는 데이터베이스, Redis 또는 RabbitMQ 중간 계층으로 매우 쉽습니다.

+1

제안 해 주셔서 감사합니다. 대부분의 경우 API 대신 데이터에 직접 액세스 할 수는 없지만 웹 사이트에서 자바 스크립트를 검사하여 사용할 수있는 바로 가기를 발견 할 수있었습니다. 긁기. –

0

나는 당신이 시간을 절약하고 SaaS 오퍼링으로 가야한다고 주장 할 것이다.

  • Datafiniti은 8 천만 개가 넘는 기존 제품의 데이터베이스를 사용하여 가격 및 기타 데이터에 액세스 할 수 있습니다. 아직 데이터가 없다면 추가하는 것이 좋습니다.
  • 80legs은 매개 변수를 기반으로 주문형 웹 크롤링을 제공합니다. 언제든지 원하는만큼 자주 URL을 크롤링 한 다음 API 또는 대시 보드를 통해 데이터를 다시 가져올 수 있습니다.
  • 은 멋진 크롤링 및 추출 기능을 제공하며 그 위에 멋진 UI가 제공됩니다. 80legs와 마찬가지로 상당히 견고한 추출 기능이 내장되어 있습니다. 다시 설정하고 자주 데이터를 크롤링하고 API 또는 대시 보드를 통해 결과를 검색하십시오.

나는 자신 만의 롤 기능이있는 시간과 장소가 있다고 생각합니다. 예를 들어 가치 평가의 이유로 또는 자신의 IP로이를 구축하여이 크롤링을 조직의 핵심 역량으로 간주하려는 경우 (즉 경쟁 우위) 그러나 당신이 잘 작동하고 크롤링 사업에 종사하고 있지 않다면, 이것은 다른 누군가의 어깨에 설 수있는 좋은 시간입니다.

+0

이러한 링크를 이용해 주셔서 감사 드리며 이러한 목적으로 이러한 서비스 중 하나를 사용할 수 있는지 검토하고 있습니다. –