2010-07-03 2 views
1

나는 최근에 웹 페이지의 구문 분석을 많이 해 봤는데 내 처리는 일반적으로이 같은 같습니다나중에 파싱하기 위해 전체 웹 페이지를 저장하는 방법?

  1. 데이터베이스에 각
  2. 다운로드 전체 웹 페이지를
  3. 가져 오기 목록을 구문 분석하는 링크의 목록을 얻을 링크 및
  4. 단계 4,5 (무엇이든, 내용, METAS) 각 긁어 세션
  5. 긁어 관련 부분에 대한 색인을 추가 MySQL의에 저장 - 반복/린스 - I로 t는 diff를 다듬기를 원한다. 같은 페이지의 콘텐츠를 나중에 수정하거나 xpath를 수정하거나 해당 내용 또는 다른 내용을 삭제하십시오.
  6. 수출 스크 레이 핑의 실시간 데이터베이스에 대한 데이터베이스 및 웹 페이지 열을 제거하고 긁어 인덱스 지금

, 가장 쉬운 대답은 당신이 웹 페이지를 다운로드하는 동시에 긁어 않습니다 물론이지만, 나는이 생각하지 않습니다 이 과정을 조금 더 성장시킬 수 있기를 바라면서 모듈 식 디자인에 매우 적합합니다.

내가 계속해서 문제가되는 몇 가지 예를 들어 보겠습니다. 50k 페이지 (행)에 대해 나는 약 6g 데이터베이스를 가지고 있습니다. 기억하십시오. 우리는 전체 웹 페이지를 하나의 열에 저장하고 관련 데이터를 추출하여 다른 열에 저장합니다.

테이블에 인덱스를 던지면 6 기가의 램이있는 쿼드 코어에서 7-10 분이 걸릴 수 있습니다. 하나님은 당신이 무언가를 망칠 것을 금하고 mysqld가 70 % cpu와 당신의 숫양으로 뛰어 오르는 것을 지켜보십시오. 이것은 4 단계입니다. 모든 작업을 수행하기 전에 열에 인덱스를 던져야합니다. 메타를 잡고 싶다면 제목 열에 대해 인덱스를 던지고 각각을 업데이트하십시오. where title은 null이 아닙니다.

내가 한 행에 모든 행을 쓰지 않는다는 것을 밝혀야한다. 그것은 나에게 나쁜 영향을주는 경향이있다. 기억해야 할 것은 6gig를 메모리에로드하는 것이다. ;)

내가이 문제에 대한 해결책은 총 카운트를 잡아서 한 번에 100 개 정도의 오프셋을 반복하는 것입니다.

아직도 - 여기에도 일부 저장 문제가 있다고 생각합니다. 대신 파일 시스템에 원래 웹 페이지를 저장해야합니까? 문고 또는 소파와 같은 문서 지향 데이터베이스에 페이지를 저장하는 방법에 대해 생각해 보았습니다.

수정 여기 제시된 해결책은 한 사용자가 50k 페이지를 단지 하나의 배치라고 간주한다는 사실을 고려해야합니다. 나는 아직 여러 사용자를 보유하려고하지 않고 있지만 한 번에 두 개 이상의 배치를 저장할 수있는 기능을 원합니다.

답변

0

wget과 같은 기존 web crawler 또는 기타 여러 가지 중 하나를 사용할 수 있습니다. 이렇게하면 파일을 하드 디스크에 다운로드 한 다음 나중에 파일을 구문 분석하고 데이터베이스에 대한 정보를 데이터베이스에 저장할 수 있습니다.

+0

- 우리의 경우 네가이 길을 갔다. 각 디렉토리에 X 페이지 수를 저장하려는 경우 당신의 유일한 색인에 의하여 전화 번호부 또는 어떤 권리? - 분명히했는지 확실하지 않지만 50k 페이지가 한 번에 하나 일뿐입니다 - 한 번에 수백 또는 수천 개를 저장하고 싶습니다. – eyberg

+0

wget에 디렉토리 구조와 관련된 다양한 옵션이 있습니다. '-x, --force-directories는 디렉토리 생성을 강제합니다 .','-P, --directory-prefix = PREFIX'는'PREFIX/...'에 파일을 저장합니다. –

2

데이터를 삽입하기 전에 표에 색인을 추가하지 않는 이유는 무엇입니까? 이 방법은 행이 테이블에 추가 될 때 인덱스가 작성됩니다.

+0

이것은 일반적인 것들에 대해 작동합니다. 당신은 당신이 파싱 할 것을 알지 못한다면 이해할 수있을 것입니다. -이 조언을 사용하면 우리가하고 싶은 것이 'content'를위한 일반적인 tbl을 만들고 'type 우리가 지금 – eyberg

+0

@feydr, 예 또는 최소한 구문 분석 된 콘텐츠의 색인을 유지하는 것처럼 색인 테이블을 모두 하나의 테이블에 저장하는 대신 (- 1) 열 (단락 1, 표 2, 제목 3 등) 가장 가능성있는 혜택을 얻으려면 모든 사례에 대해 색인을 생성 할 필요가 없습니다. –

1

문제가 발생할 하드웨어가 더 많은 경우 sharding을 통해 여러 서버로 데이터베이스를 분산시킬 수 있습니다.

캡쳐하려는 웹 페이지 (예 : 페이지 구조 태그, 자바 스크립트, 스타일링 등)에서 쓸데없는 정보를 제거하고 적절한 경우 결과를 압축하는 것이 좋습니다.

+0

gzip 압축은 우리가 웹 페이지를 끌어 올 때 효과적입니다 - 캡처 할 때 '쓸데없는 정보'를 제거 할 때 - 제가하려고하는 것에 대해 약간의 차이가 있다고 생각합니다 - 나는 모든 것을 유지하고 싶습니다. 나중을위한 정보 - 때로는 돌아가서 동일한 데이터 세트에서 더 많은 추출을하는 것이 도움이됩니다. 오늘 데이터 비트를 추출한 사람을 생각해보십시오. 그리고 나중에 같은 물건에 대해 2 주 더 걸릴 것입니다. – eyberg

+0

또한이 노트에 있습니다. - 나에게 시간이 걸리므로 소스를 여러 번 다운로드하려고하는 것이 아닙니다. 내가 추월하고있는 사이트에 좋지 않습니다. – eyberg

+0

미리 알고 있던 페이지의 일부만 확인할 수 있다고 가정하고있었습니다. 또한 의도를 알지 못해서 '
'및 '


'과 같은 태그, 줄 바꿈 등은 장기간 사용하지 않을 것으로 예상됩니다. lue. 이를 제거하면 확장시 스토리지 요구 사항이 크게 줄어들 수 있습니다. – Dolph

0

모두를 생각해 주셔서 감사합니다! 파일 시스템의 트리 구조로 페이지를 아래로 당겨

1) :

나는 여기에 하이브리드 접근 방식을 시도 할거야. 이것이 우리의 평균 63K 열이 이제 K의 아마 1/10 있음을 의미합니다 (모든 전체 웹 페이지를 포함하지 않는 일반 콘텐츠 테이블에 내용을 넣어

2).

세부

웹 페이지는 다음과 같이됩니다 주택

1) 내 트리 구조 대신 내보내는 각 '작업'을위한 테이블을 생성 그리고

-- usr_id1k 
| |-- user1 
| | |-- job1 
| | | |-- pg_id1k 
| | | | |-- p1 
| | | | |-- p2 
| | | | `-- p3 
| | | |-- pg_id2k 
| | | `-- pg_id3k 
| | |-- job2 
| | `-- job3 
| |-- user2 
| `-- user3 
|-- usr_id2k 
`-- usr_id3k 

2) 우리는 몇 가지 다른 테이블이있을 것이다 - 차를 하나 'content'테이블.

content_type, Integer # fkey to content_types table 
user_id, Integer # fkey to users table 
content, Text # actual content, no full webpages 

.... 등 created_at, updated_at, 파마, 같은 다른 물건을 ... 당신은 아직도 당신이 특정 디렉토리에 저장할 수있는 파일의 #을 포함하는 문제로 실행하는

관련 문제