>  기사  >  웹 프론트엔드  >  간단하고 새로운 크롤러 예제의 Node.js 구현

간단하고 새로운 크롤러 예제의 Node.js 구현

高洛峰
高洛峰원래의
2016-12-06 14:25:591444검색

최근 드라마 부족으로 인해 Boss는 Ding Mo의 동명 소설 "Beauty for Stuffing"을 각색한 iQiyi의 온라인 드라마를 따랐습니다. 결점의 보스님 정말 재밌게 보시고 시즌2까지 보시고 소설자료 부탁드리고, 원작소설로 직접 가서 엔딩도 읽어봤는데...

방금 검색해 봤습니다. , 모두 온라인 자료들이었는데, 로그인이 필요하다면 회원가입과 로그인이 매우 번거롭습니다. 재미로 크롤러를 작성해도 괜찮으므로 여기서는 크롤러를 작성해 보겠습니다.

워크플로우

URL 목록 가져오기( 리소스 요청 모듈 요청)

URL 목록에 따라 관련 페이지 소스 코드 가져오기(페이지 인코딩 문제가 발생할 수 있음, iconv-lite 모듈)

소스코드 분석, 신규 정보 획득(cheerio 모듈)

신규 정보를 Markdown 파일에 저장하고 적절한 수정 사항 및 챕터 정보 추가(fs 파일 작성, 동기화 리소스 요청 동기화 요청 모듈)

Markdown을 PDF로 변환(Pandoc 또는 Chrome의 인쇄 기능 사용)

URL 가져오기

소설 탐색 페이지에 따라 , 소설의 모든 장의 URL을 가져와 JSON 배열에 저장합니다.

첫 번째 선택은 http.get() 메소드를 통해 페이지 소스 코드를 얻는 것입니다

소스 코드를 가져오고, 인쇄하여 중국어 왜곡 문자를 찾고, charset = 'gbk'를 확인하고 찾습니다. , 트랜스코딩 필요

트랜스코딩을 위해 iconv-lite 모듈을 사용하세요. 중국어 디스플레이가 정상화된 후 소스 코드 구문 분석을 시작하고 필요한 URL을 얻으려면 더 편리하게 구문 분석을 수행해야 합니다. Cherio 모듈은 jQuery가 백그라운드에서 실행되는 것으로 이해될 수 있으며 jQuery에 익숙한 학생이라면 빠르게 시작할 수 있습니다.

소스를 분석한 후 소스 코드를 로드합니다. 코드를 통해 우리는 모든 장 정보가 div로 묶인 태그에 저장된다는 것을 배웠습니다. (링크에 저장된 URL이 불완전하기 때문에 저장 시 완성이 필요합니다)

객체 배열을 직렬화하여 list.json 파일에 작성합니다

var http = require("http")
var fs = require("fs")
var cheerio = require("cheerio")
var iconv = require("iconv-lite")
var url = 'http://www.17fa.com/files/article/html/90/90747/index.html'
http.get(url, function(res) { //资源请求
  var chunks = []
  res.on('data', function(chunk) {
    chunks.push(chunk)
  })
  res.on('end', function() {
    var html = iconv.decode(Buffer.concat(chunks), 'gb2312') //转码操作
    var $ = cheerio.load(html, {
      decodeEntities: false
    })
    var content = $("tbody")
    var links = []
    $('div').children('a').each(function(i, elem) {
      var link = new Object()
      link.title = $(this).text()
      link.link = 'http://www.17fa.com/files/article/html/90/90747/' + $(this).attr('href') //补齐 URL 信息
      if (i > 5) {
        links.push(link)
      }
    })
    fs.writeFile("list.json", JSON.stringify(links), function(err) {
      if (!err) {
        console.log("写文件成功")
      }
    })
  }).on('error', function() {
    console.log("网页访问出错")
  })
})

획득 목록 예시

[{
  "title": "3 法医司白",
  "link": "http://www.17fa.com/files/article/html/90/90747/16548771.html"
}, {
  "title": "4 第1个梦 ",
  "link": "http://www.17fa.com/files/article/html/90/90747/16548772.html"
}, {
  "title": "5 刑警韩沉 ",
  "link": "http://www.17fa.com/files/article/html/90/90747/16548773.html"
}, {
  "title": "6 最初之战",
  "link": "http://www.17fa.com/files/article/html/90/90747/16548774.html "
}]

데이터 획득

URL 목록을 통해 다음 작업은 URL 목록을 순회하여 리소스를 요청하고, 소스 코드를 얻고, 소스 코드를 분석하고, 소설을 얻고, 파일을 작성하기 때문에 결국 모든 챕터가 파일에 저장되기 때문입니다. 챕터가 보장되어야 하기 때문에 파일을 작성하려면 동기 작업이 필요합니다. 실제로 코딩할 때 모든 작업이 동기 모드로 변경되었습니다.

소스 코드 가져오기

list.json 파일을 읽으면 URL 목록을 얻고 목록을 탐색하여 챕터의 순서를 확인해야 하므로 리소스에 대한 동기 요청을 수행하기 위해 여기에 sync-request 모듈이 도입되었습니다. 평소와 같이 트랜스코딩됩니다

var http = require("http")
var fs = require("fs")
var cheerio = require("cheerio")
var iconv = require("iconv-lite")
var request = require('sync-request')
var urlList = JSON.parse(fs.readFileSync('list.json', 'utf8'))
function getContent(chapter) {
  var res = request('GET',chapter.link)
  var html = iconv.decode(res.body, 'gb2312') //获取源码
}
for (let i = 0; i < urlList.length; i++) {
  getContent(urlList[i])
}

소스 코드를 구문 분석하여 소설을 얻습니다

또는 다음을 통해 소설 콘텐츠를 얻습니다. 룩앤필에 영향을 주지 않으려면 Cherio 모듈을 작성하기 전에 제거하세요. 콘텐츠의 html 태그

function getContent(chapter) {
  var res = request(&#39;GET&#39;,chapter.link)
  var html = iconv.decode(res.body, &#39;gb2312&#39;)
  var $ = cheerio.load(html, {
    decodeEntities: false
  })
  var content = ($("div#r1c").text()).replace(/\ /g, &#39;&#39;)
}

소설 저장

쓰기 작업에도 동기 작업이 필요하므로 동기 쓰기를 사용합니다. 처음 쓰기 위해서는 fs.writeFileSync() 함수와 동기 추가 함수 fs.appendFileSync()를 사용합니다. 읽기 경험을 향상하려면 각 장 앞에 제목

을 추가하세요.

또한 콘텐츠 앞에 탐색 링크로 [TOC]를 추가할 수도 있습니다

간단하고 새로운 크롤러 예제의 Node.js 구현

var http = require("http")
var fs = require("fs")
var cheerio = require("cheerio")
var iconv = require("iconv-lite")
var path = require(&#39;path&#39;)
var urlList = JSON.parse(fs.readFileSync(&#39;list.json&#39;, &#39;utf8&#39;))
function getContent(chapter) {
  console.log(chapter.link)
  http.get(chapter.link, function(res) {
    var chunks = []
    res.on(&#39;data&#39;, function(chunk) {
      chunks.push(chunk)
    })
    res.on(&#39;end&#39;, function() {
      var html = iconv.decode(Buffer.concat(chunks), &#39;gb2312&#39;)
      var $ = cheerio.load(html, {
        decodeEntities: false
      })
      var content = ($("div#r1c").text()).replace(/\ /g, &#39;&#39;)
      if (fs.existsSync(&#39;美人为馅.md&#39;)) {
        fs.appendFileSync(&#39;美人为馅.md&#39;, &#39;### &#39; + chapter.title)
        fs.appendFileSync(&#39;美人为馅.md&#39;, content)
      } else {
        fs.writeFileSync(&#39;美人为馅.md&#39;, &#39;### &#39; + chapter.title)
        fs.appendFileSync(&#39;美人为馅.md&#39;, content)
      }
    })
  }).on(&#39;error&#39;, function() {
    console.log("爬取" + chapter.link + "链接出错!")
  })
}
for (let i = 0; i < urlList.length; i++) {
  console.log(urlList[i])
  getContent(urlList[i])
}

마크다운을 PDF로

소설을 마크다운 파일로 변환하겠습니다. 현재는 마크다운 파일을 PDF 파일로 변환할 수 있습니다. , 제가 ​​선호하는 두 가지 방법은 Chrome의 인쇄 기능과 pandoc 변환을 이용하는 것입니다.

Chrome 인쇄

SublimeText에는 플러그인 마크다운 미리보기가 있습니다. Alt +를 통해 Chrome에서 Markdown을 미리 볼 수 있습니다. m 단축키. Chrome 페이지를 마우스 오른쪽 버튼으로 클릭하고 매개변수를 조정한 후 PDF로 저장을 선택하세요.

인쇄 효과:

간단하고 새로운 크롤러 예제의 Node.js 구현

pandoc 변환
pandoc은 Markdown 파일을 여러 형식으로 변환할 수 있는 매우 강력한 파일 형식 변환 도구입니다. 오늘 밤 Windows 10에서 오랫동안 어려움을 겪었지만 여전히 할 수 없습니다. pdflatex를 검색하세요. pandoc에 대해서는 나중에 요약해서 작성하겠습니다.

상사님께 PDF를 보냈는데 지금 읽고 있는 중입니다

파이썬, 노드, 크롤러에 대해

오래전부터 저는 Python을 사용하고 싶었고, 정말 Python을 사용하여 크롤러를 작성하고 싶었습니다. 지식이 더욱 포괄적이 되면서 집착은 점점 사라져 갔습니다. "생각"이 훨씬 적고, 문제에 직면했을 때 더 많이 생각하고 행동하고 실천하여 진정한 지식을 얻습니다.


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