最近ドラマが不足しているため、上司はDing Moの同名の小説「Beauty for Stuffing」を原作としたiQiyiのオンラインドラマをフォローしましたが、ドラマ全体が充実しています。欠陥、ボスはそれを見ることができます。私はとてもうれしかったので、第2シーズンを見た後、小説のリソースを求め、結末を読むために原作の本に直接アクセスしました...
それを検索して見つけました。これらはすべてオンラインリソースです。ダウンロードするには、ログインする必要があります。登録とログインは非常に面倒なので、ノードを使用してクローラーを書き始めました
。ワークフロー
URLのリストを取得(リクエストリソースリクエストモジュール)
URLのリストに基づいて関連ページのソースコードを取得(ページエンコーディングの問題が発生する可能性があります、iconv-liteモジュール)
ソースコード解析、小説の取得情報(cheerioモジュール)
小説情報をMarkdownファイルに保存し、適切な修正と章情報を追加(ファイルfsの書き込み、リソースリクエストの同期sync-requestモジュール)
MarkdownをPDFに変換(PandocまたはChromeの印刷機能を使用)
URL の取得
小説のナビゲーション ページに従って、小説のすべての章の URL を取得し、JSON 配列に保存します。
最初の選択肢は、http.get() メソッドを通じてページのソース コードを取得することです
ソース コードを取得した後、印刷時に中国語の文字化けを発見し、charset = 'gbk' を見つけました。これはトランスコードする必要があります
iconv-lite モジュールを使用してトランスコードすると、中国語の表示が正常になります。次に、ソース コードの解析を開始して、必要な URL を取得します。これをより便利に解析するには、cherio モジュールを jQuery として理解する必要があります。使い方も jQuery とよく似ていますので、jQuery に慣れている学生であればすぐに始めることができます
ソースコードを解析すると、すべての章の情報が保存されていることがわかります。 div でラップされた a タグ。cheerio を使用して修飾された a タグ グループを抽出し、章のタイトルと URL を取得し、オブジェクトとして保存して、配列に保存します (リンクに格納されている 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 " }]
データを取得する
とただし、すべての章は最終的に 1 つのファイルに保存されるため、次の作業は URL のリストをたどってリソースを要求し、ソース コードを取得し、ソース コードを解析し、ファイルを書き込む必要があります。章の順序を確保するため、ファイルの書き込みには同期操作が必要です。実際、私がコーディングしていたときは、すべての操作が同期メソッドに変更されました
ソースコードを取得します
読み込んだ list.json ファイルを解析して、そのファイルに移動します。 URL はリストを作成し、リストを走査してリソースを取得します。章の順序を保証する必要があるため、リソースの同期リクエストを実行するためにここで sync-request モジュールが導入され、リソースは通常どおりトランスコードされます。
ソースコードを解析して小説を取得します または、見た目に影響を与えないように、cheerio モジュールを通じて小説のコンテンツを取得します。
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]) }
書き込み操作にも同期操作が必要なので、同期書き込み関数fs.writeFileSync()と同期追加関数fs.appendFileSync()を使います。初回以降は書き込み関数を使用します。読みやすさを向上させるために、各章の前にタイトルを追加します
PDF へのナビゲーション リンクとして [目次] を追加することもできます
私は小説を Markdown ファイルに保存します。読みやすさを向上させるために、現在、Chrome の印刷機能と Pandoc 変換を使用する 2 つの方法を使用します。
SublimeText にはプラグイン マークダウン プレビューがあり、Alt + m ショートカット キーを使用して Chrome でマークダウンをプレビューできます。Chrome ページを右クリックして [印刷] を選択し、パラメータを調整した後、PDF として保存することを選択します。シンプルで粗雑で、私の心を掴みました
pandocは、Markdownファイルを複数の形式に変換できる非常に強力なファイル形式変換ツールです。今夜、Windows 10で長い間苦労した後, まだpdflatexが取得できません。pandocについては後ほどまとめて書きます。
PDFを上司に送って、今読んでいます
Python、ノード、クローラーについて
以前からPythonを使いたい、クローラーを書きたい、もっと使いたいと思っていました。 Python でクローラーを書くということも、私の心の中で強迫観念になりましたが、より包括的な知識に触れると、その強迫観念は徐々に薄れ、問題に遭遇したときに、ただやりたいと思うことが多くなくなりました。もっと勉強して、本当の知識を得るために練習してください。