1. 程式人生 > >一起學爬蟲 Node.js 爬蟲篇(三)使用 PhantomJS 爬取動態頁面

一起學爬蟲 Node.js 爬蟲篇(三)使用 PhantomJS 爬取動態頁面

今天我們來學習如何使用 PhantomJS 來抓取動態網頁,至於 PhantomJS 是啥啊什麼的,看這裡 我們這裡就不再討論 PhantomJS 的入門基礎了。下面正題

1.我們先準備,開啟瀏覽器,輸入網址 http://news.163.com/,然後分析我們來抓如下圖所示的部分

image

2.編寫程式碼獲取網頁,需要使用到 web page 模組 API 如下
建立 page
var page=require('webpage').create();
  • ###### page.content String:獲取或設定當前頁面的html。
  • ###### page.plainText String:這是一個只讀屬性,獲取頁面去除html標記的文字(考慮$.text())。
看了上面的 API 我們這裡就先獲取網頁返回 也就是使用
var page = require('webpage').create();
phantom.outputEncoding="gbk";//指定編碼方式
page.open("http://news.163.com/", function(status) {
if ( status === "success" ) {
console.log(page.body);//輸出網頁
} else {
console.log("網頁載入失敗");
}
phantom.exit(0);//退出系統
});
輸出如下:

image

可以看到網頁全文已經輸出完畢了(現在的延時都比較嚴重了,有個幾秒延時了,當然我們這裡重點不在這個,還沒學會走就想跑是不好的),我們就來分析怎麼才能獲取到我們需要的內容,這裡我們使用 DOM 來解析,也可以使用 cheerio 來解析,看看下圖

image

分析可以看出,我們現在解析的 DOM 語句可以是這樣
var pattern = 'ul li.newsdata_item div.ndi_main div a';
現在我們就要來使用 DOM 語句了,這裡再引入一個 web page 的 API
  • ##### page.evaluate(fn, [param]) 對於page開啟的頁面,往往需要與其進行一些互動。 page.evaluate()提供了在page開啟頁面的上下文(下文直接用page上下文指代)執行function的功能(類比Chrome開發者工具的控制檯)。如下例:
page.open('http://m.bing.com'
,function(status){ vartitle=page.evaluate(function(s){ returndocument.querySelector(s).innerText; },'title'); console.log(title); phantom.exit(); });

##### 在這個例子中, page.evaluate()接受兩個引數,第一個是必需的,表示需要在page上下文執行的函式 fn;第二個是可選的,表示需要傳給 fn的引數 param。 fn允許有一個返回值return,並且此返回值最終作為 page.evaluate()的返回值。這邊對於剛剛命名的 param和return有一些額外的說明和注意事項。對於整個phantom程序而言, page.evaluate()是跑在一個沙盒中, fn無法訪問一切phantom域中的變數;同樣 page.evaluate()方法外部也不應該嘗試訪問page上下文中的內容。那麼如果兩個作用域需要交換一些資料,只能依靠 param和 return。不過限制很大, param和 return必須為能夠轉化為JSON字串,換言之,只能是基本資料型別或者簡單物件,像DOM 節點、$物件、function、閉包等就無能為力了。這個方法是同步的,如果執行的內容對後續操作不具備前置性,可以嘗試非同步方法以提高效能:page.evaluateAsync()。

看懂了 API 我們接著幹活,修改成如下
var page = require('webpage').create();
phantom.outputEncoding="gbk";//指定編碼方式
page.open("http://news.163.com/", function(status) {
if ( status === "success" ) {
console.log(page.evaluate(function(){
  var d = '';
  //匹配 DOM 查詢語句
  var pattern = 'ul li.newsdata_item div.ndi_main div a img';
  var c = document.querySelectorAll(pattern);//查詢
  var l = c.length;
  //遍歷輸出
  for(var i =0;i<l;i++){
                    d=d+c[i].alt+'\n'//獲取 alt 值
                    }
            return d;
}));//輸出網頁標題
} else {
console.log("網頁載入失敗");
}
phantom.exit(0);//退出系統
});
執行結果如下圖,大功告成,

這裡說明一下,我們在的到具體的標籤之後,如果我們想獲取比如 a 標籤的 alt 屬性的值 我們可以直接寫 獲取到的單個值.alt 就像上面的一樣如果是獲取 title 屬性那麼直接.title 就可以了,如果是獲取標籤內的文字,那麼久通過.innerText 獲取 怎麼樣是不是很簡單呢

image

我們再修改下程式碼,讓他輸出我們需求的其他資訊
var page = require('webpage').create();
phantom.outputEncoding="gbk";//指定編碼方式
page.open("http://news.163.com/", function(status) {
if ( status === "success" ) {
var res = page.evaluate(function(){
  var d = '';
  //匹配 DOM 查詢語句 a 標籤
  var patternA = 'ul li.newsdata_item div.ndi_main div a img';
//匹配 DOM 查詢語句 新聞內容 div
  var patternNews = 'ul li.newsdata_item div.ndi_main div div div.news_title h3 a';
  //匹配 DOM 查詢語句 新聞標籤 div
  var patternNewsClass = 'ul li.newsdata_item div.ndi_main div div div.news_tag strong a';
var patternNewsKeyWords = 'ul li.newsdata_item div.ndi_main div div div.news_tag div a';
  var c = document.querySelectorAll(patternA);//查詢
  var l = c.length;
  //遍歷輸出
  for(var i =0;i<l;i++){
            d = d + "標題:"+c[i].alt+'\n';
        d = d + "圖片連結: "+c[i].src+'\n';
        d = d + '\n';
            }
        c = document.querySelectorAll(patternNews);//查詢
        l = c.length;
            //遍歷輸出
              for(var i =0;i<l;i++){
                d +="新聞連結:"+c[i].href+'\n';
                d = d + '\n';
                }
        c = document.querySelectorAll(patternNewsClass);//查詢
        l = c.length;
              //遍歷輸出
                for(var i =0;i<l;i++){
                    d +="新聞類別:"+c[i].innerText+'\n';
                    d = d + '\n';
                    }
        c = document.querySelectorAll(patternNewsKeyWords);//查詢
        l = c.length;
                  //遍歷輸出
                  for(var i =0;i<l;i++){
                      d +="新聞關鍵詞:"+c[i].innerText+'\n';
                    d +="關鍵詞連結:"+c[i].href+'\n';
                    d = d + '\n';
                          }
                          d = d + '\n';
  return d;
});//輸出網頁標題

console.log(res);
} else {
console.log("網頁載入失敗");
}
phantom.exit(0);//退出系統
});

最後頁面如下,強迫症的同學可以修改下程式碼讓他顯示更合理,那麼就到這裡,可以看到 使用 PhantomJS 抓取動態頁面可謂是非常方便,不過就是載入速度上可能會慢一些。

image
image
image

補充一個,如果你想把結果儲存為檔案,又不想寫程式碼 那麼就用無所不能的 cmd 吧,通過 > 路徑+文件名稱 如我們這裡 test.txt 在 E 盤根資料夾下,命令如下

phantomjs hello.js >E:\test.txt

image

執行,可以看到已經存到檔案裡了

iamge

相關推薦

Scrapy實戰豆瓣電影短評

地址 pad __init__ {} 爬取 opera -m range pytho 今天的主要內容是爬取豆瓣電影短評,看一下網友是怎麽評價最近的電影的,方便我們以後的分析,以以下三部電影:二十二,戰狼,三生三世十裏桃花為例。 由於豆瓣短評網頁比較簡單,且不存在動態加載的內

一起爬蟲 Node.js 爬蟲使用 PhantomJS 動態頁面

今天我們來學習如何使用 PhantomJS 來抓取動態網頁,至於 PhantomJS 是啥啊什麼的,看這裡 我們這裡就不再討論 PhantomJS 的入門基礎了。下面正題 1.我們先準備,開啟瀏覽器,輸入網址 http://news.163

一個鹹魚的Python爬蟲之路網頁圖片

you os.path odin 路徑 生成 存在 parent lose exist 學完Requests庫與Beautifulsoup庫我們今天來實戰一波,爬取網頁圖片。依照現在所學只能爬取圖片在html頁面的而不能爬取由JavaScript生成的圖。所以我找了這個網站

從零開始 Web 之 JS 高級apply與call,bind,閉包和沙箱

master 操作 console 概念 釋放 分享圖片 成功 num 命名沖突 大家好,這裏是「 從零開始學 Web 系列教程 」,並在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公眾號:Web前端之巔

scrapy爬蟲框架桌布儲存並命名

寫在開始之前 按照上一篇介紹過的 scrapy爬蟲的建立順序,我們開始爬取桌布的爬蟲的建立。 首先,我們先過一遍 scrapy爬蟲的建立順序: 第一步:確定要在pipelines裡進行處理的資料,寫好items檔案 第二步:建立爬蟲檔案,將所需要的資訊從

149.Node.js學習筆記2018.12.03

1. 知識點 模組系統 核心模組 第三方模組 自己寫的模組 載入規則以及載入機制 迴圈載入 npm package.json Express 第三方web開發框架

Node.js學習筆記——完整的響應html頁面包括css,js檔案

Node.js學習筆記(一)——完整的響應html頁面(包括css,js檔案) 新手學習部落格,如存在問題,歡迎指出! 終於解決了這個問題!之前寫的程式碼,然後只能加載出html檔案,然後在網上找到了解決方案。 參考部落格 這裡標記一下最主要的幾個點: node.js

爬蟲記錄1——簡單一個頁面的內容並寫入到文字中

1、爬蟲工具類,用來獲取網頁內容 package com.dyw.crawler.util; import java.io.BufferedReader; import java.io.In

爬蟲記錄2——簡單一個頁面的圖片並儲存

1、爬蟲工具類,用來獲取網頁內容 package com.dyw.crawler.util; import java.io.BufferedReader; import java.io.IOException; import java.io.

Node.js 依賴管理—package-lock.json詳解

end 發現 json詳解 ever arr 文章 效果 樹形結構 例如 原文鏈接:https://www.novenblog.xin/detail?id=68 本文拜讀百度@小蘑菇哥哥的Node.js 中的依賴管理,正文從這裏開始~ papackage.json no

Scrapy實戰鏈家網成交房源數據

html win64 4.0 https set 爬蟲 使用 創建 鼓樓區 在上一小節中,我們已經提取到了房源的具體信息,這一節中,我們主要是對提取到的數據進行後續的處理,以及進行相關的設置。 數據處理 我們這裏以把數據存儲到mongo數據庫為例。編寫pipelines.p

Scrapy實戰鏈家網成交房源數據

meta pat 分割 自定義 是不是 rom 創建 開始 mat 今天,我們就以鏈家網南京地區為例,來學習爬取鏈家網的成交房源數據。 這裏推薦使用火狐瀏覽器,並且安裝firebug和firepath兩款插件,你會發現,這兩款插件會給我們後續的數據提取帶來很大的方便。 首先

Scrapy實戰鏈家網天津租房數據

房子 爬取 思路 頁面 scrapy more 關心 分析 網上   以後有可能會在天津租房子,所以想將鏈家網上面天津的租房數據抓下來,以供分析使用。   思路:   1、以初始鏈接https://tj.lianjia.com/zufang/rt200600000001

Salesforce學習之路-developer利用Visualforce Page實現頁面動態重新整理功能

Visualforce是一個Web開發框架,允許開發人員構建可以在Lightning平臺上本地託管的自定義使用者介面。其框架包含:前端的介面設計,使用的類似於HTML的標記語言;以及後端的控制器,使用類似於Java的Apex語言。 哪些版本支援Visualforce? 眾所周知,Salesforce分為多個版

前端菜鳥node.js初體驗

如今,nodejs如此之火,讓我這個打算從事前端開發的小白,也忍不住要學習一下,然而剛剛接觸nodejs,就深深的喜歡上了這個語言。 下面我將分享一下我最初學習nodejs時的總結的學習經驗,也是總結一下近期學習的知識,還會總結我在學習中遇到的困難,又是如何解

小白 Python 爬蟲25股票資訊

人生苦短,我用 Python 前文傳送門: 小白學 Python 爬蟲(1):開篇 小白學 Python 爬蟲(2):前置準備(一)基本類庫的安裝 小白學 Python 爬蟲(3):前置準備(二)Linux基礎入門 小白學 Python 爬蟲(4):前置準備(三)Docker基礎入門 小白學 Pyth

小白 Python 爬蟲35爬蟲框架 Scrapy 入門基礎 Selector 選擇器

人生苦短,我用 Python 前文傳送門: 小白學 Python 爬蟲(1):開篇 小白學 Python 爬蟲(2):前置準備(一)基本類庫的安裝 小白學 Python 爬蟲(3):前置準備(二)Linux基礎入門 小白學 Python 爬蟲(4):前置準備(三)Docker基礎入門 小白學 Pyth

爬蟲庫之BeautifulSoup學習

子節點 rom lac repr 文檔 strong 爬蟲 time contents 遍歷文檔樹:   1、查找子節點   .contents     tag的.content屬性可以將tag的子節點以列表的方式輸出。   print soup.body.cont

Three.js入門創建一個場景

style api text webgl () mes utf 動畫 fun 上一面講述了向場景中添加物體對象。這一篇準備把每個功能點細細的講述一遍,一方面是為了加深自己的理解。另一方面希望能夠 幫助到有需要的人。 一、在學習WEBGL的時候,你應該先了解要創建一個WebG

爬蟲系列2-----pythonCSDN博客首頁所有文章

成功 -name 保存 eas attr eve lan url att 對於Python初學者來說,爬蟲技能是應該是最好入門,也是最能夠有讓自己有成就感的,今天在整理代碼時,整理了一下之前自己學習爬蟲的一些代碼,今天上第2個簡單的例子,python爬取CSDN博客首頁所有