Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Node.js 蟲蟲危機 - 手作你的第一個自動上網資料分析機器人!

adr
February 11, 2018

Node.js 蟲蟲危機 - 手作你的第一個自動上網資料分析機器人!

在不同的網站上都有珍貴的資料,但人工去將網站中資料一筆一筆的複製下來相當麻煩、甚至是有些資料是對方不願意開 API 出來給開發者使用,但你想使用對吧?

此場議程將會為各位介紹爬蟲技術入門:當各位使用瀏覽器連上一個網站時,是如何運作的,並使用封包相關分析工具,分析一個網站的運作。最後將以 Javascript 基於 Node.js,介紹如何撰寫簡單的 Javascript 自動化模擬瀏覽器的瀏覽行為、並使用現有的套件來將網站中想要的資料撈下來保存到本地端。

議程內包含網頁請求封包分析、Node.js 封包分析、Yahoo翻譯請求自動發送、PTT自動爬站爬蟲撰寫開發之開發基礎練習。課堂示範練習題目公布於 Github 上,請參閱至 https://github.com/aaaddress1/nodeSpiderExam

adr

February 11, 2018
Tweet

More Decks by adr

Other Decks in Technology

Transcript

  1. [email protected] ./Bio • ⾺馬聖豪, aaaddress1 aka adr • Chroot, TDOH

    • TDOHConf: 2016 議程組長 & 2017 活動組長 • 精通 C/C++、Windows 特性、逆向⼯工程 • Speaker: HITCON CMT 2015, CMT 2016 Lightning, CMT 2017 SITCON 2016, 2017 iThome#Chatbot 2017 BSidesLV 2016 ICNC'17 MC2015 CISC 2016 資訊安全基礎技術⼯工作坊 資安實務攻防研習營 ⼤大.⼤大.⼤大..⼤大概啦
  2. [email protected] Introduction 1. #murmur 2. HTTP (aka Hypertext Transfer Protocol)

    3. Javascript & Node.js on Windows 4. Chrome, 網⾴頁封包分析練習 5. cheerio & request 6. 實戰練習 i. Yahoo 翻譯網路路請求發送 ii. PTT 熱⾨門看板列列舉 iii. PTT 爆卦爬蟲機器⼈人
  3. [email protected] HTTP/1.1 200 OK <p>hello world! adr<p> Cookie: hello=world; (⾝身份資訊)

    網⾴頁瀏覽器 GET /index.php HTTP/1.1 Cookie: hello=world; 收到伺服器回應的網⾴頁原始碼, 解析並更更新 UI 顯⽰示給使⽤用者
  4. [email protected] Exam 1 你會發現每次打的字不同的時候,都會送出⼀一個新的封包到 https://tw.dictionary.yahoo.com/_td/api/resource?bkt=...(省略略) 這是⽤用 POST 的⽅方式送出資料,資料如下: {"requests":{"g0": {"resource":"SpellCheck","operation":"read","params":

    {"query":"ap"}}},"context":{"bkt":"","crumb":"LpDntKQ/ xn8","device":"desktop","intl":"tw","lang":"zh-Hant- TW","partner":"none","prid":"74b45q5d7emli","region":"US","site" :"all","tz":"Asia/Taipei","ver":"1.0.208"}}
  5. [email protected] Exam 1 使⽤用者查詢的字詞被 POST 出去後, 回應其他可能的關鍵單字(JSON 格式) {"g0": {"data":

    {"gossip": { "qry": "ap", "gprid": "uwJS5P5mQveG7SvxZORrDA", "results": [ { "key": "ap", "mrk": 0 }, { "key": "app", "mrk": 0 }, { "key": "appreciate", "mrk": 0 } ...
  6. [email protected] 舉個 var request = require('request'); request('http://www.google.com', (error, response, body)

    => { console.log('error:', error); // Print the error if one occurred console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received console.log('body:', body); // Print the HTML for the Google homepage. });
  7. [email protected] 怎麼取得網⾴頁指定內容? 1. ⽂文字切割⼤大法 - 讚讚讚!刻苦耐勞,22K 有前途! 2. 正則表達式忍術 -

    WoW!你也懂得⿊黑魔法!
 下⼀一個接⼿手的⼯工程師會很痛苦啦 ( ・᷄ὢ・᷅ ) 3. ...
  8. [email protected] 怎麼取得網⾴頁指定內容? 1. ⽂文字切割⼤大法 - 讚讚讚!刻苦耐勞,22K 有前途! 2. 正則表達式忍術 -

    WoW!你也懂得⿊黑魔法! 3. cheerio - 你、我,聰明肥宅都愛⽤用的⾸首選!
 (來來賓請掌聲⿎鼓勵⿎鼓勵)
  9. [email protected] 舉個 const cheerio = require('cheerio'); const $ = cheerio.load(

    '<h2 class="title">Hello world</h2>' ); $('h2.title').text('Hello there!'); $('h2').addClass('welcome'); $.html(); //=> <h2 class="title welcome">Hello there!</h2>
  10. Exam 3 試著⽤用 request 與 cheerio 套件 取得 PTT 熱⾨門看板所有看板名稱與連結地址

    • https://www.ptt.cc/bbs/index.html • https://github.com/cheeriojs/cheerio