可視化
開(kāi)源爬蟲(chóng)框架各有哪些優(yōu)缺點(diǎn)?
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 273 次瀏覽 ? 2020-06-27 08:00
爬蟲(chóng)是一個(gè)很復雜的系統,可以從多種不同的角度進(jìn)行分類(lèi),前面一些回答早已涉及了不少,我想從信息抓取和提取,手工編碼和可視化,靜態(tài)頁(yè)面剖析和互動(dòng)這三個(gè)方面再討論一下。
1,信息抓取和提取
信息抓取是指怎樣獲得網(wǎng)站上的信息的過(guò)程,而信息提取是指怎樣從獲得的頁(yè)面上辨識出自己所須要的信息的過(guò)程。使用爬蟲(chóng)爬取單個(gè)或則少數網(wǎng)站的時(shí)侯,那么主要需解決抓取問(wèn)題,而目標網(wǎng)站數目好多的時(shí)侯,信息提取就成為主要矛盾。
舉個(gè)事例,Scrapy是一個(gè)解決信息抓取問(wèn)題的軟件平臺。而使用Xpath或則CSS Selector可進(jìn)行少量站點(diǎn)的信息提取,但面對大規模信息提取Xpath就無(wú)能為力了,在這些情況下,應該使用一些機器學(xué)習算法開(kāi)源爬蟲(chóng)軟件,比如IBL(Instance based Learning),可以按照某網(wǎng)站的一個(gè)或則少量頁(yè)面進(jìn)行學(xué)習,然后快速生成該網(wǎng)站的辨識模型,scrapely就是這樣的一個(gè)軟件模塊。
2,手工編碼和可視化
我們在網(wǎng)路上見(jiàn)到的大部分教程,都是基于某種編程語(yǔ)言(比如Python)和軟件庫(比如Scrapy)進(jìn)行手工編碼的,這種方法的優(yōu)點(diǎn)是十分靈活,可擴展性好,能針對特定站點(diǎn)給出高效的實(shí)現。但它的缺點(diǎn)也是顯著(zhù)的,就是須要爬蟲(chóng)開(kāi)發(fā)人員懂編程語(yǔ)言,門(mén)檻比較高。
為了解決這個(gè)問(wèn)題,人們又提出了可視化爬蟲(chóng),在定義可視化爬蟲(chóng)時(shí),遠程網(wǎng)站的頁(yè)面將直觀(guān)地展示下來(lái),然后人們可以通過(guò)鍵盤(pán)進(jìn)行點(diǎn)擊操作,就可以定義爬取邏輯(包括爬取目標、爬取次序、爬取深度等)和抓取邏輯(頁(yè)面中的哪部份內容應當被辨識為屬性),和手工編碼爬蟲(chóng)相比,可視化爬蟲(chóng)大大增加了爬蟲(chóng)定義的門(mén)檻,但是爬取效率不如手工編程的高,另外,由于可視化爬蟲(chóng)對爬取邏輯進(jìn)行了具象,可能難以做到對于一些特殊網(wǎng)站的支持。
Portia就是一個(gè)典型的可視化爬蟲(chóng),人們常常覺(jué)得pyspider也是一個(gè)可視化爬蟲(chóng),但似乎并不是,pyspider只是一個(gè)擁有GUI的手工編碼爬蟲(chóng)。
3,被動(dòng)爬蟲(chóng)和互動(dòng)爬蟲(chóng)
大部分爬蟲(chóng)都是基于對頁(yè)面進(jìn)行剖析,如果須要將使用瀏覽器引擎對頁(yè)面中的Javascript代碼進(jìn)行執行,然后獲得渲染后的頁(yè)面,再從中提取出自己所須要的信息。
但有些情況下,我們還須要才能和這種頁(yè)面進(jìn)行互動(dòng),比如輸入用戶(hù)名和口令登錄到系統中去之后再進(jìn)行爬取,又例如我們須要輸入關(guān)鍵字之后只爬取搜索結果。在這種情況下,我們須要在爬蟲(chóng)定義時(shí)才能將這種用戶(hù)輸入保存出來(lái),然后在爬蟲(chóng)執行期,將這種交互信息重新回放回來(lái),就像一個(gè)人在做這種動(dòng)作一樣。
Selenium是這些爬蟲(chóng)的一個(gè)事例,用戶(hù)用Selenium IDE錄制用戶(hù)動(dòng)作,保存為Selenese命令序列,然后使用Web driver模仿瀏覽器重放這種命令。交互式爬蟲(chóng)的優(yōu)點(diǎn)是可以象人一樣作出各類(lèi)動(dòng)作,缺點(diǎn)是因為須要建立完整的瀏覽器引擎開(kāi)源爬蟲(chóng)軟件,系統開(kāi)支十分大,爬取效率太低。
最后,做一個(gè)廣告,我近來(lái)開(kāi)源了一個(gè)爬蟲(chóng)portia-dashboard, 按照上面的分類(lèi)方式,這個(gè)爬蟲(chóng)是一個(gè)“面向多個(gè)站點(diǎn)的”、“主要支持信息抓取的”、“同時(shí)支持被動(dòng)抓取和互動(dòng)抓取” 的“可視化”爬蟲(chóng),而且提供了Portia中沒(méi)有的dashboard功能,使用dashboard可以布署爬蟲(chóng)、啟動(dòng)爬蟲(chóng)、監控爬蟲(chóng)狀態(tài),瀏覽提取的信息等等。
使用代碼安裝可能有點(diǎn)復雜,最簡(jiǎn)單的方式是使用docker, 歡迎你們使用,并提出寶貴意見(jiàn)。 查看全部
1,信息抓取和提取
信息抓取是指怎樣獲得網(wǎng)站上的信息的過(guò)程,而信息提取是指怎樣從獲得的頁(yè)面上辨識出自己所須要的信息的過(guò)程。使用爬蟲(chóng)爬取單個(gè)或則少數網(wǎng)站的時(shí)侯,那么主要需解決抓取問(wèn)題,而目標網(wǎng)站數目好多的時(shí)侯,信息提取就成為主要矛盾。
舉個(gè)事例,Scrapy是一個(gè)解決信息抓取問(wèn)題的軟件平臺。而使用Xpath或則CSS Selector可進(jìn)行少量站點(diǎn)的信息提取,但面對大規模信息提取Xpath就無(wú)能為力了,在這些情況下,應該使用一些機器學(xué)習算法開(kāi)源爬蟲(chóng)軟件,比如IBL(Instance based Learning),可以按照某網(wǎng)站的一個(gè)或則少量頁(yè)面進(jìn)行學(xué)習,然后快速生成該網(wǎng)站的辨識模型,scrapely就是這樣的一個(gè)軟件模塊。
2,手工編碼和可視化
我們在網(wǎng)路上見(jiàn)到的大部分教程,都是基于某種編程語(yǔ)言(比如Python)和軟件庫(比如Scrapy)進(jìn)行手工編碼的,這種方法的優(yōu)點(diǎn)是十分靈活,可擴展性好,能針對特定站點(diǎn)給出高效的實(shí)現。但它的缺點(diǎn)也是顯著(zhù)的,就是須要爬蟲(chóng)開(kāi)發(fā)人員懂編程語(yǔ)言,門(mén)檻比較高。
為了解決這個(gè)問(wèn)題,人們又提出了可視化爬蟲(chóng),在定義可視化爬蟲(chóng)時(shí),遠程網(wǎng)站的頁(yè)面將直觀(guān)地展示下來(lái),然后人們可以通過(guò)鍵盤(pán)進(jìn)行點(diǎn)擊操作,就可以定義爬取邏輯(包括爬取目標、爬取次序、爬取深度等)和抓取邏輯(頁(yè)面中的哪部份內容應當被辨識為屬性),和手工編碼爬蟲(chóng)相比,可視化爬蟲(chóng)大大增加了爬蟲(chóng)定義的門(mén)檻,但是爬取效率不如手工編程的高,另外,由于可視化爬蟲(chóng)對爬取邏輯進(jìn)行了具象,可能難以做到對于一些特殊網(wǎng)站的支持。
Portia就是一個(gè)典型的可視化爬蟲(chóng),人們常常覺(jué)得pyspider也是一個(gè)可視化爬蟲(chóng),但似乎并不是,pyspider只是一個(gè)擁有GUI的手工編碼爬蟲(chóng)。
3,被動(dòng)爬蟲(chóng)和互動(dòng)爬蟲(chóng)
大部分爬蟲(chóng)都是基于對頁(yè)面進(jìn)行剖析,如果須要將使用瀏覽器引擎對頁(yè)面中的Javascript代碼進(jìn)行執行,然后獲得渲染后的頁(yè)面,再從中提取出自己所須要的信息。
但有些情況下,我們還須要才能和這種頁(yè)面進(jìn)行互動(dòng),比如輸入用戶(hù)名和口令登錄到系統中去之后再進(jìn)行爬取,又例如我們須要輸入關(guān)鍵字之后只爬取搜索結果。在這種情況下,我們須要在爬蟲(chóng)定義時(shí)才能將這種用戶(hù)輸入保存出來(lái),然后在爬蟲(chóng)執行期,將這種交互信息重新回放回來(lái),就像一個(gè)人在做這種動(dòng)作一樣。
Selenium是這些爬蟲(chóng)的一個(gè)事例,用戶(hù)用Selenium IDE錄制用戶(hù)動(dòng)作,保存為Selenese命令序列,然后使用Web driver模仿瀏覽器重放這種命令。交互式爬蟲(chóng)的優(yōu)點(diǎn)是可以象人一樣作出各類(lèi)動(dòng)作,缺點(diǎn)是因為須要建立完整的瀏覽器引擎開(kāi)源爬蟲(chóng)軟件,系統開(kāi)支十分大,爬取效率太低。
最后,做一個(gè)廣告,我近來(lái)開(kāi)源了一個(gè)爬蟲(chóng)portia-dashboard, 按照上面的分類(lèi)方式,這個(gè)爬蟲(chóng)是一個(gè)“面向多個(gè)站點(diǎn)的”、“主要支持信息抓取的”、“同時(shí)支持被動(dòng)抓取和互動(dòng)抓取” 的“可視化”爬蟲(chóng),而且提供了Portia中沒(méi)有的dashboard功能,使用dashboard可以布署爬蟲(chóng)、啟動(dòng)爬蟲(chóng)、監控爬蟲(chóng)狀態(tài),瀏覽提取的信息等等。
使用代碼安裝可能有點(diǎn)復雜,最簡(jiǎn)單的方式是使用docker, 歡迎你們使用,并提出寶貴意見(jiàn)。 查看全部
爬蟲(chóng)是一個(gè)很復雜的系統,可以從多種不同的角度進(jìn)行分類(lèi),前面一些回答早已涉及了不少,我想從信息抓取和提取,手工編碼和可視化,靜態(tài)頁(yè)面剖析和互動(dòng)這三個(gè)方面再討論一下。
1,信息抓取和提取
信息抓取是指怎樣獲得網(wǎng)站上的信息的過(guò)程,而信息提取是指怎樣從獲得的頁(yè)面上辨識出自己所須要的信息的過(guò)程。使用爬蟲(chóng)爬取單個(gè)或則少數網(wǎng)站的時(shí)侯,那么主要需解決抓取問(wèn)題,而目標網(wǎng)站數目好多的時(shí)侯,信息提取就成為主要矛盾。
舉個(gè)事例,Scrapy是一個(gè)解決信息抓取問(wèn)題的軟件平臺。而使用Xpath或則CSS Selector可進(jìn)行少量站點(diǎn)的信息提取,但面對大規模信息提取Xpath就無(wú)能為力了,在這些情況下,應該使用一些機器學(xué)習算法開(kāi)源爬蟲(chóng)軟件,比如IBL(Instance based Learning),可以按照某網(wǎng)站的一個(gè)或則少量頁(yè)面進(jìn)行學(xué)習,然后快速生成該網(wǎng)站的辨識模型,scrapely就是這樣的一個(gè)軟件模塊。
2,手工編碼和可視化
我們在網(wǎng)路上見(jiàn)到的大部分教程,都是基于某種編程語(yǔ)言(比如Python)和軟件庫(比如Scrapy)進(jìn)行手工編碼的,這種方法的優(yōu)點(diǎn)是十分靈活,可擴展性好,能針對特定站點(diǎn)給出高效的實(shí)現。但它的缺點(diǎn)也是顯著(zhù)的,就是須要爬蟲(chóng)開(kāi)發(fā)人員懂編程語(yǔ)言,門(mén)檻比較高。
為了解決這個(gè)問(wèn)題,人們又提出了可視化爬蟲(chóng),在定義可視化爬蟲(chóng)時(shí),遠程網(wǎng)站的頁(yè)面將直觀(guān)地展示下來(lái),然后人們可以通過(guò)鍵盤(pán)進(jìn)行點(diǎn)擊操作,就可以定義爬取邏輯(包括爬取目標、爬取次序、爬取深度等)和抓取邏輯(頁(yè)面中的哪部份內容應當被辨識為屬性),和手工編碼爬蟲(chóng)相比,可視化爬蟲(chóng)大大增加了爬蟲(chóng)定義的門(mén)檻,但是爬取效率不如手工編程的高,另外,由于可視化爬蟲(chóng)對爬取邏輯進(jìn)行了具象,可能難以做到對于一些特殊網(wǎng)站的支持。
Portia就是一個(gè)典型的可視化爬蟲(chóng),人們常常覺(jué)得pyspider也是一個(gè)可視化爬蟲(chóng),但似乎并不是,pyspider只是一個(gè)擁有GUI的手工編碼爬蟲(chóng)。
3,被動(dòng)爬蟲(chóng)和互動(dòng)爬蟲(chóng)
大部分爬蟲(chóng)都是基于對頁(yè)面進(jìn)行剖析,如果須要將使用瀏覽器引擎對頁(yè)面中的Javascript代碼進(jìn)行執行,然后獲得渲染后的頁(yè)面,再從中提取出自己所須要的信息。
但有些情況下,我們還須要才能和這種頁(yè)面進(jìn)行互動(dòng),比如輸入用戶(hù)名和口令登錄到系統中去之后再進(jìn)行爬取,又例如我們須要輸入關(guān)鍵字之后只爬取搜索結果。在這種情況下,我們須要在爬蟲(chóng)定義時(shí)才能將這種用戶(hù)輸入保存出來(lái),然后在爬蟲(chóng)執行期,將這種交互信息重新回放回來(lái),就像一個(gè)人在做這種動(dòng)作一樣。
Selenium是這些爬蟲(chóng)的一個(gè)事例,用戶(hù)用Selenium IDE錄制用戶(hù)動(dòng)作,保存為Selenese命令序列,然后使用Web driver模仿瀏覽器重放這種命令。交互式爬蟲(chóng)的優(yōu)點(diǎn)是可以象人一樣作出各類(lèi)動(dòng)作,缺點(diǎn)是因為須要建立完整的瀏覽器引擎開(kāi)源爬蟲(chóng)軟件,系統開(kāi)支十分大,爬取效率太低。
最后,做一個(gè)廣告,我近來(lái)開(kāi)源了一個(gè)爬蟲(chóng)portia-dashboard, 按照上面的分類(lèi)方式,這個(gè)爬蟲(chóng)是一個(gè)“面向多個(gè)站點(diǎn)的”、“主要支持信息抓取的”、“同時(shí)支持被動(dòng)抓取和互動(dòng)抓取” 的“可視化”爬蟲(chóng),而且提供了Portia中沒(méi)有的dashboard功能,使用dashboard可以布署爬蟲(chóng)、啟動(dòng)爬蟲(chóng)、監控爬蟲(chóng)狀態(tài),瀏覽提取的信息等等。
使用代碼安裝可能有點(diǎn)復雜,最簡(jiǎn)單的方式是使用docker, 歡迎你們使用,并提出寶貴意見(jiàn)。
基于chrome插件的爬蟲(chóng)可視化點(diǎn)選配置工具
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 365 次瀏覽 ? 2020-05-29 08:01
Chrome插件是一個(gè)用Web技術(shù)開(kāi)發(fā)、用來(lái)提高瀏覽器功能的軟件,它雖然就是一個(gè)由HTML、CSS、JS、圖片等資源組成的一個(gè).crx后綴的壓縮包.
Chrome插件沒(méi)有嚴格的項目結構要求,只要保證本目錄有一個(gè)manifest.json即可,也不需要專(zhuān)門(mén)的IDE,普通的web開(kāi)發(fā)工具即可。
從右上角菜單->更多工具->擴展程序可以步入 插件管理頁(yè)面,也可以直接在地址欄輸入chrome://extensions 訪(fǎng)問(wèn)。
網(wǎng)上介紹chrome插件開(kāi)發(fā)的文章已經(jīng)好多了,這里就不贅言了,只列一些項目中須要的
這是一個(gè)Chrome插件最重要也是必不可少的文件,用來(lái)配置所有和插件相關(guān)的配置,必須置于根目錄。其中,manifest_version、name、version3個(gè)是必不可少的,description和icons是推薦的。
下面給出的是一些常見(jiàn)的配置項,均有英文注釋
{
// 清單文件的版本,這個(gè)必須寫(xiě),而且必須是2
"manifest_version": 2,
// 插件的名稱(chēng)
"name": "demo",
// 插件的版本
"version": "1.0.0",
// 插件描述
"description": "簡(jiǎn)單的Chrome擴展demo",
// 圖標,一般偷懶全部用一個(gè)尺寸的也沒(méi)問(wèn)題
"icons":
{
"16": "img/icon.png",
"48": "img/icon.png",
"128": "img/icon.png"
},
// 會(huì )一直常駐的后臺JS或后臺頁(yè)面
"background":
{
// 2種指定方式,如果指定JS,那么會(huì )自動(dòng)生成一個(gè)背景頁(yè)
"page": "background.html"
//"scripts": ["js/background.js"]
},
// 瀏覽器右上角圖標設置,browser_action、page_action、app必須三選一
"browser_action":
{
"default_icon": "img/icon.png",
// 圖標懸停時(shí)的標題,可選
"default_title": "這是一個(gè)示例Chrome插件",
"default_popup": "popup.html"
},
// 當某些特定頁(yè)面打開(kāi)才顯示的圖標
/*"page_action":
{
"default_icon": "img/icon.png",
"default_title": "我是pageAction",
"default_popup": "popup.html"
},*/
// 需要直接注入頁(yè)面的JS
"content_scripts":
[
{
//"matches": ["http://*/*", "https://*/*"],
// "<all_urls>" 表示匹配所有地址
"matches": ["<all_urls>"],
// 多個(gè)JS按順序注入
"js": ["js/jquery-1.8.3.js", "js/content-script.js"],
// JS的注入可以隨便一點(diǎn),但是CSS的注意就要千萬(wàn)小心了,因為一不小心就可能影響全局樣式
"css": ["css/custom.css"],
// 代碼注入的時(shí)間,可選值: "document_start", "document_end", or "document_idle",最后一個(gè)表示頁(yè)面空閑時(shí),默認document_idle
"run_at": "document_start"
},
// 這里僅僅是為了演示content-script可以配置多個(gè)規則
{
"matches": ["*://*/*.png", "*://*/*.jpg", "*://*/*.gif", "*://*/*.bmp"],
"js": ["js/show-image-content-size.js"]
}
],
// 權限申請
"permissions":
[
"contextMenus", // 右鍵菜單
"tabs", // 標簽
"notifications", // 通知
"webRequest", // web請求
"webRequestBlocking",
"storage", // 插件本地存儲
"http://*/*", // 可以通過(guò)executeScript或者insertCSS訪(fǎng)問(wèn)的網(wǎng)站
"https://*/*" // 可以通過(guò)executeScript或者insertCSS訪(fǎng)問(wèn)的網(wǎng)站
],
// 普通頁(yè)面能夠直接訪(fǎng)問(wèn)的插件資源列表,如果不設置是無(wú)法直接訪(fǎng)問(wèn)的
"web_accessible_resources": ["js/inject.js"],
// 插件主頁(yè),這個(gè)很重要,不要浪費了這個(gè)免費廣告位
"homepage_url": "https://www.baidu.com",
// 覆蓋瀏覽器默認頁(yè)面
"chrome_url_overrides":
{
// 覆蓋瀏覽器默認的新標簽頁(yè)
"newtab": "newtab.html"
},
// Chrome40以前的插件配置頁(yè)寫(xiě)法
"options_page": "options.html",
// Chrome40以后的插件配置頁(yè)寫(xiě)法,如果2個(gè)都寫(xiě),新版Chrome只認后面這一個(gè)
"options_ui":
{
"page": "options.html",
// 添加一些默認的樣式,推薦使用
"chrome_style": true
},
// 向地址欄注冊一個(gè)關(guān)鍵字以提供搜索建議,只能設置一個(gè)關(guān)鍵字
"omnibox": { "keyword" : "go" },
// 默認語(yǔ)言
"default_locale": "zh_CN",
// devtools頁(yè)面入口,注意只能指向一個(gè)HTML文件,不能是JS文件
"devtools_page": "devtools.html"
}
所謂content-scripts,其實(shí)就是Chrome插件中向頁(yè)面注入腳本的一種方式(雖然名為script,其實(shí)還可以包括css的),借助content-scripts我們可以實(shí)現通過(guò)配置的形式輕松向指定頁(yè)面注入JS和CSS(如果須要動(dòng)態(tài)注入,可以參考下文),最常見(jiàn)的例如:廣告屏蔽、頁(yè)面CSS訂制,等等。
示例配置:
{
// 需要直接注入頁(yè)面的JS
"content_scripts":
[
{
//"matches": ["http://*/*", "https://*/*"],
// "<all_urls>" 表示匹配所有地址
"matches": ["<all_urls>"],
// 多個(gè)JS按順序注入
"js": ["js/jquery-1.8.3.js", "js/content-script.js"],
// JS的注入可以隨便一點(diǎn),但是CSS的注意就要千萬(wàn)小心了,因為一不小心就可能影響全局樣式
"css": ["css/custom.css"],
// 代碼注入的時(shí)間,可選值: "document_start", "document_end", or "document_idle",最后一個(gè)表示頁(yè)面空閑時(shí),默認document_idle
"run_at": "document_start"
}
],
}
特別注意,如果沒(méi)有主動(dòng)指定run_at為document_start(默認為document_idle),下面這些代碼是不會(huì )生效的
document.addEventListener('DOMContentLoaded', function()
{
console.log('我被執行了!');
});
content-scripts和原始頁(yè)面共享DOM,但是不共享JS,如要訪(fǎng)問(wèn)頁(yè)面JS(例如某個(gè)JS變量),只能通過(guò)`injected
js來(lái)實(shí)現。content-scripts不能訪(fǎng)問(wèn)絕大部分chrome.xxx.api`,除了下邊這4種:
由于content-script可以注入到頁(yè)面,所以我們即將開(kāi)發(fā)的插件的主要功能就在這里
后臺(姑且如此翻譯吧)爬蟲(chóng)軟件增加網(wǎng)頁(yè)訪(fǎng)問(wèn),是一個(gè)常駐的頁(yè)面,它的生命周期是插件中所有類(lèi)型頁(yè)面中最長(cháng)的,它隨著(zhù)瀏覽器的打開(kāi)而打開(kāi),隨著(zhù)瀏覽器的關(guān)掉而關(guān)掉,所以一般把須要仍然運行
的、啟動(dòng)就運行的、全局的代碼放到background上面。
background的權限十分高,幾乎可以調用所有的Chrome擴充API(除了devtools),而且它可以無(wú)限制跨域,也就是可以跨域訪(fǎng)問(wèn)任何網(wǎng)站而無(wú)需要
求對方設置CORS。
經(jīng)過(guò)測試,其實(shí)不止是background,所有的直接通過(guò)chrome-extension://id/xx.html這些方法打開(kāi)的網(wǎng)頁(yè)都可以無(wú)限制跨域。
配置中,background可以通過(guò)page指定一張網(wǎng)頁(yè),也可以通過(guò)scripts直接指定一個(gè)JS,Chrome會(huì )手動(dòng)為這個(gè)JS生成一個(gè)默認的網(wǎng)頁(yè):
{
// 會(huì )一直常駐的后臺JS或后臺頁(yè)面
"background":
{
// 2種指定方式,如果指定JS,那么會(huì )自動(dòng)生成一個(gè)背景頁(yè)
"page": "background.html"
//"scripts": ["js/background.js"]
},
}
這里順帶介紹一下event-pages,它是一個(gè)哪些東西呢?鑒于background生命周期很長(cháng),長(cháng)時(shí)間掛載后臺可能會(huì )影響性能,所以Google又弄一個(gè)event-pages,在配置文件上,它與background的惟一區別就是多了一個(gè)persistent參數:
{
"background":
{
"scripts": ["event-page.js"],
"persistent": false
},
}
它的生命周期是:在被須要時(shí)加載,在空閑時(shí)被關(guān)閉,什么叫被須要時(shí)呢?比如第一次安裝、插件更新、有content-script向它發(fā)送消息,等等。
我們要開(kāi)發(fā)的插件目前用到了background和content_scripts這兩個(gè)選項,如果之后添加新功能時(shí)再瞧瞧其他的選項爬蟲(chóng)軟件增加網(wǎng)頁(yè)訪(fǎng)問(wèn),對chrome插件開(kāi)發(fā)感興趣的朋友可以瞧瞧這本書(shū) 查看全部
Chrome插件沒(méi)有嚴格的項目結構要求,只要保證本目錄有一個(gè)manifest.json即可,也不需要專(zhuān)門(mén)的IDE,普通的web開(kāi)發(fā)工具即可。
從右上角菜單->更多工具->擴展程序可以步入 插件管理頁(yè)面,也可以直接在地址欄輸入chrome://extensions 訪(fǎng)問(wèn)。
網(wǎng)上介紹chrome插件開(kāi)發(fā)的文章已經(jīng)好多了,這里就不贅言了,只列一些項目中須要的
這是一個(gè)Chrome插件最重要也是必不可少的文件,用來(lái)配置所有和插件相關(guān)的配置,必須置于根目錄。其中,manifest_version、name、version3個(gè)是必不可少的,description和icons是推薦的。
下面給出的是一些常見(jiàn)的配置項,均有英文注釋
{
// 清單文件的版本,這個(gè)必須寫(xiě),而且必須是2
"manifest_version": 2,
// 插件的名稱(chēng)
"name": "demo",
// 插件的版本
"version": "1.0.0",
// 插件描述
"description": "簡(jiǎn)單的Chrome擴展demo",
// 圖標,一般偷懶全部用一個(gè)尺寸的也沒(méi)問(wèn)題
"icons":
{
"16": "img/icon.png",
"48": "img/icon.png",
"128": "img/icon.png"
},
// 會(huì )一直常駐的后臺JS或后臺頁(yè)面
"background":
{
// 2種指定方式,如果指定JS,那么會(huì )自動(dòng)生成一個(gè)背景頁(yè)
"page": "background.html"
//"scripts": ["js/background.js"]
},
// 瀏覽器右上角圖標設置,browser_action、page_action、app必須三選一
"browser_action":
{
"default_icon": "img/icon.png",
// 圖標懸停時(shí)的標題,可選
"default_title": "這是一個(gè)示例Chrome插件",
"default_popup": "popup.html"
},
// 當某些特定頁(yè)面打開(kāi)才顯示的圖標
/*"page_action":
{
"default_icon": "img/icon.png",
"default_title": "我是pageAction",
"default_popup": "popup.html"
},*/
// 需要直接注入頁(yè)面的JS
"content_scripts":
[
{
//"matches": ["http://*/*", "https://*/*"],
// "<all_urls>" 表示匹配所有地址
"matches": ["<all_urls>"],
// 多個(gè)JS按順序注入
"js": ["js/jquery-1.8.3.js", "js/content-script.js"],
// JS的注入可以隨便一點(diǎn),但是CSS的注意就要千萬(wàn)小心了,因為一不小心就可能影響全局樣式
"css": ["css/custom.css"],
// 代碼注入的時(shí)間,可選值: "document_start", "document_end", or "document_idle",最后一個(gè)表示頁(yè)面空閑時(shí),默認document_idle
"run_at": "document_start"
},
// 這里僅僅是為了演示content-script可以配置多個(gè)規則
{
"matches": ["*://*/*.png", "*://*/*.jpg", "*://*/*.gif", "*://*/*.bmp"],
"js": ["js/show-image-content-size.js"]
}
],
// 權限申請
"permissions":
[
"contextMenus", // 右鍵菜單
"tabs", // 標簽
"notifications", // 通知
"webRequest", // web請求
"webRequestBlocking",
"storage", // 插件本地存儲
"http://*/*", // 可以通過(guò)executeScript或者insertCSS訪(fǎng)問(wèn)的網(wǎng)站
"https://*/*" // 可以通過(guò)executeScript或者insertCSS訪(fǎng)問(wèn)的網(wǎng)站
],
// 普通頁(yè)面能夠直接訪(fǎng)問(wèn)的插件資源列表,如果不設置是無(wú)法直接訪(fǎng)問(wèn)的
"web_accessible_resources": ["js/inject.js"],
// 插件主頁(yè),這個(gè)很重要,不要浪費了這個(gè)免費廣告位
"homepage_url": "https://www.baidu.com",
// 覆蓋瀏覽器默認頁(yè)面
"chrome_url_overrides":
{
// 覆蓋瀏覽器默認的新標簽頁(yè)
"newtab": "newtab.html"
},
// Chrome40以前的插件配置頁(yè)寫(xiě)法
"options_page": "options.html",
// Chrome40以后的插件配置頁(yè)寫(xiě)法,如果2個(gè)都寫(xiě),新版Chrome只認后面這一個(gè)
"options_ui":
{
"page": "options.html",
// 添加一些默認的樣式,推薦使用
"chrome_style": true
},
// 向地址欄注冊一個(gè)關(guān)鍵字以提供搜索建議,只能設置一個(gè)關(guān)鍵字
"omnibox": { "keyword" : "go" },
// 默認語(yǔ)言
"default_locale": "zh_CN",
// devtools頁(yè)面入口,注意只能指向一個(gè)HTML文件,不能是JS文件
"devtools_page": "devtools.html"
}
所謂content-scripts,其實(shí)就是Chrome插件中向頁(yè)面注入腳本的一種方式(雖然名為script,其實(shí)還可以包括css的),借助content-scripts我們可以實(shí)現通過(guò)配置的形式輕松向指定頁(yè)面注入JS和CSS(如果須要動(dòng)態(tài)注入,可以參考下文),最常見(jiàn)的例如:廣告屏蔽、頁(yè)面CSS訂制,等等。
示例配置:
{
// 需要直接注入頁(yè)面的JS
"content_scripts":
[
{
//"matches": ["http://*/*", "https://*/*"],
// "<all_urls>" 表示匹配所有地址
"matches": ["<all_urls>"],
// 多個(gè)JS按順序注入
"js": ["js/jquery-1.8.3.js", "js/content-script.js"],
// JS的注入可以隨便一點(diǎn),但是CSS的注意就要千萬(wàn)小心了,因為一不小心就可能影響全局樣式
"css": ["css/custom.css"],
// 代碼注入的時(shí)間,可選值: "document_start", "document_end", or "document_idle",最后一個(gè)表示頁(yè)面空閑時(shí),默認document_idle
"run_at": "document_start"
}
],
}
特別注意,如果沒(méi)有主動(dòng)指定run_at為document_start(默認為document_idle),下面這些代碼是不會(huì )生效的
document.addEventListener('DOMContentLoaded', function()
{
console.log('我被執行了!');
});
content-scripts和原始頁(yè)面共享DOM,但是不共享JS,如要訪(fǎng)問(wèn)頁(yè)面JS(例如某個(gè)JS變量),只能通過(guò)`injected
js來(lái)實(shí)現。content-scripts不能訪(fǎng)問(wèn)絕大部分chrome.xxx.api`,除了下邊這4種:
由于content-script可以注入到頁(yè)面,所以我們即將開(kāi)發(fā)的插件的主要功能就在這里
后臺(姑且如此翻譯吧)爬蟲(chóng)軟件增加網(wǎng)頁(yè)訪(fǎng)問(wèn),是一個(gè)常駐的頁(yè)面,它的生命周期是插件中所有類(lèi)型頁(yè)面中最長(cháng)的,它隨著(zhù)瀏覽器的打開(kāi)而打開(kāi),隨著(zhù)瀏覽器的關(guān)掉而關(guān)掉,所以一般把須要仍然運行
的、啟動(dòng)就運行的、全局的代碼放到background上面。
background的權限十分高,幾乎可以調用所有的Chrome擴充API(除了devtools),而且它可以無(wú)限制跨域,也就是可以跨域訪(fǎng)問(wèn)任何網(wǎng)站而無(wú)需要
求對方設置CORS。
經(jīng)過(guò)測試,其實(shí)不止是background,所有的直接通過(guò)chrome-extension://id/xx.html這些方法打開(kāi)的網(wǎng)頁(yè)都可以無(wú)限制跨域。
配置中,background可以通過(guò)page指定一張網(wǎng)頁(yè),也可以通過(guò)scripts直接指定一個(gè)JS,Chrome會(huì )手動(dòng)為這個(gè)JS生成一個(gè)默認的網(wǎng)頁(yè):
{
// 會(huì )一直常駐的后臺JS或后臺頁(yè)面
"background":
{
// 2種指定方式,如果指定JS,那么會(huì )自動(dòng)生成一個(gè)背景頁(yè)
"page": "background.html"
//"scripts": ["js/background.js"]
},
}
這里順帶介紹一下event-pages,它是一個(gè)哪些東西呢?鑒于background生命周期很長(cháng),長(cháng)時(shí)間掛載后臺可能會(huì )影響性能,所以Google又弄一個(gè)event-pages,在配置文件上,它與background的惟一區別就是多了一個(gè)persistent參數:
{
"background":
{
"scripts": ["event-page.js"],
"persistent": false
},
}
它的生命周期是:在被須要時(shí)加載,在空閑時(shí)被關(guān)閉,什么叫被須要時(shí)呢?比如第一次安裝、插件更新、有content-script向它發(fā)送消息,等等。
我們要開(kāi)發(fā)的插件目前用到了background和content_scripts這兩個(gè)選項,如果之后添加新功能時(shí)再瞧瞧其他的選項爬蟲(chóng)軟件增加網(wǎng)頁(yè)訪(fǎng)問(wèn),對chrome插件開(kāi)發(fā)感興趣的朋友可以瞧瞧這本書(shū) 查看全部
Chrome插件是一個(gè)用Web技術(shù)開(kāi)發(fā)、用來(lái)提高瀏覽器功能的軟件,它雖然就是一個(gè)由HTML、CSS、JS、圖片等資源組成的一個(gè).crx后綴的壓縮包.
Chrome插件沒(méi)有嚴格的項目結構要求,只要保證本目錄有一個(gè)manifest.json即可,也不需要專(zhuān)門(mén)的IDE,普通的web開(kāi)發(fā)工具即可。
從右上角菜單->更多工具->擴展程序可以步入 插件管理頁(yè)面,也可以直接在地址欄輸入chrome://extensions 訪(fǎng)問(wèn)。
網(wǎng)上介紹chrome插件開(kāi)發(fā)的文章已經(jīng)好多了,這里就不贅言了,只列一些項目中須要的
這是一個(gè)Chrome插件最重要也是必不可少的文件,用來(lái)配置所有和插件相關(guān)的配置,必須置于根目錄。其中,manifest_version、name、version3個(gè)是必不可少的,description和icons是推薦的。
下面給出的是一些常見(jiàn)的配置項,均有英文注釋
{
// 清單文件的版本,這個(gè)必須寫(xiě),而且必須是2
"manifest_version": 2,
// 插件的名稱(chēng)
"name": "demo",
// 插件的版本
"version": "1.0.0",
// 插件描述
"description": "簡(jiǎn)單的Chrome擴展demo",
// 圖標,一般偷懶全部用一個(gè)尺寸的也沒(méi)問(wèn)題
"icons":
{
"16": "img/icon.png",
"48": "img/icon.png",
"128": "img/icon.png"
},
// 會(huì )一直常駐的后臺JS或后臺頁(yè)面
"background":
{
// 2種指定方式,如果指定JS,那么會(huì )自動(dòng)生成一個(gè)背景頁(yè)
"page": "background.html"
//"scripts": ["js/background.js"]
},
// 瀏覽器右上角圖標設置,browser_action、page_action、app必須三選一
"browser_action":
{
"default_icon": "img/icon.png",
// 圖標懸停時(shí)的標題,可選
"default_title": "這是一個(gè)示例Chrome插件",
"default_popup": "popup.html"
},
// 當某些特定頁(yè)面打開(kāi)才顯示的圖標
/*"page_action":
{
"default_icon": "img/icon.png",
"default_title": "我是pageAction",
"default_popup": "popup.html"
},*/
// 需要直接注入頁(yè)面的JS
"content_scripts":
[
{
//"matches": ["http://*/*", "https://*/*"],
// "<all_urls>" 表示匹配所有地址
"matches": ["<all_urls>"],
// 多個(gè)JS按順序注入
"js": ["js/jquery-1.8.3.js", "js/content-script.js"],
// JS的注入可以隨便一點(diǎn),但是CSS的注意就要千萬(wàn)小心了,因為一不小心就可能影響全局樣式
"css": ["css/custom.css"],
// 代碼注入的時(shí)間,可選值: "document_start", "document_end", or "document_idle",最后一個(gè)表示頁(yè)面空閑時(shí),默認document_idle
"run_at": "document_start"
},
// 這里僅僅是為了演示content-script可以配置多個(gè)規則
{
"matches": ["*://*/*.png", "*://*/*.jpg", "*://*/*.gif", "*://*/*.bmp"],
"js": ["js/show-image-content-size.js"]
}
],
// 權限申請
"permissions":
[
"contextMenus", // 右鍵菜單
"tabs", // 標簽
"notifications", // 通知
"webRequest", // web請求
"webRequestBlocking",
"storage", // 插件本地存儲
"http://*/*", // 可以通過(guò)executeScript或者insertCSS訪(fǎng)問(wèn)的網(wǎng)站
"https://*/*" // 可以通過(guò)executeScript或者insertCSS訪(fǎng)問(wèn)的網(wǎng)站
],
// 普通頁(yè)面能夠直接訪(fǎng)問(wèn)的插件資源列表,如果不設置是無(wú)法直接訪(fǎng)問(wèn)的
"web_accessible_resources": ["js/inject.js"],
// 插件主頁(yè),這個(gè)很重要,不要浪費了這個(gè)免費廣告位
"homepage_url": "https://www.baidu.com",
// 覆蓋瀏覽器默認頁(yè)面
"chrome_url_overrides":
{
// 覆蓋瀏覽器默認的新標簽頁(yè)
"newtab": "newtab.html"
},
// Chrome40以前的插件配置頁(yè)寫(xiě)法
"options_page": "options.html",
// Chrome40以后的插件配置頁(yè)寫(xiě)法,如果2個(gè)都寫(xiě),新版Chrome只認后面這一個(gè)
"options_ui":
{
"page": "options.html",
// 添加一些默認的樣式,推薦使用
"chrome_style": true
},
// 向地址欄注冊一個(gè)關(guān)鍵字以提供搜索建議,只能設置一個(gè)關(guān)鍵字
"omnibox": { "keyword" : "go" },
// 默認語(yǔ)言
"default_locale": "zh_CN",
// devtools頁(yè)面入口,注意只能指向一個(gè)HTML文件,不能是JS文件
"devtools_page": "devtools.html"
}
所謂content-scripts,其實(shí)就是Chrome插件中向頁(yè)面注入腳本的一種方式(雖然名為script,其實(shí)還可以包括css的),借助content-scripts我們可以實(shí)現通過(guò)配置的形式輕松向指定頁(yè)面注入JS和CSS(如果須要動(dòng)態(tài)注入,可以參考下文),最常見(jiàn)的例如:廣告屏蔽、頁(yè)面CSS訂制,等等。
示例配置:
{
// 需要直接注入頁(yè)面的JS
"content_scripts":
[
{
//"matches": ["http://*/*", "https://*/*"],
// "<all_urls>" 表示匹配所有地址
"matches": ["<all_urls>"],
// 多個(gè)JS按順序注入
"js": ["js/jquery-1.8.3.js", "js/content-script.js"],
// JS的注入可以隨便一點(diǎn),但是CSS的注意就要千萬(wàn)小心了,因為一不小心就可能影響全局樣式
"css": ["css/custom.css"],
// 代碼注入的時(shí)間,可選值: "document_start", "document_end", or "document_idle",最后一個(gè)表示頁(yè)面空閑時(shí),默認document_idle
"run_at": "document_start"
}
],
}
特別注意,如果沒(méi)有主動(dòng)指定run_at為document_start(默認為document_idle),下面這些代碼是不會(huì )生效的
document.addEventListener('DOMContentLoaded', function()
{
console.log('我被執行了!');
});
content-scripts和原始頁(yè)面共享DOM,但是不共享JS,如要訪(fǎng)問(wèn)頁(yè)面JS(例如某個(gè)JS變量),只能通過(guò)`injected
js來(lái)實(shí)現。content-scripts不能訪(fǎng)問(wèn)絕大部分chrome.xxx.api`,除了下邊這4種:
由于content-script可以注入到頁(yè)面,所以我們即將開(kāi)發(fā)的插件的主要功能就在這里
后臺(姑且如此翻譯吧)爬蟲(chóng)軟件增加網(wǎng)頁(yè)訪(fǎng)問(wèn),是一個(gè)常駐的頁(yè)面,它的生命周期是插件中所有類(lèi)型頁(yè)面中最長(cháng)的,它隨著(zhù)瀏覽器的打開(kāi)而打開(kāi),隨著(zhù)瀏覽器的關(guān)掉而關(guān)掉,所以一般把須要仍然運行
的、啟動(dòng)就運行的、全局的代碼放到background上面。
background的權限十分高,幾乎可以調用所有的Chrome擴充API(除了devtools),而且它可以無(wú)限制跨域,也就是可以跨域訪(fǎng)問(wèn)任何網(wǎng)站而無(wú)需要
求對方設置CORS。
經(jīng)過(guò)測試,其實(shí)不止是background,所有的直接通過(guò)chrome-extension://id/xx.html這些方法打開(kāi)的網(wǎng)頁(yè)都可以無(wú)限制跨域。
配置中,background可以通過(guò)page指定一張網(wǎng)頁(yè),也可以通過(guò)scripts直接指定一個(gè)JS,Chrome會(huì )手動(dòng)為這個(gè)JS生成一個(gè)默認的網(wǎng)頁(yè):
{
// 會(huì )一直常駐的后臺JS或后臺頁(yè)面
"background":
{
// 2種指定方式,如果指定JS,那么會(huì )自動(dòng)生成一個(gè)背景頁(yè)
"page": "background.html"
//"scripts": ["js/background.js"]
},
}
這里順帶介紹一下event-pages,它是一個(gè)哪些東西呢?鑒于background生命周期很長(cháng),長(cháng)時(shí)間掛載后臺可能會(huì )影響性能,所以Google又弄一個(gè)event-pages,在配置文件上,它與background的惟一區別就是多了一個(gè)persistent參數:
{
"background":
{
"scripts": ["event-page.js"],
"persistent": false
},
}
它的生命周期是:在被須要時(shí)加載,在空閑時(shí)被關(guān)閉,什么叫被須要時(shí)呢?比如第一次安裝、插件更新、有content-script向它發(fā)送消息,等等。
我們要開(kāi)發(fā)的插件目前用到了background和content_scripts這兩個(gè)選項,如果之后添加新功能時(shí)再瞧瞧其他的選項爬蟲(chóng)軟件增加網(wǎng)頁(yè)訪(fǎng)問(wèn),對chrome插件開(kāi)發(fā)感興趣的朋友可以瞧瞧這本書(shū)
開(kāi)源爬蟲(chóng)框架各有哪些優(yōu)缺點(diǎn)?
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 273 次瀏覽 ? 2020-06-27 08:00
爬蟲(chóng)是一個(gè)很復雜的系統,可以從多種不同的角度進(jìn)行分類(lèi),前面一些回答早已涉及了不少,我想從信息抓取和提取,手工編碼和可視化,靜態(tài)頁(yè)面剖析和互動(dòng)這三個(gè)方面再討論一下。
1,信息抓取和提取
信息抓取是指怎樣獲得網(wǎng)站上的信息的過(guò)程,而信息提取是指怎樣從獲得的頁(yè)面上辨識出自己所須要的信息的過(guò)程。使用爬蟲(chóng)爬取單個(gè)或則少數網(wǎng)站的時(shí)侯,那么主要需解決抓取問(wèn)題,而目標網(wǎng)站數目好多的時(shí)侯,信息提取就成為主要矛盾。
舉個(gè)事例,Scrapy是一個(gè)解決信息抓取問(wèn)題的軟件平臺。而使用Xpath或則CSS Selector可進(jìn)行少量站點(diǎn)的信息提取,但面對大規模信息提取Xpath就無(wú)能為力了,在這些情況下,應該使用一些機器學(xué)習算法開(kāi)源爬蟲(chóng)軟件,比如IBL(Instance based Learning),可以按照某網(wǎng)站的一個(gè)或則少量頁(yè)面進(jìn)行學(xué)習,然后快速生成該網(wǎng)站的辨識模型,scrapely就是這樣的一個(gè)軟件模塊。
2,手工編碼和可視化
我們在網(wǎng)路上見(jiàn)到的大部分教程,都是基于某種編程語(yǔ)言(比如Python)和軟件庫(比如Scrapy)進(jìn)行手工編碼的,這種方法的優(yōu)點(diǎn)是十分靈活,可擴展性好,能針對特定站點(diǎn)給出高效的實(shí)現。但它的缺點(diǎn)也是顯著(zhù)的,就是須要爬蟲(chóng)開(kāi)發(fā)人員懂編程語(yǔ)言,門(mén)檻比較高。
為了解決這個(gè)問(wèn)題,人們又提出了可視化爬蟲(chóng),在定義可視化爬蟲(chóng)時(shí),遠程網(wǎng)站的頁(yè)面將直觀(guān)地展示下來(lái),然后人們可以通過(guò)鍵盤(pán)進(jìn)行點(diǎn)擊操作,就可以定義爬取邏輯(包括爬取目標、爬取次序、爬取深度等)和抓取邏輯(頁(yè)面中的哪部份內容應當被辨識為屬性),和手工編碼爬蟲(chóng)相比,可視化爬蟲(chóng)大大增加了爬蟲(chóng)定義的門(mén)檻,但是爬取效率不如手工編程的高,另外,由于可視化爬蟲(chóng)對爬取邏輯進(jìn)行了具象,可能難以做到對于一些特殊網(wǎng)站的支持。
Portia就是一個(gè)典型的可視化爬蟲(chóng),人們常常覺(jué)得pyspider也是一個(gè)可視化爬蟲(chóng),但似乎并不是,pyspider只是一個(gè)擁有GUI的手工編碼爬蟲(chóng)。
3,被動(dòng)爬蟲(chóng)和互動(dòng)爬蟲(chóng)
大部分爬蟲(chóng)都是基于對頁(yè)面進(jìn)行剖析,如果須要將使用瀏覽器引擎對頁(yè)面中的Javascript代碼進(jìn)行執行,然后獲得渲染后的頁(yè)面,再從中提取出自己所須要的信息。
但有些情況下,我們還須要才能和這種頁(yè)面進(jìn)行互動(dòng),比如輸入用戶(hù)名和口令登錄到系統中去之后再進(jìn)行爬取,又例如我們須要輸入關(guān)鍵字之后只爬取搜索結果。在這種情況下,我們須要在爬蟲(chóng)定義時(shí)才能將這種用戶(hù)輸入保存出來(lái),然后在爬蟲(chóng)執行期,將這種交互信息重新回放回來(lái),就像一個(gè)人在做這種動(dòng)作一樣。
Selenium是這些爬蟲(chóng)的一個(gè)事例,用戶(hù)用Selenium IDE錄制用戶(hù)動(dòng)作,保存為Selenese命令序列,然后使用Web driver模仿瀏覽器重放這種命令。交互式爬蟲(chóng)的優(yōu)點(diǎn)是可以象人一樣作出各類(lèi)動(dòng)作,缺點(diǎn)是因為須要建立完整的瀏覽器引擎開(kāi)源爬蟲(chóng)軟件,系統開(kāi)支十分大,爬取效率太低。
最后,做一個(gè)廣告,我近來(lái)開(kāi)源了一個(gè)爬蟲(chóng)portia-dashboard, 按照上面的分類(lèi)方式,這個(gè)爬蟲(chóng)是一個(gè)“面向多個(gè)站點(diǎn)的”、“主要支持信息抓取的”、“同時(shí)支持被動(dòng)抓取和互動(dòng)抓取” 的“可視化”爬蟲(chóng),而且提供了Portia中沒(méi)有的dashboard功能,使用dashboard可以布署爬蟲(chóng)、啟動(dòng)爬蟲(chóng)、監控爬蟲(chóng)狀態(tài),瀏覽提取的信息等等。
使用代碼安裝可能有點(diǎn)復雜,最簡(jiǎn)單的方式是使用docker, 歡迎你們使用,并提出寶貴意見(jiàn)。 查看全部
1,信息抓取和提取
信息抓取是指怎樣獲得網(wǎng)站上的信息的過(guò)程,而信息提取是指怎樣從獲得的頁(yè)面上辨識出自己所須要的信息的過(guò)程。使用爬蟲(chóng)爬取單個(gè)或則少數網(wǎng)站的時(shí)侯,那么主要需解決抓取問(wèn)題,而目標網(wǎng)站數目好多的時(shí)侯,信息提取就成為主要矛盾。
舉個(gè)事例,Scrapy是一個(gè)解決信息抓取問(wèn)題的軟件平臺。而使用Xpath或則CSS Selector可進(jìn)行少量站點(diǎn)的信息提取,但面對大規模信息提取Xpath就無(wú)能為力了,在這些情況下,應該使用一些機器學(xué)習算法開(kāi)源爬蟲(chóng)軟件,比如IBL(Instance based Learning),可以按照某網(wǎng)站的一個(gè)或則少量頁(yè)面進(jìn)行學(xué)習,然后快速生成該網(wǎng)站的辨識模型,scrapely就是這樣的一個(gè)軟件模塊。
2,手工編碼和可視化
我們在網(wǎng)路上見(jiàn)到的大部分教程,都是基于某種編程語(yǔ)言(比如Python)和軟件庫(比如Scrapy)進(jìn)行手工編碼的,這種方法的優(yōu)點(diǎn)是十分靈活,可擴展性好,能針對特定站點(diǎn)給出高效的實(shí)現。但它的缺點(diǎn)也是顯著(zhù)的,就是須要爬蟲(chóng)開(kāi)發(fā)人員懂編程語(yǔ)言,門(mén)檻比較高。
為了解決這個(gè)問(wèn)題,人們又提出了可視化爬蟲(chóng),在定義可視化爬蟲(chóng)時(shí),遠程網(wǎng)站的頁(yè)面將直觀(guān)地展示下來(lái),然后人們可以通過(guò)鍵盤(pán)進(jìn)行點(diǎn)擊操作,就可以定義爬取邏輯(包括爬取目標、爬取次序、爬取深度等)和抓取邏輯(頁(yè)面中的哪部份內容應當被辨識為屬性),和手工編碼爬蟲(chóng)相比,可視化爬蟲(chóng)大大增加了爬蟲(chóng)定義的門(mén)檻,但是爬取效率不如手工編程的高,另外,由于可視化爬蟲(chóng)對爬取邏輯進(jìn)行了具象,可能難以做到對于一些特殊網(wǎng)站的支持。
Portia就是一個(gè)典型的可視化爬蟲(chóng),人們常常覺(jué)得pyspider也是一個(gè)可視化爬蟲(chóng),但似乎并不是,pyspider只是一個(gè)擁有GUI的手工編碼爬蟲(chóng)。
3,被動(dòng)爬蟲(chóng)和互動(dòng)爬蟲(chóng)
大部分爬蟲(chóng)都是基于對頁(yè)面進(jìn)行剖析,如果須要將使用瀏覽器引擎對頁(yè)面中的Javascript代碼進(jìn)行執行,然后獲得渲染后的頁(yè)面,再從中提取出自己所須要的信息。
但有些情況下,我們還須要才能和這種頁(yè)面進(jìn)行互動(dòng),比如輸入用戶(hù)名和口令登錄到系統中去之后再進(jìn)行爬取,又例如我們須要輸入關(guān)鍵字之后只爬取搜索結果。在這種情況下,我們須要在爬蟲(chóng)定義時(shí)才能將這種用戶(hù)輸入保存出來(lái),然后在爬蟲(chóng)執行期,將這種交互信息重新回放回來(lái),就像一個(gè)人在做這種動(dòng)作一樣。
Selenium是這些爬蟲(chóng)的一個(gè)事例,用戶(hù)用Selenium IDE錄制用戶(hù)動(dòng)作,保存為Selenese命令序列,然后使用Web driver模仿瀏覽器重放這種命令。交互式爬蟲(chóng)的優(yōu)點(diǎn)是可以象人一樣作出各類(lèi)動(dòng)作,缺點(diǎn)是因為須要建立完整的瀏覽器引擎開(kāi)源爬蟲(chóng)軟件,系統開(kāi)支十分大,爬取效率太低。
最后,做一個(gè)廣告,我近來(lái)開(kāi)源了一個(gè)爬蟲(chóng)portia-dashboard, 按照上面的分類(lèi)方式,這個(gè)爬蟲(chóng)是一個(gè)“面向多個(gè)站點(diǎn)的”、“主要支持信息抓取的”、“同時(shí)支持被動(dòng)抓取和互動(dòng)抓取” 的“可視化”爬蟲(chóng),而且提供了Portia中沒(méi)有的dashboard功能,使用dashboard可以布署爬蟲(chóng)、啟動(dòng)爬蟲(chóng)、監控爬蟲(chóng)狀態(tài),瀏覽提取的信息等等。
使用代碼安裝可能有點(diǎn)復雜,最簡(jiǎn)單的方式是使用docker, 歡迎你們使用,并提出寶貴意見(jiàn)。 查看全部
爬蟲(chóng)是一個(gè)很復雜的系統,可以從多種不同的角度進(jìn)行分類(lèi),前面一些回答早已涉及了不少,我想從信息抓取和提取,手工編碼和可視化,靜態(tài)頁(yè)面剖析和互動(dòng)這三個(gè)方面再討論一下。
1,信息抓取和提取
信息抓取是指怎樣獲得網(wǎng)站上的信息的過(guò)程,而信息提取是指怎樣從獲得的頁(yè)面上辨識出自己所須要的信息的過(guò)程。使用爬蟲(chóng)爬取單個(gè)或則少數網(wǎng)站的時(shí)侯,那么主要需解決抓取問(wèn)題,而目標網(wǎng)站數目好多的時(shí)侯,信息提取就成為主要矛盾。
舉個(gè)事例,Scrapy是一個(gè)解決信息抓取問(wèn)題的軟件平臺。而使用Xpath或則CSS Selector可進(jìn)行少量站點(diǎn)的信息提取,但面對大規模信息提取Xpath就無(wú)能為力了,在這些情況下,應該使用一些機器學(xué)習算法開(kāi)源爬蟲(chóng)軟件,比如IBL(Instance based Learning),可以按照某網(wǎng)站的一個(gè)或則少量頁(yè)面進(jìn)行學(xué)習,然后快速生成該網(wǎng)站的辨識模型,scrapely就是這樣的一個(gè)軟件模塊。
2,手工編碼和可視化
我們在網(wǎng)路上見(jiàn)到的大部分教程,都是基于某種編程語(yǔ)言(比如Python)和軟件庫(比如Scrapy)進(jìn)行手工編碼的,這種方法的優(yōu)點(diǎn)是十分靈活,可擴展性好,能針對特定站點(diǎn)給出高效的實(shí)現。但它的缺點(diǎn)也是顯著(zhù)的,就是須要爬蟲(chóng)開(kāi)發(fā)人員懂編程語(yǔ)言,門(mén)檻比較高。
為了解決這個(gè)問(wèn)題,人們又提出了可視化爬蟲(chóng),在定義可視化爬蟲(chóng)時(shí),遠程網(wǎng)站的頁(yè)面將直觀(guān)地展示下來(lái),然后人們可以通過(guò)鍵盤(pán)進(jìn)行點(diǎn)擊操作,就可以定義爬取邏輯(包括爬取目標、爬取次序、爬取深度等)和抓取邏輯(頁(yè)面中的哪部份內容應當被辨識為屬性),和手工編碼爬蟲(chóng)相比,可視化爬蟲(chóng)大大增加了爬蟲(chóng)定義的門(mén)檻,但是爬取效率不如手工編程的高,另外,由于可視化爬蟲(chóng)對爬取邏輯進(jìn)行了具象,可能難以做到對于一些特殊網(wǎng)站的支持。
Portia就是一個(gè)典型的可視化爬蟲(chóng),人們常常覺(jué)得pyspider也是一個(gè)可視化爬蟲(chóng),但似乎并不是,pyspider只是一個(gè)擁有GUI的手工編碼爬蟲(chóng)。
3,被動(dòng)爬蟲(chóng)和互動(dòng)爬蟲(chóng)
大部分爬蟲(chóng)都是基于對頁(yè)面進(jìn)行剖析,如果須要將使用瀏覽器引擎對頁(yè)面中的Javascript代碼進(jìn)行執行,然后獲得渲染后的頁(yè)面,再從中提取出自己所須要的信息。
但有些情況下,我們還須要才能和這種頁(yè)面進(jìn)行互動(dòng),比如輸入用戶(hù)名和口令登錄到系統中去之后再進(jìn)行爬取,又例如我們須要輸入關(guān)鍵字之后只爬取搜索結果。在這種情況下,我們須要在爬蟲(chóng)定義時(shí)才能將這種用戶(hù)輸入保存出來(lái),然后在爬蟲(chóng)執行期,將這種交互信息重新回放回來(lái),就像一個(gè)人在做這種動(dòng)作一樣。
Selenium是這些爬蟲(chóng)的一個(gè)事例,用戶(hù)用Selenium IDE錄制用戶(hù)動(dòng)作,保存為Selenese命令序列,然后使用Web driver模仿瀏覽器重放這種命令。交互式爬蟲(chóng)的優(yōu)點(diǎn)是可以象人一樣作出各類(lèi)動(dòng)作,缺點(diǎn)是因為須要建立完整的瀏覽器引擎開(kāi)源爬蟲(chóng)軟件,系統開(kāi)支十分大,爬取效率太低。
最后,做一個(gè)廣告,我近來(lái)開(kāi)源了一個(gè)爬蟲(chóng)portia-dashboard, 按照上面的分類(lèi)方式,這個(gè)爬蟲(chóng)是一個(gè)“面向多個(gè)站點(diǎn)的”、“主要支持信息抓取的”、“同時(shí)支持被動(dòng)抓取和互動(dòng)抓取” 的“可視化”爬蟲(chóng),而且提供了Portia中沒(méi)有的dashboard功能,使用dashboard可以布署爬蟲(chóng)、啟動(dòng)爬蟲(chóng)、監控爬蟲(chóng)狀態(tài),瀏覽提取的信息等等。
使用代碼安裝可能有點(diǎn)復雜,最簡(jiǎn)單的方式是使用docker, 歡迎你們使用,并提出寶貴意見(jiàn)。
基于chrome插件的爬蟲(chóng)可視化點(diǎn)選配置工具
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 365 次瀏覽 ? 2020-05-29 08:01
Chrome插件是一個(gè)用Web技術(shù)開(kāi)發(fā)、用來(lái)提高瀏覽器功能的軟件,它雖然就是一個(gè)由HTML、CSS、JS、圖片等資源組成的一個(gè).crx后綴的壓縮包.
Chrome插件沒(méi)有嚴格的項目結構要求,只要保證本目錄有一個(gè)manifest.json即可,也不需要專(zhuān)門(mén)的IDE,普通的web開(kāi)發(fā)工具即可。
從右上角菜單->更多工具->擴展程序可以步入 插件管理頁(yè)面,也可以直接在地址欄輸入chrome://extensions 訪(fǎng)問(wèn)。
網(wǎng)上介紹chrome插件開(kāi)發(fā)的文章已經(jīng)好多了,這里就不贅言了,只列一些項目中須要的
這是一個(gè)Chrome插件最重要也是必不可少的文件,用來(lái)配置所有和插件相關(guān)的配置,必須置于根目錄。其中,manifest_version、name、version3個(gè)是必不可少的,description和icons是推薦的。
下面給出的是一些常見(jiàn)的配置項,均有英文注釋
{
// 清單文件的版本,這個(gè)必須寫(xiě),而且必須是2
"manifest_version": 2,
// 插件的名稱(chēng)
"name": "demo",
// 插件的版本
"version": "1.0.0",
// 插件描述
"description": "簡(jiǎn)單的Chrome擴展demo",
// 圖標,一般偷懶全部用一個(gè)尺寸的也沒(méi)問(wèn)題
"icons":
{
"16": "img/icon.png",
"48": "img/icon.png",
"128": "img/icon.png"
},
// 會(huì )一直常駐的后臺JS或后臺頁(yè)面
"background":
{
// 2種指定方式,如果指定JS,那么會(huì )自動(dòng)生成一個(gè)背景頁(yè)
"page": "background.html"
//"scripts": ["js/background.js"]
},
// 瀏覽器右上角圖標設置,browser_action、page_action、app必須三選一
"browser_action":
{
"default_icon": "img/icon.png",
// 圖標懸停時(shí)的標題,可選
"default_title": "這是一個(gè)示例Chrome插件",
"default_popup": "popup.html"
},
// 當某些特定頁(yè)面打開(kāi)才顯示的圖標
/*"page_action":
{
"default_icon": "img/icon.png",
"default_title": "我是pageAction",
"default_popup": "popup.html"
},*/
// 需要直接注入頁(yè)面的JS
"content_scripts":
[
{
//"matches": ["http://*/*", "https://*/*"],
// "<all_urls>" 表示匹配所有地址
"matches": ["<all_urls>"],
// 多個(gè)JS按順序注入
"js": ["js/jquery-1.8.3.js", "js/content-script.js"],
// JS的注入可以隨便一點(diǎn),但是CSS的注意就要千萬(wàn)小心了,因為一不小心就可能影響全局樣式
"css": ["css/custom.css"],
// 代碼注入的時(shí)間,可選值: "document_start", "document_end", or "document_idle",最后一個(gè)表示頁(yè)面空閑時(shí),默認document_idle
"run_at": "document_start"
},
// 這里僅僅是為了演示content-script可以配置多個(gè)規則
{
"matches": ["*://*/*.png", "*://*/*.jpg", "*://*/*.gif", "*://*/*.bmp"],
"js": ["js/show-image-content-size.js"]
}
],
// 權限申請
"permissions":
[
"contextMenus", // 右鍵菜單
"tabs", // 標簽
"notifications", // 通知
"webRequest", // web請求
"webRequestBlocking",
"storage", // 插件本地存儲
"http://*/*", // 可以通過(guò)executeScript或者insertCSS訪(fǎng)問(wèn)的網(wǎng)站
"https://*/*" // 可以通過(guò)executeScript或者insertCSS訪(fǎng)問(wèn)的網(wǎng)站
],
// 普通頁(yè)面能夠直接訪(fǎng)問(wèn)的插件資源列表,如果不設置是無(wú)法直接訪(fǎng)問(wèn)的
"web_accessible_resources": ["js/inject.js"],
// 插件主頁(yè),這個(gè)很重要,不要浪費了這個(gè)免費廣告位
"homepage_url": "https://www.baidu.com",
// 覆蓋瀏覽器默認頁(yè)面
"chrome_url_overrides":
{
// 覆蓋瀏覽器默認的新標簽頁(yè)
"newtab": "newtab.html"
},
// Chrome40以前的插件配置頁(yè)寫(xiě)法
"options_page": "options.html",
// Chrome40以后的插件配置頁(yè)寫(xiě)法,如果2個(gè)都寫(xiě),新版Chrome只認后面這一個(gè)
"options_ui":
{
"page": "options.html",
// 添加一些默認的樣式,推薦使用
"chrome_style": true
},
// 向地址欄注冊一個(gè)關(guān)鍵字以提供搜索建議,只能設置一個(gè)關(guān)鍵字
"omnibox": { "keyword" : "go" },
// 默認語(yǔ)言
"default_locale": "zh_CN",
// devtools頁(yè)面入口,注意只能指向一個(gè)HTML文件,不能是JS文件
"devtools_page": "devtools.html"
}
所謂content-scripts,其實(shí)就是Chrome插件中向頁(yè)面注入腳本的一種方式(雖然名為script,其實(shí)還可以包括css的),借助content-scripts我們可以實(shí)現通過(guò)配置的形式輕松向指定頁(yè)面注入JS和CSS(如果須要動(dòng)態(tài)注入,可以參考下文),最常見(jiàn)的例如:廣告屏蔽、頁(yè)面CSS訂制,等等。
示例配置:
{
// 需要直接注入頁(yè)面的JS
"content_scripts":
[
{
//"matches": ["http://*/*", "https://*/*"],
// "<all_urls>" 表示匹配所有地址
"matches": ["<all_urls>"],
// 多個(gè)JS按順序注入
"js": ["js/jquery-1.8.3.js", "js/content-script.js"],
// JS的注入可以隨便一點(diǎn),但是CSS的注意就要千萬(wàn)小心了,因為一不小心就可能影響全局樣式
"css": ["css/custom.css"],
// 代碼注入的時(shí)間,可選值: "document_start", "document_end", or "document_idle",最后一個(gè)表示頁(yè)面空閑時(shí),默認document_idle
"run_at": "document_start"
}
],
}
特別注意,如果沒(méi)有主動(dòng)指定run_at為document_start(默認為document_idle),下面這些代碼是不會(huì )生效的
document.addEventListener('DOMContentLoaded', function()
{
console.log('我被執行了!');
});
content-scripts和原始頁(yè)面共享DOM,但是不共享JS,如要訪(fǎng)問(wèn)頁(yè)面JS(例如某個(gè)JS變量),只能通過(guò)`injected
js來(lái)實(shí)現。content-scripts不能訪(fǎng)問(wèn)絕大部分chrome.xxx.api`,除了下邊這4種:
由于content-script可以注入到頁(yè)面,所以我們即將開(kāi)發(fā)的插件的主要功能就在這里
后臺(姑且如此翻譯吧)爬蟲(chóng)軟件增加網(wǎng)頁(yè)訪(fǎng)問(wèn),是一個(gè)常駐的頁(yè)面,它的生命周期是插件中所有類(lèi)型頁(yè)面中最長(cháng)的,它隨著(zhù)瀏覽器的打開(kāi)而打開(kāi),隨著(zhù)瀏覽器的關(guān)掉而關(guān)掉,所以一般把須要仍然運行
的、啟動(dòng)就運行的、全局的代碼放到background上面。
background的權限十分高,幾乎可以調用所有的Chrome擴充API(除了devtools),而且它可以無(wú)限制跨域,也就是可以跨域訪(fǎng)問(wèn)任何網(wǎng)站而無(wú)需要
求對方設置CORS。
經(jīng)過(guò)測試,其實(shí)不止是background,所有的直接通過(guò)chrome-extension://id/xx.html這些方法打開(kāi)的網(wǎng)頁(yè)都可以無(wú)限制跨域。
配置中,background可以通過(guò)page指定一張網(wǎng)頁(yè),也可以通過(guò)scripts直接指定一個(gè)JS,Chrome會(huì )手動(dòng)為這個(gè)JS生成一個(gè)默認的網(wǎng)頁(yè):
{
// 會(huì )一直常駐的后臺JS或后臺頁(yè)面
"background":
{
// 2種指定方式,如果指定JS,那么會(huì )自動(dòng)生成一個(gè)背景頁(yè)
"page": "background.html"
//"scripts": ["js/background.js"]
},
}
這里順帶介紹一下event-pages,它是一個(gè)哪些東西呢?鑒于background生命周期很長(cháng),長(cháng)時(shí)間掛載后臺可能會(huì )影響性能,所以Google又弄一個(gè)event-pages,在配置文件上,它與background的惟一區別就是多了一個(gè)persistent參數:
{
"background":
{
"scripts": ["event-page.js"],
"persistent": false
},
}
它的生命周期是:在被須要時(shí)加載,在空閑時(shí)被關(guān)閉,什么叫被須要時(shí)呢?比如第一次安裝、插件更新、有content-script向它發(fā)送消息,等等。
我們要開(kāi)發(fā)的插件目前用到了background和content_scripts這兩個(gè)選項,如果之后添加新功能時(shí)再瞧瞧其他的選項爬蟲(chóng)軟件增加網(wǎng)頁(yè)訪(fǎng)問(wèn),對chrome插件開(kāi)發(fā)感興趣的朋友可以瞧瞧這本書(shū) 查看全部
Chrome插件沒(méi)有嚴格的項目結構要求,只要保證本目錄有一個(gè)manifest.json即可,也不需要專(zhuān)門(mén)的IDE,普通的web開(kāi)發(fā)工具即可。
從右上角菜單->更多工具->擴展程序可以步入 插件管理頁(yè)面,也可以直接在地址欄輸入chrome://extensions 訪(fǎng)問(wèn)。
網(wǎng)上介紹chrome插件開(kāi)發(fā)的文章已經(jīng)好多了,這里就不贅言了,只列一些項目中須要的
這是一個(gè)Chrome插件最重要也是必不可少的文件,用來(lái)配置所有和插件相關(guān)的配置,必須置于根目錄。其中,manifest_version、name、version3個(gè)是必不可少的,description和icons是推薦的。
下面給出的是一些常見(jiàn)的配置項,均有英文注釋
{
// 清單文件的版本,這個(gè)必須寫(xiě),而且必須是2
"manifest_version": 2,
// 插件的名稱(chēng)
"name": "demo",
// 插件的版本
"version": "1.0.0",
// 插件描述
"description": "簡(jiǎn)單的Chrome擴展demo",
// 圖標,一般偷懶全部用一個(gè)尺寸的也沒(méi)問(wèn)題
"icons":
{
"16": "img/icon.png",
"48": "img/icon.png",
"128": "img/icon.png"
},
// 會(huì )一直常駐的后臺JS或后臺頁(yè)面
"background":
{
// 2種指定方式,如果指定JS,那么會(huì )自動(dòng)生成一個(gè)背景頁(yè)
"page": "background.html"
//"scripts": ["js/background.js"]
},
// 瀏覽器右上角圖標設置,browser_action、page_action、app必須三選一
"browser_action":
{
"default_icon": "img/icon.png",
// 圖標懸停時(shí)的標題,可選
"default_title": "這是一個(gè)示例Chrome插件",
"default_popup": "popup.html"
},
// 當某些特定頁(yè)面打開(kāi)才顯示的圖標
/*"page_action":
{
"default_icon": "img/icon.png",
"default_title": "我是pageAction",
"default_popup": "popup.html"
},*/
// 需要直接注入頁(yè)面的JS
"content_scripts":
[
{
//"matches": ["http://*/*", "https://*/*"],
// "<all_urls>" 表示匹配所有地址
"matches": ["<all_urls>"],
// 多個(gè)JS按順序注入
"js": ["js/jquery-1.8.3.js", "js/content-script.js"],
// JS的注入可以隨便一點(diǎn),但是CSS的注意就要千萬(wàn)小心了,因為一不小心就可能影響全局樣式
"css": ["css/custom.css"],
// 代碼注入的時(shí)間,可選值: "document_start", "document_end", or "document_idle",最后一個(gè)表示頁(yè)面空閑時(shí),默認document_idle
"run_at": "document_start"
},
// 這里僅僅是為了演示content-script可以配置多個(gè)規則
{
"matches": ["*://*/*.png", "*://*/*.jpg", "*://*/*.gif", "*://*/*.bmp"],
"js": ["js/show-image-content-size.js"]
}
],
// 權限申請
"permissions":
[
"contextMenus", // 右鍵菜單
"tabs", // 標簽
"notifications", // 通知
"webRequest", // web請求
"webRequestBlocking",
"storage", // 插件本地存儲
"http://*/*", // 可以通過(guò)executeScript或者insertCSS訪(fǎng)問(wèn)的網(wǎng)站
"https://*/*" // 可以通過(guò)executeScript或者insertCSS訪(fǎng)問(wèn)的網(wǎng)站
],
// 普通頁(yè)面能夠直接訪(fǎng)問(wèn)的插件資源列表,如果不設置是無(wú)法直接訪(fǎng)問(wèn)的
"web_accessible_resources": ["js/inject.js"],
// 插件主頁(yè),這個(gè)很重要,不要浪費了這個(gè)免費廣告位
"homepage_url": "https://www.baidu.com",
// 覆蓋瀏覽器默認頁(yè)面
"chrome_url_overrides":
{
// 覆蓋瀏覽器默認的新標簽頁(yè)
"newtab": "newtab.html"
},
// Chrome40以前的插件配置頁(yè)寫(xiě)法
"options_page": "options.html",
// Chrome40以后的插件配置頁(yè)寫(xiě)法,如果2個(gè)都寫(xiě),新版Chrome只認后面這一個(gè)
"options_ui":
{
"page": "options.html",
// 添加一些默認的樣式,推薦使用
"chrome_style": true
},
// 向地址欄注冊一個(gè)關(guān)鍵字以提供搜索建議,只能設置一個(gè)關(guān)鍵字
"omnibox": { "keyword" : "go" },
// 默認語(yǔ)言
"default_locale": "zh_CN",
// devtools頁(yè)面入口,注意只能指向一個(gè)HTML文件,不能是JS文件
"devtools_page": "devtools.html"
}
所謂content-scripts,其實(shí)就是Chrome插件中向頁(yè)面注入腳本的一種方式(雖然名為script,其實(shí)還可以包括css的),借助content-scripts我們可以實(shí)現通過(guò)配置的形式輕松向指定頁(yè)面注入JS和CSS(如果須要動(dòng)態(tài)注入,可以參考下文),最常見(jiàn)的例如:廣告屏蔽、頁(yè)面CSS訂制,等等。
示例配置:
{
// 需要直接注入頁(yè)面的JS
"content_scripts":
[
{
//"matches": ["http://*/*", "https://*/*"],
// "<all_urls>" 表示匹配所有地址
"matches": ["<all_urls>"],
// 多個(gè)JS按順序注入
"js": ["js/jquery-1.8.3.js", "js/content-script.js"],
// JS的注入可以隨便一點(diǎn),但是CSS的注意就要千萬(wàn)小心了,因為一不小心就可能影響全局樣式
"css": ["css/custom.css"],
// 代碼注入的時(shí)間,可選值: "document_start", "document_end", or "document_idle",最后一個(gè)表示頁(yè)面空閑時(shí),默認document_idle
"run_at": "document_start"
}
],
}
特別注意,如果沒(méi)有主動(dòng)指定run_at為document_start(默認為document_idle),下面這些代碼是不會(huì )生效的
document.addEventListener('DOMContentLoaded', function()
{
console.log('我被執行了!');
});
content-scripts和原始頁(yè)面共享DOM,但是不共享JS,如要訪(fǎng)問(wèn)頁(yè)面JS(例如某個(gè)JS變量),只能通過(guò)`injected
js來(lái)實(shí)現。content-scripts不能訪(fǎng)問(wèn)絕大部分chrome.xxx.api`,除了下邊這4種:
由于content-script可以注入到頁(yè)面,所以我們即將開(kāi)發(fā)的插件的主要功能就在這里
后臺(姑且如此翻譯吧)爬蟲(chóng)軟件增加網(wǎng)頁(yè)訪(fǎng)問(wèn),是一個(gè)常駐的頁(yè)面,它的生命周期是插件中所有類(lèi)型頁(yè)面中最長(cháng)的,它隨著(zhù)瀏覽器的打開(kāi)而打開(kāi),隨著(zhù)瀏覽器的關(guān)掉而關(guān)掉,所以一般把須要仍然運行
的、啟動(dòng)就運行的、全局的代碼放到background上面。
background的權限十分高,幾乎可以調用所有的Chrome擴充API(除了devtools),而且它可以無(wú)限制跨域,也就是可以跨域訪(fǎng)問(wèn)任何網(wǎng)站而無(wú)需要
求對方設置CORS。
經(jīng)過(guò)測試,其實(shí)不止是background,所有的直接通過(guò)chrome-extension://id/xx.html這些方法打開(kāi)的網(wǎng)頁(yè)都可以無(wú)限制跨域。
配置中,background可以通過(guò)page指定一張網(wǎng)頁(yè),也可以通過(guò)scripts直接指定一個(gè)JS,Chrome會(huì )手動(dòng)為這個(gè)JS生成一個(gè)默認的網(wǎng)頁(yè):
{
// 會(huì )一直常駐的后臺JS或后臺頁(yè)面
"background":
{
// 2種指定方式,如果指定JS,那么會(huì )自動(dòng)生成一個(gè)背景頁(yè)
"page": "background.html"
//"scripts": ["js/background.js"]
},
}
這里順帶介紹一下event-pages,它是一個(gè)哪些東西呢?鑒于background生命周期很長(cháng),長(cháng)時(shí)間掛載后臺可能會(huì )影響性能,所以Google又弄一個(gè)event-pages,在配置文件上,它與background的惟一區別就是多了一個(gè)persistent參數:
{
"background":
{
"scripts": ["event-page.js"],
"persistent": false
},
}
它的生命周期是:在被須要時(shí)加載,在空閑時(shí)被關(guān)閉,什么叫被須要時(shí)呢?比如第一次安裝、插件更新、有content-script向它發(fā)送消息,等等。
我們要開(kāi)發(fā)的插件目前用到了background和content_scripts這兩個(gè)選項,如果之后添加新功能時(shí)再瞧瞧其他的選項爬蟲(chóng)軟件增加網(wǎng)頁(yè)訪(fǎng)問(wèn),對chrome插件開(kāi)發(fā)感興趣的朋友可以瞧瞧這本書(shū) 查看全部
Chrome插件是一個(gè)用Web技術(shù)開(kāi)發(fā)、用來(lái)提高瀏覽器功能的軟件,它雖然就是一個(gè)由HTML、CSS、JS、圖片等資源組成的一個(gè).crx后綴的壓縮包.
Chrome插件沒(méi)有嚴格的項目結構要求,只要保證本目錄有一個(gè)manifest.json即可,也不需要專(zhuān)門(mén)的IDE,普通的web開(kāi)發(fā)工具即可。
從右上角菜單->更多工具->擴展程序可以步入 插件管理頁(yè)面,也可以直接在地址欄輸入chrome://extensions 訪(fǎng)問(wèn)。
網(wǎng)上介紹chrome插件開(kāi)發(fā)的文章已經(jīng)好多了,這里就不贅言了,只列一些項目中須要的
這是一個(gè)Chrome插件最重要也是必不可少的文件,用來(lái)配置所有和插件相關(guān)的配置,必須置于根目錄。其中,manifest_version、name、version3個(gè)是必不可少的,description和icons是推薦的。
下面給出的是一些常見(jiàn)的配置項,均有英文注釋
{
// 清單文件的版本,這個(gè)必須寫(xiě),而且必須是2
"manifest_version": 2,
// 插件的名稱(chēng)
"name": "demo",
// 插件的版本
"version": "1.0.0",
// 插件描述
"description": "簡(jiǎn)單的Chrome擴展demo",
// 圖標,一般偷懶全部用一個(gè)尺寸的也沒(méi)問(wèn)題
"icons":
{
"16": "img/icon.png",
"48": "img/icon.png",
"128": "img/icon.png"
},
// 會(huì )一直常駐的后臺JS或后臺頁(yè)面
"background":
{
// 2種指定方式,如果指定JS,那么會(huì )自動(dòng)生成一個(gè)背景頁(yè)
"page": "background.html"
//"scripts": ["js/background.js"]
},
// 瀏覽器右上角圖標設置,browser_action、page_action、app必須三選一
"browser_action":
{
"default_icon": "img/icon.png",
// 圖標懸停時(shí)的標題,可選
"default_title": "這是一個(gè)示例Chrome插件",
"default_popup": "popup.html"
},
// 當某些特定頁(yè)面打開(kāi)才顯示的圖標
/*"page_action":
{
"default_icon": "img/icon.png",
"default_title": "我是pageAction",
"default_popup": "popup.html"
},*/
// 需要直接注入頁(yè)面的JS
"content_scripts":
[
{
//"matches": ["http://*/*", "https://*/*"],
// "<all_urls>" 表示匹配所有地址
"matches": ["<all_urls>"],
// 多個(gè)JS按順序注入
"js": ["js/jquery-1.8.3.js", "js/content-script.js"],
// JS的注入可以隨便一點(diǎn),但是CSS的注意就要千萬(wàn)小心了,因為一不小心就可能影響全局樣式
"css": ["css/custom.css"],
// 代碼注入的時(shí)間,可選值: "document_start", "document_end", or "document_idle",最后一個(gè)表示頁(yè)面空閑時(shí),默認document_idle
"run_at": "document_start"
},
// 這里僅僅是為了演示content-script可以配置多個(gè)規則
{
"matches": ["*://*/*.png", "*://*/*.jpg", "*://*/*.gif", "*://*/*.bmp"],
"js": ["js/show-image-content-size.js"]
}
],
// 權限申請
"permissions":
[
"contextMenus", // 右鍵菜單
"tabs", // 標簽
"notifications", // 通知
"webRequest", // web請求
"webRequestBlocking",
"storage", // 插件本地存儲
"http://*/*", // 可以通過(guò)executeScript或者insertCSS訪(fǎng)問(wèn)的網(wǎng)站
"https://*/*" // 可以通過(guò)executeScript或者insertCSS訪(fǎng)問(wèn)的網(wǎng)站
],
// 普通頁(yè)面能夠直接訪(fǎng)問(wèn)的插件資源列表,如果不設置是無(wú)法直接訪(fǎng)問(wèn)的
"web_accessible_resources": ["js/inject.js"],
// 插件主頁(yè),這個(gè)很重要,不要浪費了這個(gè)免費廣告位
"homepage_url": "https://www.baidu.com",
// 覆蓋瀏覽器默認頁(yè)面
"chrome_url_overrides":
{
// 覆蓋瀏覽器默認的新標簽頁(yè)
"newtab": "newtab.html"
},
// Chrome40以前的插件配置頁(yè)寫(xiě)法
"options_page": "options.html",
// Chrome40以后的插件配置頁(yè)寫(xiě)法,如果2個(gè)都寫(xiě),新版Chrome只認后面這一個(gè)
"options_ui":
{
"page": "options.html",
// 添加一些默認的樣式,推薦使用
"chrome_style": true
},
// 向地址欄注冊一個(gè)關(guān)鍵字以提供搜索建議,只能設置一個(gè)關(guān)鍵字
"omnibox": { "keyword" : "go" },
// 默認語(yǔ)言
"default_locale": "zh_CN",
// devtools頁(yè)面入口,注意只能指向一個(gè)HTML文件,不能是JS文件
"devtools_page": "devtools.html"
}
所謂content-scripts,其實(shí)就是Chrome插件中向頁(yè)面注入腳本的一種方式(雖然名為script,其實(shí)還可以包括css的),借助content-scripts我們可以實(shí)現通過(guò)配置的形式輕松向指定頁(yè)面注入JS和CSS(如果須要動(dòng)態(tài)注入,可以參考下文),最常見(jiàn)的例如:廣告屏蔽、頁(yè)面CSS訂制,等等。
示例配置:
{
// 需要直接注入頁(yè)面的JS
"content_scripts":
[
{
//"matches": ["http://*/*", "https://*/*"],
// "<all_urls>" 表示匹配所有地址
"matches": ["<all_urls>"],
// 多個(gè)JS按順序注入
"js": ["js/jquery-1.8.3.js", "js/content-script.js"],
// JS的注入可以隨便一點(diǎn),但是CSS的注意就要千萬(wàn)小心了,因為一不小心就可能影響全局樣式
"css": ["css/custom.css"],
// 代碼注入的時(shí)間,可選值: "document_start", "document_end", or "document_idle",最后一個(gè)表示頁(yè)面空閑時(shí),默認document_idle
"run_at": "document_start"
}
],
}
特別注意,如果沒(méi)有主動(dòng)指定run_at為document_start(默認為document_idle),下面這些代碼是不會(huì )生效的
document.addEventListener('DOMContentLoaded', function()
{
console.log('我被執行了!');
});
content-scripts和原始頁(yè)面共享DOM,但是不共享JS,如要訪(fǎng)問(wèn)頁(yè)面JS(例如某個(gè)JS變量),只能通過(guò)`injected
js來(lái)實(shí)現。content-scripts不能訪(fǎng)問(wèn)絕大部分chrome.xxx.api`,除了下邊這4種:
由于content-script可以注入到頁(yè)面,所以我們即將開(kāi)發(fā)的插件的主要功能就在這里
后臺(姑且如此翻譯吧)爬蟲(chóng)軟件增加網(wǎng)頁(yè)訪(fǎng)問(wèn),是一個(gè)常駐的頁(yè)面,它的生命周期是插件中所有類(lèi)型頁(yè)面中最長(cháng)的,它隨著(zhù)瀏覽器的打開(kāi)而打開(kāi),隨著(zhù)瀏覽器的關(guān)掉而關(guān)掉,所以一般把須要仍然運行
的、啟動(dòng)就運行的、全局的代碼放到background上面。
background的權限十分高,幾乎可以調用所有的Chrome擴充API(除了devtools),而且它可以無(wú)限制跨域,也就是可以跨域訪(fǎng)問(wèn)任何網(wǎng)站而無(wú)需要
求對方設置CORS。
經(jīng)過(guò)測試,其實(shí)不止是background,所有的直接通過(guò)chrome-extension://id/xx.html這些方法打開(kāi)的網(wǎng)頁(yè)都可以無(wú)限制跨域。
配置中,background可以通過(guò)page指定一張網(wǎng)頁(yè),也可以通過(guò)scripts直接指定一個(gè)JS,Chrome會(huì )手動(dòng)為這個(gè)JS生成一個(gè)默認的網(wǎng)頁(yè):
{
// 會(huì )一直常駐的后臺JS或后臺頁(yè)面
"background":
{
// 2種指定方式,如果指定JS,那么會(huì )自動(dòng)生成一個(gè)背景頁(yè)
"page": "background.html"
//"scripts": ["js/background.js"]
},
}
這里順帶介紹一下event-pages,它是一個(gè)哪些東西呢?鑒于background生命周期很長(cháng),長(cháng)時(shí)間掛載后臺可能會(huì )影響性能,所以Google又弄一個(gè)event-pages,在配置文件上,它與background的惟一區別就是多了一個(gè)persistent參數:
{
"background":
{
"scripts": ["event-page.js"],
"persistent": false
},
}
它的生命周期是:在被須要時(shí)加載,在空閑時(shí)被關(guān)閉,什么叫被須要時(shí)呢?比如第一次安裝、插件更新、有content-script向它發(fā)送消息,等等。
我們要開(kāi)發(fā)的插件目前用到了background和content_scripts這兩個(gè)選項,如果之后添加新功能時(shí)再瞧瞧其他的選項爬蟲(chóng)軟件增加網(wǎng)頁(yè)訪(fǎng)問(wèn),對chrome插件開(kāi)發(fā)感興趣的朋友可以瞧瞧這本書(shū)


