>  기사  >  웹 프론트엔드  >  크롤링된 기사를 직접 게시할 수 있는 Node.js 기반의 강력한 크롤러_node.js

크롤링된 기사를 직접 게시할 수 있는 Node.js 기반의 강력한 크롤러_node.js

WBOY
WBOY원래의
2016-05-16 15:20:421652검색

1. 환경 구성

1) 어떤 Linux에서든 서버를 구축할 수 있습니다. 저는 CentOS 6.5를 사용합니다.

2) mysql 데이터베이스를 5.5 또는 5.6으로 설치하세요. lnmp나 lamp를 사용하여 직접 설치할 수도 있습니다. 나중에 브라우저에서 직접 읽을 수도 있습니다.

3) 먼저 node.js 환경을 설치하세요. 0.12.7을 사용하고 있습니다.

4) 크롤러가 백그라운드에서 실행될 수 있도록 npm -g install Forever를 실행하여 영구 설치합니다.

5) 모든 코드를 로컬로 구성합니다(통합 = git clone).

6) 프로젝트 디렉토리에서 npm install을 실행하여 종속 라이브러리를 설치합니다.

7) 프로젝트 디렉토리에 json과 아바타라는 두 개의 빈 폴더를 만듭니다.

8) 빈 mysql 데이터베이스와 전체 권한을 가진 사용자를 생성하고, 코드에서 setup.sql 및 startusers.sql을 연속적으로 실행하고, 데이터베이스 구조를 생성하고 초기 시드 사용자를 가져옵니다.

9) config.js를 편집합니다. (필수)로 표시된 구성 항목은 반드시 입력 또는 수정해야 하며, 나머지 항목은 당분간 변경하지 않고 그대로 둘 수 있습니다.


exports.jsonPath = "./json/";//生成json文件的路径
exports.avatarPath = "./avatar/";//保存头像文件的路径
exports.dbconfig = {
  host: 'localhost',//数据库服务器(必须)
  user: 'dbuser',//数据库用户名(必须)
  password: 'dbpassword',//数据库密码(必须)
  database: 'dbname',//数据库名(必须)
  port: 3306,//数据库服务器端口
  poolSize: 20,
  acquireTimeout: 30000
};
  
exports.urlpre = "http://www.jb51.net/";//脚本网址
exports.urlzhuanlanpre = "http://www.jb51.net/list/index_96.htm/";//脚本网址
  
exports.WPurl = "www.xxx.com";//要发布文章的wordpress网站地址
exports.WPusername = "publishuser";//发布文章的用户名
exports.WPpassword = "publishpassword";//发布文章用户的密码
exports.WPurlavatarpre = "http://www.xxx.com/avatar/";//发布文章中替代原始头像的url地址
  
exports.mailservice = "QQ";//邮件通知服务类型,也可以用Gmail,前提是你访问得了Gmail(必须)
exports.mailuser = "12345@qq.com";//邮箱用户名(必须)
exports.mailpass = "qqpassword";//邮箱密码(必须)
exports.mailfrom = "12345@qq.com";//发送邮件地址(必须,一般与用户名所属邮箱一致)
exports.mailto = "12345@qq.com";//接收通知邮件地址(必须)
저장하고 다음 단계로 진행하세요.

2. 크롤러 사용자

크롤러의 원리는 실제로 실제 Zhihu 사용자가 웹사이트를 클릭하고 데이터를 수집하는 것을 시뮬레이션하는 것이므로 실제 Zhihu 사용자가 필요합니다. 테스트를 위해 자신의 계정을 사용할 수 있지만 장기적인 이유로 특수 계정을 등록하는 것이 더 좋으며 현재 크롤러는 하나만 지원합니다. 우리의 시뮬레이션 프로세스는 실제 사용자처럼 홈페이지에서 로그인할 필요 없이 쿠키 값을 직접 차용합니다.

등록, 활성화 및 로그인 후 홈페이지로 이동하여 개발자 모드나 쿠키 플러그인이 있는 브라우저를 사용하고 Zhihu에서 자신의 쿠키를 엽니다. 매우 복잡한 목록이 있을 수 있지만 "z_c0"이라는 일부만 필요합니다. 등호, 따옴표, 세미콜론을 제외하고 쿠키의 z_c0 부분을 복사하세요. 최종 형식은 대략 다음과 같습니다.


z_c0="LA8kJIJFdDSOA883wkUGJIRE8jVNKSOQfB9430=|1420113988|a6ea18bc1b23ea469e3b5fb2e33c2828439cb";
mysql 데이터베이스의 쿠키 테이블에 레코드 행을 삽입합니다. 여기서 각 필드의 값은 다음과 같습니다.


  • 이메일: 크롤러 사용자의 로그인 이메일
  • password: 크롤러 사용자의 비밀번호
  • 이름: 크롤러 사용자 이름
  • hash: 크롤러 사용자의 해시(각 사용자가 수정할 수 없는 고유 식별자. 실제로 여기서는 사용되지 않으며 임시로 비워둘 수 있음)
  • 쿠키: 방금 복사한 쿠키
그러면 정식으로 운영을 시작할 수 있습니다. 쿠키가 만료되거나 사용자가 차단된 경우 이 레코드 행의 쿠키 필드를 수정하면 됩니다.

3. 작전

백그라운드 실행 및 로깅을 용이하게 할 뿐만 아니라 충돌 후 자동으로 다시 시작하는 영구 실행을 사용하는 것이 좋습니다. 예:


forever -l /var/www/log.txt index.js
-l 뒤의 주소는 로그가 기록되는 곳입니다. 웹서버 디렉토리에 위치할 경우

http://www.xxx.com/log.txt 로그를 직접 확인해보세요. 다른 크롤러 명령을 실행하려면 index.js 뒤에 매개변수(공백으로 구분)를 추가하세요. 1. -i는 즉시 실행됩니다. 이 매개변수를 추가하지 않으면 기본적으로 다음 지정된 시간(예: 매일 아침 0시 5분)에 실행됩니다. 2. -ng는 새 사용자를 가져오는 단계, 즉 getnewuser를 건너뜁니다. 3. -ns는 스냅샷 단계, 즉 사용자 스냅샷을 건너뜁니다.
4. -nf는 데이터 파일 생성 단계, 즉 saveviewfile을 건너뜁니다.
5. -db는 디버깅 로그를 표시합니다.
각 단계의 기능은 다음 섹션에서 소개됩니다. 작업을 용이하게 하기 위해 다음 명령 줄을 sh 스크립트로 작성할 수 있습니다. 예:



특정 경로를 원하는 경로로 바꾸세요. 이러한 방식으로 ./zhihuspider.sh에 매개변수를 추가하여 크롤러를 시작할 수 있습니다. 예를 들어, ./zhihuspider.sh -i -ng -nf는 작업을 즉시 시작하고 새 사용자 및 파일 저장 단계를 건너뜁니다. 크롤러를 중지하는 방법은 영구 중지(또는 일련 번호 중지)입니다.

4. 원칙 개요

Zhihu 크롤러의 항목 파일이 index.js인지 확인하세요. 매일 지정된 시간에 루프로 크롤러 작업을 실행합니다. 매일 순차적으로 실행되는 세 가지 작업은 다음과 같습니다.

1) getnewuser.js: 현재 라이브러리의 사용자 팔로어 목록을 비교하여 새로운 사용자 정보를 캡처하면 가치 있는 사용자를 자동으로 나열할 수 있습니다. Zhihu 새로운 사람들이 도서관에 추가되었습니다

2) usersnapshot.js: 현재 라이브러리에 있는 사용자 정보와 답변 목록을 캡처하여 일일 스냅샷 형식으로 저장하는 루프입니다.

3) saveviewfile.js: 최신 스냅샷 내용을 기반으로 사용자 분석 목록을 생성하고, 어제, 최근, 과거 에센스 답변을 필터링하여 게시합니다. "Kanzhihu" 웹사이트 .

위의 세 가지 작업이 완료된 후 메인 스레드는 몇 분마다 Zhihu 홈페이지를 새로 고쳐 현재 쿠키가 여전히 유효한지 확인합니다. 쿠키가 유효하지 않은 경우(비로그인 페이지로 이동) 알림 이메일이 전송됩니다. 지정된 사서함으로 전송되면 제때에 쿠키를 변경하도록 알려줍니다. 쿠키를 변경하는 방법은 초기화 시와 동일하며, 수동으로 한 번만 로그인하신 후 쿠키값을 빼시면 됩니다. 특정 코드 구현에 관심이 있는 경우 내부 주석을 주의 깊게 읽고 일부 구성을 조정하거나 전체 크롤러를 직접 재구성해 볼 수도 있습니다.

1) getnewuser는 이틀 전과 후의 스냅샷에서 사용자의 팔로어 수를 비교하여 캡처를 지정하는 것이므로 스냅샷을 시작하려면 최소 2개의 스냅샷이 있어야 합니다. 이전에 실행되면 자동으로 건너뜁니다.

2) 스냅샷의 절반을 복원할 수 있습니다. 오류로 인해 프로그램이 충돌하는 경우 영구 중지를 사용하여 중지한 다음 -i -ng 매개 변수를 추가하여 즉시 실행하고 새 사용자 단계를 건너뛰어 절반만 캡처한 스냅샷부터 계속할 수 있습니다.

3) 스냅샷을 찍을 때 (의사) 스레드 수, 즉 사용자 스냅샷의 maxthreadcount 속성을 쉽게 늘리지 마세요. 스레드가 너무 많으면 429 오류가 발생하고, 캡처된 많은 양의 데이터가 제때에 데이터베이스에 기록되지 않아 메모리 오버플로가 발생할 수 있습니다. 따라서 데이터베이스가 SSD에 있지 않는 한 스레드 10개를 초과하지 마십시오.

4) 분석 결과를 생성하기 위한 뷰파일 저장 작업에는 최소 지난 7일의 스냅샷이 필요합니다. 스냅샷 콘텐츠가 7일 미만인 경우 오류가 보고되고 건너뜁니다. 이전 분석 작업은 데이터베이스를 수동으로 쿼리하여 수행할 수 있습니다.

5) 대부분의 사람들이 "칸즈후"를 복사할 필요가 없다는 점을 고려하여 워드프레스 자동 게시 기능 항목을 주석 처리했습니다. WordPress를 설정한 경우 xmlrpc를 활성화한 다음 기사 게시를 위해 특별히 사용자를 설정하고 config.js에서 해당 매개변수를 구성하고 saveviewfile에서 관련 코드의 주석 처리를 제거하십시오.

6) Zhihu는 아바타에 대한 거머리 방지 처리를 구현했기 때문에 사용자 정보를 캡처할 때 아바타도 획득하고 기사를 게시할 때 로컬 아바타 주소를 사용했습니다. http 서버의 URL 경로를 아바타가 저장된 폴더로 지정하거나 아바타가 저장된 폴더를 웹사이트 디렉터리에 직접 배치해야 합니다.

7) 코드가 읽기 쉽지 않을 수 있습니다. node.js 자체의 혼란스러운 콜백 구조에 더해, 제가 처음 프로그램을 작성했을 때 node.js를 접하기 시작한 지 얼마 되지 않아 구조가 엉뚱한 곳이 많았기 때문이기도 합니다. 헷갈리고 수정 할 시간도 없었고, 또 패치워크에 쌓인 추악한 판단 조건과 재시도 규칙이 많아지면 코드량이 3분의 2로 줄어들 수 있다는 점도 있었습니다. 하지만 시스템의 안정적인 작동을 보장하려면 이러한 기능을 추가해야 합니다.

8) 본 크롤러 소스 코드는 WTFPL 프로토콜을 기반으로 하며 수정 및 배포에 어떠한 제한도 두지 않습니다.

위 내용은 이 글의 전체 내용입니다. 모든 분들의 공부에 도움이 되었으면 좋겠습니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.