2013-07-30 2 views
1

Nokogiri를 사용하여 소매점 웹 사이트에서 제품 데이터를 가져 오는 프로젝트를 실험하고 있습니다. 500 개 이상의 소매 업체가 있으며 페이지 구조를 포함한 사이트 구조는 서로 매우 다릅니다.Ruby에서 {classes} 디자인하기 (레일즈에서)

초기 생각은 모든 소매 업체 (사이트)에 대해 하나의 클래스를 만들어 모든 변경 사항을 쉽게 채택 할 수 있도록하는 것이 었습니다. 그러나 각 클래스가 명시 적으로 '필수'(로드/언로드)되어 있는지, 너무 많은 성능 문제가 발생하는지 확신 할 수 없습니다.

+0

Ruby를 사용하면 클래스와 메소드를 동적으로 덮어 쓸 수 있습니다. 'load'는'require'가 할 첫 번째 시간뿐만 아니라 요청할 때마다 파일을로드 할 것입니다. 이러한 동작을 함께 사용하면 이전에로드 된 코드를 덮어 쓰면서 요청에 따라 특정 사이트의 코드를 동적으로로드 할 수 있습니다. Ruby의 가비지 수집은 클래스를 덮어 쓸 때 사용 가능한 메모리를 다시 확보해야합니다. 시도해보십시오. 예상대로 작동하지 않는 경우 코드와 결과 *를 사용하여 질문을 수정하십시오. –

답변

2

걱정할 것이 없다고 생각합니다. 한 번 prod env에서 미리로드하는 것이 좋습니다. 그들은 확실히 어떤 기억을 먹을 것입니다. 하지만 500 클래스는 그리 많지 않으므로 좋은 생각이 될 것입니다.

+0

나는 이것을 두 번째 줄 것이다. 'Dir [ "retailers/*. rb"]로 전체 디렉토리를 쉽게'요구할 수 있습니다. each {| file | 필수 파일}'. – nTraum

+0

사이트 간의 차이를 지정하는 DRY 방법이 있습니까? 그 행동들은 똑같을 것이기 때문입니다. 각 사이트의 해시가 더 나은 디자인과 의미를 갖출 수 있습니까? 'site_1 = {: product => "// * [(@ id = \"products \ ")]", : product_detail => "..."} 등등. – Bala

+1

개별 스크래퍼에 대해 일종의 상속 계층 구조를 만들 수 있습니다. 그리고 다른 xpath 선택기를 유지하는 것이 좋을 수도 있습니다. 그러나, 내 경험에, 일반적으로 여러 사이트의 근근이 살아가는 것은 다른 xpath 선택자를 지정하는 것만 큼 간단하지 않습니다. 보통 사이트의 일부에 대해 사용자 지정 비표준 스크래핑 논리를 구현해야합니다. 따라서 스크래핑 논리의 다른 부분에 연결할 수 있어야한다는 점이 필수적입니다. 그리고 바로 이것이 객체 계층 구조가 무대가되는 곳입니다. – cryo28