一起學爬蟲 Node.js 爬蟲篇(三)使用 PhantomJS 爬取動態頁面
今天我們來學習如何使用 PhantomJS 來抓取動態網頁,至於 PhantomJS 是啥啊什麼的,看這裡 我們這裡就不再討論 PhantomJS 的入門基礎了。下面正題
1.我們先準備,開啟瀏覽器,輸入網址 http://news.163.com/,然後分析我們來抓如下圖所示的部分
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);//退出系統
});
輸出如下:
可以看到網頁全文已經輸出完畢了(現在的延時都比較嚴重了,有個幾秒延時了,當然我們這裡重點不在這個,還沒學會走就想跑是不好的),我們就來分析怎麼才能獲取到我們需要的內容,這裡我們使用 DOM 來解析,也可以使用 cheerio 來解析,看看下圖
分析可以看出,我們現在解析的 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 獲取 怎麼樣是不是很簡單呢
我們再修改下程式碼,讓他輸出我們需求的其他資訊
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 抓取動態頁面可謂是非常方便,不過就是載入速度上可能會慢一些。
補充一個,如果你想把結果儲存為檔案,又不想寫程式碼 那麼就用無所不能的 cmd 吧,通過 > 路徑+文件名稱 如我們這裡 test.txt 在 E 盤根資料夾下,命令如下
phantomjs hello.js >E:\test.txt
執行,可以看到已經存到檔案裡了
相關推薦
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)-----python爬取CSDN博客首頁所有文章
成功 -name 保存 eas attr eve lan url att 對於Python初學者來說,爬蟲技能是應該是最好入門,也是最能夠有讓自己有成就感的,今天在整理代碼時,整理了一下之前自己學習爬蟲的一些代碼,今天上第2個簡單的例子,python爬取CSDN博客首頁所有