文章采集api
文章采集api(一個(gè)博客小站來(lái)說(shuō)的收錄方式文章目錄資源前言)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 142 次瀏覽 ? 2022-03-01 01:25
typechoSEO網(wǎng)站收錄插件推薦百度提交
文章目錄
資源前言
我們在建一個(gè)小站點(diǎn)的時(shí)候,可能會(huì )遇到如何讓搜索引擎抓取我們的文章的問(wèn)題,當然你可以選擇不讓搜索引擎抓取你的站點(diǎn)。這時(shí)候,你就需要SEO(“搜索引擎優(yōu)化”)。其實(shí)涉及的內容很多,但作為我這種小博客網(wǎng)站,沒(méi)必要。無(wú)非就是讓你的網(wǎng)站在搜索引擎中的排名更高,讓運維來(lái)做。在這篇文章中,我主要講一下我在SEO方面采取的一些做法,主要是百度收錄,其他搜索引擎的收錄方法類(lèi)似,大家可以自行搜索理解
安裝
把下載好的插件解壓到typecho主目錄下的插件目錄下,一般是/usr/plugins
然后就可以在typecho的后臺插件中看到了
百度站長(cháng)網(wǎng)站設置
百度搜索引擎提供了站長(cháng)網(wǎng)站,這樣我們就可以主動(dòng)讓百度去收錄自己的站點(diǎn),下面是傳送門(mén)
門(mén)戶(hù)網(wǎng)站
他提供了幾種不同的收錄方法,比如quick收錄,可以讓你主動(dòng)提供你網(wǎng)站的一些資源,比如sitemap等,縮短搜索引擎爬蟲(chóng)爬取你的時(shí)間地點(diǎn)。具體方法有API提交、站點(diǎn)地圖、手動(dòng)提交。這次推薦的插件主要是API提交。
API 提交
推送接口、推送實(shí)例、推送反饋如上所示。我們只需要關(guān)注推送接口即可。后兩者在實(shí)現代碼時(shí)需要注意。顯然,插件作者已經(jīng)做到了這一點(diǎn)。以下是API接口的樣式。
http://data.zz.baidu.com/urls?site={您的站點(diǎn)}&token={驗證token,相當于密碼}
網(wǎng)站地圖
要提交站點(diǎn)地圖,您可以使用 txt 或 xml 格式。這里可以直接使用這個(gè)插件生成的xml文件,大部分搜索引擎都識別sitemaps(我不知道),比如你可以看一下我的站點(diǎn)自動(dòng)生成的xml。文檔
如果您熟悉 XML,很容易發(fā)現大部分站點(diǎn)地圖實(shí)際上是由這些多個(gè) url 元素組成的。
所以我們可以填寫(xiě)對應的
不僅可以在這里使用站點(diǎn)的路徑,而且在這里這樣做更方便。另外,這個(gè)站點(diǎn)地圖一天最多只能推送十次。
手動(dòng)提交
也就是提交你網(wǎng)站上寫(xiě)的文章的鏈接,也就是把sitemap.xml內容中的url鏈接一個(gè)一個(gè)提交,這個(gè)方法可以保證你的一個(gè)文章可以很好收錄(不一定,還是看百度吧),自己決定
百度站長(cháng)其他工具
喜歡什么移動(dòng)適配,死鏈接提交可以自己看懂,什么都寫(xiě)清楚了哈哈
插件介紹功能使用
很簡(jiǎn)單,直接填一個(gè)api,發(fā)布的時(shí)候會(huì )自動(dòng)提交類(lèi)似這個(gè)api的更新文章
機器人文件
使用爬蟲(chóng)的人應該對此非常熟悉。簡(jiǎn)而言之,是爬蟲(chóng)的“君子協(xié)定”。雖然我們平時(shí)不遵守君子協(xié)定,但百度、搜狗、谷歌等大搜索引擎還是會(huì )遵守的。是的,這個(gè)約束只是對它們的約束。哈哈,由于這個(gè)插件沒(méi)有自動(dòng)生成robots.txt的功能,所以需要我們自己創(chuàng )建。方法也很簡(jiǎn)單。步驟如下
創(chuàng )建一個(gè)名為 robots.txt 的新文件
輸入內容
User-agent: *
Allow: /
Disallow: /admin/
Disallow: /install/
Sitemap: https://你的網(wǎng)站地址/sitemap.xml
這個(gè)語(yǔ)法很簡(jiǎn)單,可以根據自己網(wǎng)站的需要進(jìn)行修改
保存并上傳文件到 網(wǎng)站 根目錄
最后,訪(fǎng)問(wèn)自己 網(wǎng)站 進(jìn)行驗證
好的,你完成了
查看您的網(wǎng)站是否被 收錄 阻止
最常用的方法是在搜索引擎上搜索您的一篇文章文章。如果你找到了,說(shuō)明你已經(jīng)收錄
這里推薦一個(gè)查看你整個(gè)站點(diǎn)的收錄情況的方法(使用搜索語(yǔ)法site:xxx),具體示例如下
可以看到百度收錄已經(jīng)添加了我以前的站點(diǎn),所以這里有一點(diǎn)你可以知道的是,百度收錄并不是你提交資源后就可以立即更新的東西,他會(huì )是定期更新,可能是一周或一個(gè)月(廢話(huà))
總結
其實(shí)搜索引擎的收錄只需要提交一個(gè)鏈接,搜索引擎就會(huì )自動(dòng)抓取你的鏈接。這個(gè)插件自動(dòng)生成sitemap.xml文件,可以很方便的讓其他搜索引擎收錄,所以一個(gè)sitemap插件就夠了。下面我將給出各大搜索引擎站長(cháng)的網(wǎng)站地址。你可以直接寫(xiě)你的網(wǎng)站地址,讓他們自己爬。, 收錄不會(huì )馬上成功的。這主要取決于不同的搜索引擎,以及您網(wǎng)站的各種結果,其中涉及到 SEO 問(wèn)題。我對此一無(wú)所知。問(wèn)運維老板。. 最后,祝你折騰網(wǎng)站開(kāi)心! 查看全部
文章采集api(一個(gè)博客小站來(lái)說(shuō)的收錄方式文章目錄資源前言)
typechoSEO網(wǎng)站收錄插件推薦百度提交
文章目錄
資源前言
我們在建一個(gè)小站點(diǎn)的時(shí)候,可能會(huì )遇到如何讓搜索引擎抓取我們的文章的問(wèn)題,當然你可以選擇不讓搜索引擎抓取你的站點(diǎn)。這時(shí)候,你就需要SEO(“搜索引擎優(yōu)化”)。其實(shí)涉及的內容很多,但作為我這種小博客網(wǎng)站,沒(méi)必要。無(wú)非就是讓你的網(wǎng)站在搜索引擎中的排名更高,讓運維來(lái)做。在這篇文章中,我主要講一下我在SEO方面采取的一些做法,主要是百度收錄,其他搜索引擎的收錄方法類(lèi)似,大家可以自行搜索理解
安裝
把下載好的插件解壓到typecho主目錄下的插件目錄下,一般是/usr/plugins

然后就可以在typecho的后臺插件中看到了

百度站長(cháng)網(wǎng)站設置
百度搜索引擎提供了站長(cháng)網(wǎng)站,這樣我們就可以主動(dòng)讓百度去收錄自己的站點(diǎn),下面是傳送門(mén)
門(mén)戶(hù)網(wǎng)站

他提供了幾種不同的收錄方法,比如quick收錄,可以讓你主動(dòng)提供你網(wǎng)站的一些資源,比如sitemap等,縮短搜索引擎爬蟲(chóng)爬取你的時(shí)間地點(diǎn)。具體方法有API提交、站點(diǎn)地圖、手動(dòng)提交。這次推薦的插件主要是API提交。
API 提交
推送接口、推送實(shí)例、推送反饋如上所示。我們只需要關(guān)注推送接口即可。后兩者在實(shí)現代碼時(shí)需要注意。顯然,插件作者已經(jīng)做到了這一點(diǎn)。以下是API接口的樣式。
http://data.zz.baidu.com/urls?site={您的站點(diǎn)}&token={驗證token,相當于密碼}
網(wǎng)站地圖

要提交站點(diǎn)地圖,您可以使用 txt 或 xml 格式。這里可以直接使用這個(gè)插件生成的xml文件,大部分搜索引擎都識別sitemaps(我不知道),比如你可以看一下我的站點(diǎn)自動(dòng)生成的xml。文檔


如果您熟悉 XML,很容易發(fā)現大部分站點(diǎn)地圖實(shí)際上是由這些多個(gè) url 元素組成的。
所以我們可以填寫(xiě)對應的

不僅可以在這里使用站點(diǎn)的路徑,而且在這里這樣做更方便。另外,這個(gè)站點(diǎn)地圖一天最多只能推送十次。
手動(dòng)提交

也就是提交你網(wǎng)站上寫(xiě)的文章的鏈接,也就是把sitemap.xml內容中的url鏈接一個(gè)一個(gè)提交,這個(gè)方法可以保證你的一個(gè)文章可以很好收錄(不一定,還是看百度吧),自己決定
百度站長(cháng)其他工具
喜歡什么移動(dòng)適配,死鏈接提交可以自己看懂,什么都寫(xiě)清楚了哈哈
插件介紹功能使用

很簡(jiǎn)單,直接填一個(gè)api,發(fā)布的時(shí)候會(huì )自動(dòng)提交類(lèi)似這個(gè)api的更新文章
機器人文件
使用爬蟲(chóng)的人應該對此非常熟悉。簡(jiǎn)而言之,是爬蟲(chóng)的“君子協(xié)定”。雖然我們平時(shí)不遵守君子協(xié)定,但百度、搜狗、谷歌等大搜索引擎還是會(huì )遵守的。是的,這個(gè)約束只是對它們的約束。哈哈,由于這個(gè)插件沒(méi)有自動(dòng)生成robots.txt的功能,所以需要我們自己創(chuàng )建。方法也很簡(jiǎn)單。步驟如下
創(chuàng )建一個(gè)名為 robots.txt 的新文件
輸入內容
User-agent: *
Allow: /
Disallow: /admin/
Disallow: /install/
Sitemap: https://你的網(wǎng)站地址/sitemap.xml
這個(gè)語(yǔ)法很簡(jiǎn)單,可以根據自己網(wǎng)站的需要進(jìn)行修改
保存并上傳文件到 網(wǎng)站 根目錄

最后,訪(fǎng)問(wèn)自己 網(wǎng)站 進(jìn)行驗證

好的,你完成了
查看您的網(wǎng)站是否被 收錄 阻止
最常用的方法是在搜索引擎上搜索您的一篇文章文章。如果你找到了,說(shuō)明你已經(jīng)收錄
這里推薦一個(gè)查看你整個(gè)站點(diǎn)的收錄情況的方法(使用搜索語(yǔ)法site:xxx),具體示例如下

可以看到百度收錄已經(jīng)添加了我以前的站點(diǎn),所以這里有一點(diǎn)你可以知道的是,百度收錄并不是你提交資源后就可以立即更新的東西,他會(huì )是定期更新,可能是一周或一個(gè)月(廢話(huà))
總結
其實(shí)搜索引擎的收錄只需要提交一個(gè)鏈接,搜索引擎就會(huì )自動(dòng)抓取你的鏈接。這個(gè)插件自動(dòng)生成sitemap.xml文件,可以很方便的讓其他搜索引擎收錄,所以一個(gè)sitemap插件就夠了。下面我將給出各大搜索引擎站長(cháng)的網(wǎng)站地址。你可以直接寫(xiě)你的網(wǎng)站地址,讓他們自己爬。, 收錄不會(huì )馬上成功的。這主要取決于不同的搜索引擎,以及您網(wǎng)站的各種結果,其中涉及到 SEO 問(wèn)題。我對此一無(wú)所知。問(wèn)運維老板。. 最后,祝你折騰網(wǎng)站開(kāi)心!
文章采集api(如何用R調用API,提取和整理你需要的免費Web數據)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 179 次瀏覽 ? 2022-02-27 00:28
API是獲取Web數據的重要方式之一。想了解如何使用 R 調用 API 來(lái)提取和組織您需要的免費 Web 數據嗎?本文將逐步向您展示操作過(guò)程。
交易
俗話(huà)說(shuō),“聰明的女人,沒(méi)有飯難煮”。就算你掌握了數據分析十八門(mén)武功,沒(méi)有數據也是一件麻煩的事情?!鞍蔚抖?,茫然不知所措”,大概就是這樣。
有很多數據來(lái)源。Web 數據是數量龐大且相對容易獲取的類(lèi)型之一。更好的是,很多網(wǎng)絡(luò )數據都是免費的。
在這個(gè)所謂的大數據時(shí)代,如何獲取網(wǎng)絡(luò )數據?
許多人使用由他人編譯和發(fā)布的數據集。
他們很幸運,他們的工作可以建立在其他人的基礎上。這是最有效的。
但并不是每個(gè)人都這么幸運。如果您需要的數據從未被組織和發(fā)布過(guò)怎么辦?
事實(shí)上,這樣的數據量更大。我們是否對他們視而不見(jiàn)?
如果您考慮爬行動(dòng)物,那么您的想法是正確的。爬蟲(chóng)可以為您獲取幾乎所有可見(jiàn)(甚至不可見(jiàn))的網(wǎng)絡(luò )數據。然而,編寫(xiě)和使用爬蟲(chóng)的成本很高。包括時(shí)間資源、技術(shù)能力等。如果你遇到任何網(wǎng)絡(luò )數據獲取問(wèn)題,你不要想“大錘”,有時(shí)可能是“刀槍不入”。
在“別人準備的數據”和“需要自己爬取的數據”之間,還有一個(gè)廣闊的領(lǐng)域,這就是API的世界。
什么是 API?
它是應用程序編程接口的縮寫(xiě)。具體來(lái)說(shuō),某個(gè)網(wǎng)站的數據在不斷的積累和變化。如果對這些數據進(jìn)行整理,不僅費時(shí),而且占用空間,而且還有剛整理完就過(guò)時(shí)的危險。大多數人需要的數據其實(shí)只是其中的一小部分,但時(shí)效性要求可能非常強。因此,組織存儲并將其提供給公眾以供下載是不經(jīng)濟的。
但是,如果數據不能以某種方式打通,就會(huì )面臨無(wú)數爬蟲(chóng)的騷擾。這會(huì )對網(wǎng)站的正常運行造成很大的困擾。折衷方案是 網(wǎng)站 主動(dòng)提供通道。當你需要某部分數據時(shí),雖然沒(méi)有現成的數據集,但你只需要用這個(gè)通道描述你想要的數據,然后網(wǎng)站審核后(一般是自動(dòng)化的,瞬間完成),認為我可以給你,我會(huì )立即發(fā)送你明確要求的數據。雙方都很高興。
以后在找數據的時(shí)候,不妨看看目標網(wǎng)站有沒(méi)有提供API,避免無(wú)用的努力。
在這個(gè)github項目中,有一個(gè)非常詳細的列表,涵蓋了當前常見(jiàn)的主流網(wǎng)站API資源狀況。作者還在整理和修改中,大家可以采集起來(lái)慢慢看。
如果我們知道某個(gè)網(wǎng)站提供了API,通過(guò)查看文檔知道我們需要的數據在那里,那么問(wèn)題就變成了——如何通過(guò)API獲取數據?
下面我們用一個(gè)實(shí)際的例子來(lái)向您展示整個(gè)操作步驟。
資源
我們正在尋找的例子是維基百科。
有關(guān) Wikipedia API 的概述,請參閱此頁(yè)面。
假設我們關(guān)心特定時(shí)間段內對指定維基百科 文章 頁(yè)面的訪(fǎng)問(wèn)次數。
維基百科為我們提供了一種稱(chēng)為指標的數據,它涵蓋了頁(yè)面訪(fǎng)問(wèn)的關(guān)鍵價(jià)值。對應API的介紹頁(yè)面在這里。
頁(yè)面上有一個(gè)示例。假設需要獲取2015年10月愛(ài)因斯坦入口頁(yè)面的訪(fǎng)問(wèn)次數,可以這樣調用:
GET http://wikimedia.org/api/rest_ ... %3Bbr style="box-sizing:border-box;margin:0px;padding:0px;" />
我們可以在瀏覽器的地址欄中輸入GET后的一長(cháng)串URL,然后回車(chē)看看我們得到了什么結果。
在瀏覽器中,我們看到了上圖中的一長(cháng)串文字。您可能想知道 - 這是什么?
恭喜,這是我們需要得到的數據。但是,它使用一種稱(chēng)為 JSON 的特殊數據格式。
JSON是互聯(lián)網(wǎng)上數據交互的主流格式之一。如果你想了解 JSON 的含義和用法,可以參考這篇教程。
在瀏覽器中,我們最初只能看到數據的第一部分。但它已經(jīng)收錄了有價(jià)值的內容:
{"items":[{"project":"en.wikipedia","article":"Albert_Einstein","granularity":"daily","timestamp":"2015100100","access":"all-access","agent":"all-agents","views":18860}<br style="box-sizing:border-box;margin:0px;padding:0px;" />
在本段中,我們看到項目名稱(chēng)(en.wikipedia)、文章 標題(Albert Einstein)、統計粒度(天)、時(shí)間戳(10/1/2015)、訪(fǎng)問(wèn)類(lèi)型(全部)、終端類(lèi)型(全部) 和訪(fǎng)問(wèn)次數 (18860).
我們使用滑塊將返回的文本拖到最后,我們會(huì )看到如下信息:
{"project":"en.wikipedia","article":"Albert_Einstein","granularity":"daily","timestamp":"2015103100","access":"all-access","agent":"all-agents","views":16380}]}<br style="box-sizing:border-box;margin:0px;padding:0px;" />
與 10 月 1 日的數據相比,只有時(shí)間戳(2015 年 10 月 31 日)和訪(fǎng)問(wèn)次數(16380))發(fā)生了變化。
在中間,我們跳過(guò)了 10 月 2 日至 10 月 30 日之間的數據。存儲格式相同,只是日期和訪(fǎng)問(wèn)次數的數據值在變化。
您需要的所有數據都在這里,您只需提取相應的信息即可。但是如果手動(dòng)進(jìn)行(比如將需要的項目復制粘貼到Excel中),顯然效率低下,容易出錯。讓我們展示如何使用 R 編程環(huán)境自動(dòng)化這個(gè)過(guò)程。
準備
在正式用 R 調用 API 之前,我們需要做一些必要的準備工作。
首先是安裝R。
請到本網(wǎng)站下載R基礎安裝包。
R的下載位置比較多,建議選擇清華鏡像,下載速度比較快。
請根據您的操作系統平臺選擇對應的版本進(jìn)行下載。我正在使用 macOS 版本。
下載 pkg 文件。雙擊安裝。
安裝完基礎包后,我們繼續安裝集成開(kāi)發(fā)環(huán)境RStudio。它可以幫助您輕松和交互式地與 R 進(jìn)行交流。RStudio的下載地址在這里。
根據你的操作系統,選擇對應的安裝包。macOS 安裝包是一個(gè) dmg 文件。雙擊打開(kāi)后,將RStudio.app圖標拖到Applications文件夾下,安裝完成。
下面我們雙擊從應用程序目錄運行RStudio。
我們先在 RStudio 的 Console 中運行以下語(yǔ)句來(lái)安裝一些需要的包:
install.packages("tidyverse")<br style="box-sizing:border-box;margin:0px;padding:0px;" />install.packages("rlist")<br style="box-sizing:border-box;margin:0px;padding:0px;" />
安裝完成后,在菜單中選擇File->New,在如下界面中選擇R Notebook。
R Notebook 默認為我們提供了一個(gè)帶有一些基本使用說(shuō)明的模板。
讓我們嘗試在編輯區域(左)的代碼部分(灰色)中單擊運行按鈕。
情節的結果可以立即看到。
我們點(diǎn)擊菜單欄上的Preview按鈕來(lái)查看整個(gè)代碼的效果。操作的結果將以帶有圖片和文本的 HTML 文件的形式顯示。
現在我們已經(jīng)熟悉了環(huán)境,是時(shí)候實(shí)際運行我們的代碼了。我們把編輯區的開(kāi)頭描述區保留在左邊,刪除其余的,把文件名改成有意義的web-data-api-with-R。
至此,準備工作就緒?,F在我們要開(kāi)始實(shí)際操作了。
操作
在實(shí)際操作過(guò)程中,我們以維基百科的另一個(gè)wiki文章為例來(lái)證明這種操作方法的通用性。選中的文章就是我們介紹詞云制作時(shí)使用的那個(gè),叫做“Yes, Minisiter”。這是一部 1980 年代的英國喜劇。
我們先在瀏覽器中試一下,看看能否修改 API 示例中的參數,獲取“是,部長(cháng)”文章 的訪(fǎng)問(wèn)統計信息。作為測試,我們僅采集 2017 年 10 月 1 日至 2017 年 10 月 3 日 3 天的數據。
與示例相反,我們需要替換的內容包括開(kāi)始和結束時(shí)間以及 文章 標題。
我們在瀏覽器的地址欄中輸入:
https://wikimedia.org/api/rest ... %3Bbr style="box-sizing:border-box;margin:0px;padding:0px;" />
返回結果如下:
數據可以正常返回。接下來(lái),我們使用語(yǔ)句方法在 RStudio 中調用。
請注意,在下面的代碼中,程序的輸出部分會(huì )在開(kāi)頭帶有## 標記,以區別于執行代碼本身。
啟動(dòng)后,我們需要設置時(shí)區。否則,您稍后在處理時(shí)間數據時(shí)會(huì )遇到錯誤。
Sys.setenv(TZ="Asia/Shanghai")<br style="box-sizing:border-box;margin:0px;padding:0px;" />
然后,我們調用 tidyverse 包,它是一個(gè)可以同時(shí)加載許多函數的集合,我們稍后會(huì )用到。
library(tidyverse)<br style="box-sizing:border-box;margin:0px;padding:0px;" /><br style="box-sizing:border-box;margin:0px;padding:0px;" />## Loading tidyverse: ggplot2<br style="box-sizing:border-box;margin:0px;padding:0px;" />## Loading tidyverse: tibble<br style="box-sizing:border-box;margin:0px;padding:0px;" />## Loading tidyverse: tidyr<br style="box-sizing:border-box;margin:0px;padding:0px;" />## Loading tidyverse: readr<br style="box-sizing:border-box;margin:0px;padding:0px;" />## Loading tidyverse: purrr<br style="box-sizing:border-box;margin:0px;padding:0px;" />## Loading tidyverse: dplyr<br style="box-sizing:border-box;margin:0px;padding:0px;" /><br style="box-sizing:border-box;margin:0px;padding:0px;" />## Conflicts with tidy packages ----------------------------------------------<br style="box-sizing:border-box;margin:0px;padding:0px;" /><br style="box-sizing:border-box;margin:0px;padding:0px;" />## filter(): dplyr, stats<br style="box-sizing:border-box;margin:0px;padding:0px;" />## lag(): ? ?dplyr, stats<br style="box-sizing:border-box;margin:0px;padding:0px;" />
這里可能有一些警告,請忽略它們。它對我們的運營(yíng)沒(méi)有影響。
根據前面的例子,我們定義要查詢(xún)的時(shí)間跨度,并指定要查找的wiki文章的名稱(chēng)。
請注意,與 Python 不同,在 R 中,賦值采用標記,而不是 =。不過(guò),R 語(yǔ)言其實(shí)很容易上手。如果你堅持使用=,它也能識別,不會(huì )報錯。
<p>starting 查看全部
文章采集api(如何用R調用API,提取和整理你需要的免費Web數據)
API是獲取Web數據的重要方式之一。想了解如何使用 R 調用 API 來(lái)提取和組織您需要的免費 Web 數據嗎?本文將逐步向您展示操作過(guò)程。

交易
俗話(huà)說(shuō),“聰明的女人,沒(méi)有飯難煮”。就算你掌握了數據分析十八門(mén)武功,沒(méi)有數據也是一件麻煩的事情?!鞍蔚抖?,茫然不知所措”,大概就是這樣。
有很多數據來(lái)源。Web 數據是數量龐大且相對容易獲取的類(lèi)型之一。更好的是,很多網(wǎng)絡(luò )數據都是免費的。
在這個(gè)所謂的大數據時(shí)代,如何獲取網(wǎng)絡(luò )數據?
許多人使用由他人編譯和發(fā)布的數據集。
他們很幸運,他們的工作可以建立在其他人的基礎上。這是最有效的。
但并不是每個(gè)人都這么幸運。如果您需要的數據從未被組織和發(fā)布過(guò)怎么辦?
事實(shí)上,這樣的數據量更大。我們是否對他們視而不見(jiàn)?
如果您考慮爬行動(dòng)物,那么您的想法是正確的。爬蟲(chóng)可以為您獲取幾乎所有可見(jiàn)(甚至不可見(jiàn))的網(wǎng)絡(luò )數據。然而,編寫(xiě)和使用爬蟲(chóng)的成本很高。包括時(shí)間資源、技術(shù)能力等。如果你遇到任何網(wǎng)絡(luò )數據獲取問(wèn)題,你不要想“大錘”,有時(shí)可能是“刀槍不入”。
在“別人準備的數據”和“需要自己爬取的數據”之間,還有一個(gè)廣闊的領(lǐng)域,這就是API的世界。
什么是 API?
它是應用程序編程接口的縮寫(xiě)。具體來(lái)說(shuō),某個(gè)網(wǎng)站的數據在不斷的積累和變化。如果對這些數據進(jìn)行整理,不僅費時(shí),而且占用空間,而且還有剛整理完就過(guò)時(shí)的危險。大多數人需要的數據其實(shí)只是其中的一小部分,但時(shí)效性要求可能非常強。因此,組織存儲并將其提供給公眾以供下載是不經(jīng)濟的。
但是,如果數據不能以某種方式打通,就會(huì )面臨無(wú)數爬蟲(chóng)的騷擾。這會(huì )對網(wǎng)站的正常運行造成很大的困擾。折衷方案是 網(wǎng)站 主動(dòng)提供通道。當你需要某部分數據時(shí),雖然沒(méi)有現成的數據集,但你只需要用這個(gè)通道描述你想要的數據,然后網(wǎng)站審核后(一般是自動(dòng)化的,瞬間完成),認為我可以給你,我會(huì )立即發(fā)送你明確要求的數據。雙方都很高興。
以后在找數據的時(shí)候,不妨看看目標網(wǎng)站有沒(méi)有提供API,避免無(wú)用的努力。
在這個(gè)github項目中,有一個(gè)非常詳細的列表,涵蓋了當前常見(jiàn)的主流網(wǎng)站API資源狀況。作者還在整理和修改中,大家可以采集起來(lái)慢慢看。

如果我們知道某個(gè)網(wǎng)站提供了API,通過(guò)查看文檔知道我們需要的數據在那里,那么問(wèn)題就變成了——如何通過(guò)API獲取數據?
下面我們用一個(gè)實(shí)際的例子來(lái)向您展示整個(gè)操作步驟。
資源
我們正在尋找的例子是維基百科。
有關(guān) Wikipedia API 的概述,請參閱此頁(yè)面。

假設我們關(guān)心特定時(shí)間段內對指定維基百科 文章 頁(yè)面的訪(fǎng)問(wèn)次數。
維基百科為我們提供了一種稱(chēng)為指標的數據,它涵蓋了頁(yè)面訪(fǎng)問(wèn)的關(guān)鍵價(jià)值。對應API的介紹頁(yè)面在這里。

頁(yè)面上有一個(gè)示例。假設需要獲取2015年10月愛(ài)因斯坦入口頁(yè)面的訪(fǎng)問(wèn)次數,可以這樣調用:
GET http://wikimedia.org/api/rest_ ... %3Bbr style="box-sizing:border-box;margin:0px;padding:0px;" />
我們可以在瀏覽器的地址欄中輸入GET后的一長(cháng)串URL,然后回車(chē)看看我們得到了什么結果。

在瀏覽器中,我們看到了上圖中的一長(cháng)串文字。您可能想知道 - 這是什么?
恭喜,這是我們需要得到的數據。但是,它使用一種稱(chēng)為 JSON 的特殊數據格式。
JSON是互聯(lián)網(wǎng)上數據交互的主流格式之一。如果你想了解 JSON 的含義和用法,可以參考這篇教程。
在瀏覽器中,我們最初只能看到數據的第一部分。但它已經(jīng)收錄了有價(jià)值的內容:
{"items":[{"project":"en.wikipedia","article":"Albert_Einstein","granularity":"daily","timestamp":"2015100100","access":"all-access","agent":"all-agents","views":18860}<br style="box-sizing:border-box;margin:0px;padding:0px;" />
在本段中,我們看到項目名稱(chēng)(en.wikipedia)、文章 標題(Albert Einstein)、統計粒度(天)、時(shí)間戳(10/1/2015)、訪(fǎng)問(wèn)類(lèi)型(全部)、終端類(lèi)型(全部) 和訪(fǎng)問(wèn)次數 (18860).
我們使用滑塊將返回的文本拖到最后,我們會(huì )看到如下信息:
{"project":"en.wikipedia","article":"Albert_Einstein","granularity":"daily","timestamp":"2015103100","access":"all-access","agent":"all-agents","views":16380}]}<br style="box-sizing:border-box;margin:0px;padding:0px;" />
與 10 月 1 日的數據相比,只有時(shí)間戳(2015 年 10 月 31 日)和訪(fǎng)問(wèn)次數(16380))發(fā)生了變化。
在中間,我們跳過(guò)了 10 月 2 日至 10 月 30 日之間的數據。存儲格式相同,只是日期和訪(fǎng)問(wèn)次數的數據值在變化。
您需要的所有數據都在這里,您只需提取相應的信息即可。但是如果手動(dòng)進(jìn)行(比如將需要的項目復制粘貼到Excel中),顯然效率低下,容易出錯。讓我們展示如何使用 R 編程環(huán)境自動(dòng)化這個(gè)過(guò)程。
準備
在正式用 R 調用 API 之前,我們需要做一些必要的準備工作。
首先是安裝R。
請到本網(wǎng)站下載R基礎安裝包。

R的下載位置比較多,建議選擇清華鏡像,下載速度比較快。

請根據您的操作系統平臺選擇對應的版本進(jìn)行下載。我正在使用 macOS 版本。
下載 pkg 文件。雙擊安裝。
安裝完基礎包后,我們繼續安裝集成開(kāi)發(fā)環(huán)境RStudio。它可以幫助您輕松和交互式地與 R 進(jìn)行交流。RStudio的下載地址在這里。

根據你的操作系統,選擇對應的安裝包。macOS 安裝包是一個(gè) dmg 文件。雙擊打開(kāi)后,將RStudio.app圖標拖到Applications文件夾下,安裝完成。

下面我們雙擊從應用程序目錄運行RStudio。

我們先在 RStudio 的 Console 中運行以下語(yǔ)句來(lái)安裝一些需要的包:
install.packages("tidyverse")<br style="box-sizing:border-box;margin:0px;padding:0px;" />install.packages("rlist")<br style="box-sizing:border-box;margin:0px;padding:0px;" />
安裝完成后,在菜單中選擇File->New,在如下界面中選擇R Notebook。

R Notebook 默認為我們提供了一個(gè)帶有一些基本使用說(shuō)明的模板。

讓我們嘗試在編輯區域(左)的代碼部分(灰色)中單擊運行按鈕。

情節的結果可以立即看到。
我們點(diǎn)擊菜單欄上的Preview按鈕來(lái)查看整個(gè)代碼的效果。操作的結果將以帶有圖片和文本的 HTML 文件的形式顯示。

現在我們已經(jīng)熟悉了環(huán)境,是時(shí)候實(shí)際運行我們的代碼了。我們把編輯區的開(kāi)頭描述區保留在左邊,刪除其余的,把文件名改成有意義的web-data-api-with-R。

至此,準備工作就緒?,F在我們要開(kāi)始實(shí)際操作了。
操作
在實(shí)際操作過(guò)程中,我們以維基百科的另一個(gè)wiki文章為例來(lái)證明這種操作方法的通用性。選中的文章就是我們介紹詞云制作時(shí)使用的那個(gè),叫做“Yes, Minisiter”。這是一部 1980 年代的英國喜劇。

我們先在瀏覽器中試一下,看看能否修改 API 示例中的參數,獲取“是,部長(cháng)”文章 的訪(fǎng)問(wèn)統計信息。作為測試,我們僅采集 2017 年 10 月 1 日至 2017 年 10 月 3 日 3 天的數據。
與示例相反,我們需要替換的內容包括開(kāi)始和結束時(shí)間以及 文章 標題。
我們在瀏覽器的地址欄中輸入:
https://wikimedia.org/api/rest ... %3Bbr style="box-sizing:border-box;margin:0px;padding:0px;" />
返回結果如下:

數據可以正常返回。接下來(lái),我們使用語(yǔ)句方法在 RStudio 中調用。
請注意,在下面的代碼中,程序的輸出部分會(huì )在開(kāi)頭帶有## 標記,以區別于執行代碼本身。
啟動(dòng)后,我們需要設置時(shí)區。否則,您稍后在處理時(shí)間數據時(shí)會(huì )遇到錯誤。
Sys.setenv(TZ="Asia/Shanghai")<br style="box-sizing:border-box;margin:0px;padding:0px;" />
然后,我們調用 tidyverse 包,它是一個(gè)可以同時(shí)加載許多函數的集合,我們稍后會(huì )用到。
library(tidyverse)<br style="box-sizing:border-box;margin:0px;padding:0px;" /><br style="box-sizing:border-box;margin:0px;padding:0px;" />## Loading tidyverse: ggplot2<br style="box-sizing:border-box;margin:0px;padding:0px;" />## Loading tidyverse: tibble<br style="box-sizing:border-box;margin:0px;padding:0px;" />## Loading tidyverse: tidyr<br style="box-sizing:border-box;margin:0px;padding:0px;" />## Loading tidyverse: readr<br style="box-sizing:border-box;margin:0px;padding:0px;" />## Loading tidyverse: purrr<br style="box-sizing:border-box;margin:0px;padding:0px;" />## Loading tidyverse: dplyr<br style="box-sizing:border-box;margin:0px;padding:0px;" /><br style="box-sizing:border-box;margin:0px;padding:0px;" />## Conflicts with tidy packages ----------------------------------------------<br style="box-sizing:border-box;margin:0px;padding:0px;" /><br style="box-sizing:border-box;margin:0px;padding:0px;" />## filter(): dplyr, stats<br style="box-sizing:border-box;margin:0px;padding:0px;" />## lag(): ? ?dplyr, stats<br style="box-sizing:border-box;margin:0px;padding:0px;" />
這里可能有一些警告,請忽略它們。它對我們的運營(yíng)沒(méi)有影響。
根據前面的例子,我們定義要查詢(xún)的時(shí)間跨度,并指定要查找的wiki文章的名稱(chēng)。
請注意,與 Python 不同,在 R 中,賦值采用標記,而不是 =。不過(guò),R 語(yǔ)言其實(shí)很容易上手。如果你堅持使用=,它也能識別,不會(huì )報錯。
<p>starting
文章采集api(在之前的文章中Python實(shí)現“維基百科六度分隔理論”)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 134 次瀏覽 ? 2022-02-24 21:13
在之前的文章 Python實(shí)現“維基百科六度分離理論”基礎爬蟲(chóng)中,我們實(shí)現了一個(gè)網(wǎng)站隨機從一個(gè)鏈接到另一個(gè)鏈接,但是如果我們需要系統對整個(gè)< @網(wǎng)站 分類(lèi),或者要搜索 網(wǎng)站 上的每一頁(yè),我們該怎么辦?我們需要采集整個(gè)網(wǎng)站,但這是一個(gè)非常占用內存的過(guò)程,尤其是在處理大的網(wǎng)站時(shí),更合適的工具是使用數據庫來(lái)存儲< @k11 資源為@>,之前也說(shuō)過(guò)。這是如何做到的。網(wǎng)站地圖站點(diǎn)地圖網(wǎng)站地圖,也稱(chēng)為站點(diǎn)地圖,是一個(gè)頁(yè)面,上面放置了網(wǎng)站上所有需要被搜索引擎抓取的頁(yè)面(注:不是所有頁(yè)面,所有 文章 鏈接。大多數人在 網(wǎng)站 上找不到所需信息時(shí),可能會(huì )求助于 網(wǎng)站 地圖。搜索引擎蜘蛛我非常喜歡 網(wǎng)站maps。對于 SEO,網(wǎng)站maps 的好處: 1. 為搜索引擎蜘蛛提供可以瀏覽整個(gè) 網(wǎng)站 的鏈接,簡(jiǎn)單地反映 網(wǎng)站 的整體框架 2. 為搜索引擎提供一些鏈接蜘蛛指向動(dòng)態(tài)頁(yè)面或其他方法更難訪(fǎng)問(wèn)的頁(yè)面;3、作為潛在的落地頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。當他們在 網(wǎng)站 上找不到他們需要的信息時(shí),地圖作為一種補救措施。搜索引擎蜘蛛我非常喜歡 網(wǎng)站maps。對于 SEO,網(wǎng)站maps 的好處: 1. 為搜索引擎蜘蛛提供可以瀏覽整個(gè) 網(wǎng)站 的鏈接,簡(jiǎn)單地反映 網(wǎng)站 的整體框架 2. 為搜索引擎提供一些鏈接蜘蛛指向動(dòng)態(tài)頁(yè)面或其他方法更難訪(fǎng)問(wèn)的頁(yè)面;3、作為潛在的落地頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。當他們在 網(wǎng)站 上找不到他們需要的信息時(shí),地圖作為一種補救措施。搜索引擎蜘蛛我非常喜歡 網(wǎng)站maps。對于 SEO,網(wǎng)站maps 的好處: 1. 為搜索引擎蜘蛛提供可以瀏覽整個(gè) 網(wǎng)站 的鏈接,簡(jiǎn)單地反映 網(wǎng)站 的整體框架 2. 為搜索引擎提供一些鏈接蜘蛛指向動(dòng)態(tài)頁(yè)面或其他方法更難訪(fǎng)問(wèn)的頁(yè)面;3、作為潛在的落地頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。@網(wǎng)站。搜索引擎蜘蛛我非常喜歡 網(wǎng)站maps。對于 SEO,網(wǎng)站maps 的好處: 1. 為搜索引擎蜘蛛提供可以瀏覽整個(gè) 網(wǎng)站 的鏈接,簡(jiǎn)單地反映 網(wǎng)站 的整體框架 2. 為搜索引擎提供一些鏈接蜘蛛指向動(dòng)態(tài)頁(yè)面或其他方法更難訪(fǎng)問(wèn)的頁(yè)面;3、作為潛在的落地頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。@網(wǎng)站。搜索引擎蜘蛛我非常喜歡 網(wǎng)站maps。對于 SEO,網(wǎng)站maps 的好處: 1. 為搜索引擎蜘蛛提供可以瀏覽整個(gè) 網(wǎng)站 的鏈接,簡(jiǎn)單地反映 網(wǎng)站 的整體框架 2. 為搜索引擎提供一些鏈接蜘蛛指向動(dòng)態(tài)頁(yè)面或其他方法更難訪(fǎng)問(wèn)的頁(yè)面;3、作為潛在的落地頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。為搜索引擎蜘蛛提供可以瀏覽整個(gè)網(wǎng)站的鏈接,簡(jiǎn)單反映網(wǎng)站的整體框架 2. 為搜索引擎蜘蛛提供一些鏈接,指向動(dòng)態(tài)頁(yè)面或更難到達的頁(yè)面其他方法;3、作為潛在的落地頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。為搜索引擎蜘蛛提供可以瀏覽整個(gè)網(wǎng)站的鏈接,簡(jiǎn)單反映網(wǎng)站的整體框架 2. 為搜索引擎蜘蛛提供一些鏈接,指向動(dòng)態(tài)頁(yè)面或更難到達的頁(yè)面其他方法;3、作為潛在的落地頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。作為一個(gè)潛在的著(zhù)陸頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。作為一個(gè)潛在的著(zhù)陸頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。
數據采集采集網(wǎng)站數據不難,但需要爬蟲(chóng)有足夠的深度。我們創(chuàng )建了一個(gè)爬蟲(chóng),它遞歸地遍歷每個(gè) 網(wǎng)站 并且只采集那些 網(wǎng)站 頁(yè)面上的數據。通常耗時(shí)的 網(wǎng)站采集 方法從頂層頁(yè)面(通常是 網(wǎng)站 主頁(yè))開(kāi)始,然后搜索頁(yè)面上的所有鏈接,形成一個(gè)列表,然后去到采集到這些鏈接的頁(yè)面,繼續采集到每個(gè)頁(yè)面的鏈接形成一個(gè)新列表,重復執行。顯然,這是一個(gè)復雜性迅速增長(cháng)的過(guò)程。每頁(yè)添加 10 個(gè)鏈接,在 網(wǎng)站 上添加 5 個(gè)頁(yè)面深度。如果采集 整個(gè)網(wǎng)站,則采集 頁(yè)的總數為105,即100,000 頁(yè)。因為很多網(wǎng)站的內部鏈接都是重復的,為了避免重復的采集,需要鏈接和去重。在 Python 中,最常用的去重方法是使用內置的集合采集方法。只有“新”鏈接是 采集??匆幌麓a示例: from urllib.request import urlopenfrom bs4 import BeautifulSoup import repages = set()def getLinks(pageurl):globalpageshtml= urlopen("" + pageurl)soup= BeautifulSoup(html)forlink in soup.findAll( "a", href=pile("^(/wiki/)")):if'href' in link.attrs:iflink.attrs['href'] not in pages:#這是一個(gè)新頁(yè)面 newPage= 鏈接。屬性[' @采集??匆幌麓a示例: from urllib.request import urlopenfrom bs4 import BeautifulSoup import repages = set()def getLinks(pageurl):globalpageshtml= urlopen("" + pageurl)soup= BeautifulSoup(html)forlink in soup.findAll( "a", href=pile("^(/wiki/)")):if'href' in link.attrs:iflink.attrs['href'] not in pages:#這是一個(gè)新頁(yè)面 newPage= 鏈接。屬性[' @采集??匆幌麓a示例: from urllib.request import urlopenfrom bs4 import BeautifulSoup import repages = set()def getLinks(pageurl):globalpageshtml= urlopen("" + pageurl)soup= BeautifulSoup(html)forlink in soup.findAll( "a", href=pile("^(/wiki/)")):if'href' in link.attrs:iflink.attrs['href'] not in pages:#這是一個(gè)新頁(yè)面 newPage= 鏈接。屬性['
遞歸警告:Python 的默認遞歸*為 1000 次,因為維基百科的鏈接太多,所以程序在達到遞歸*時(shí)停止。如果你不想讓它停止,你可以設置一個(gè)遞歸計數器或其他東西。采集整個(gè)網(wǎng)站數據為了有效地使用爬蟲(chóng),我們在使用爬蟲(chóng)時(shí)需要在頁(yè)面上做一些事情。讓我們創(chuàng )建一個(gè)爬蟲(chóng)來(lái)采集有關(guān)頁(yè)面標題、正文第一段和編輯頁(yè)面的鏈接(如果有的話(huà))的信息。第一步,我們需要在網(wǎng)站上觀(guān)察頁(yè)面,然后制定采集模式,通過(guò)F12(一般情況下)檢查元素,就可以看到頁(yè)面的構成了。查看維基百科頁(yè)面,包括入口和非入口頁(yè)面,例如隱私政策頁(yè)面,可以得出以下規則:所有標題都在h1→span標簽中,頁(yè)面上只有一個(gè)h1標簽。所有正文都在 div#bodyContent 標記中。如果要獲取第一段文字,可以使用div#mw-content-text→p。此規則適用于除文件頁(yè)面之外的所有頁(yè)面。編輯鏈接僅出現在入口頁(yè)面上。如果有編輯鏈接,則位于li#ca-edit標簽的li#ca-edit→span→a中。調整前面的代碼,我們可以構建一個(gè)爬蟲(chóng)和數據的組合程序采集,代碼如下: import redef getLinks(pageUrl):global pageshtml = urlopen("" + pageUrl)soup = BeautifulSoup(html)嘗試: print(soup.h1.get_text())print(soup.find(id="mw-content-text").findAll("p")[0])print(soup.find(id =" ca-edit").find("span").find("a").attrs['href' 并且頁(yè)面上只有一個(gè) h1 標簽。所有正文都在 div#bodyContent 標記中。如果要獲取第一段文字,可以使用div#mw-content-text→p。此規則適用于除文件頁(yè)面之外的所有頁(yè)面。編輯鏈接僅出現在入口頁(yè)面上。如果有編輯鏈接,則位于li#ca-edit標簽的li#ca-edit→span→a中。調整前面的代碼,我們可以構建一個(gè)爬蟲(chóng)和數據的組合程序采集,代碼如下: import redef getLinks(pageUrl):global pageshtml = urlopen("" + pageUrl)soup = BeautifulSoup(html)嘗試: print(soup.h1.get_text())print(soup.find(id="mw-content-text").findAll("p")[0])print(soup.find(id =" ca-edit").find("span").find("a").attrs['href' 并且頁(yè)面上只有一個(gè) h1 標簽。所有正文都在 div#bodyContent 標記中。如果要獲取第一段文字,可以使用div#mw-content-text→p。此規則適用于除文件頁(yè)面之外的所有頁(yè)面。編輯鏈接僅出現在入口頁(yè)面上。如果有編輯鏈接,則位于li#ca-edit標簽的li#ca-edit→span→a中。調整前面的代碼,我們可以構建一個(gè)爬蟲(chóng)和數據的組合程序采集,代碼如下: import redef getLinks(pageUrl):global pageshtml = urlopen("" + pageUrl)soup = BeautifulSoup(html)嘗試: print(soup.h1.get_text())print(soup.find(id="mw-content-text").findAll("p")[0])print(soup.find(id =" ca-edit").find("span").find("a").attrs['href' 所有正文都在 div#bodyContent 標記中。如果要獲取第一段文字,可以使用div#mw-content-text→p。此規則適用于除文件頁(yè)面之外的所有頁(yè)面。編輯鏈接僅出現在入口頁(yè)面上。如果有編輯鏈接,則位于li#ca-edit標簽的li#ca-edit→span→a中。調整前面的代碼,我們可以構建一個(gè)爬蟲(chóng)和數據的組合程序采集,代碼如下: import redef getLinks(pageUrl):global pageshtml = urlopen("" + pageUrl)soup = BeautifulSoup(html)嘗試: print(soup.h1.get_text())print(soup.find(id="mw-content-text").findAll("p")[0])print(soup.find(id =" ca-edit").find("span").find("a").attrs['href' 所有正文都在 div#bodyContent 標記中。如果要獲取第一段文字,可以使用div#mw-content-text→p。此規則適用于除文件頁(yè)面之外的所有頁(yè)面。編輯鏈接僅出現在入口頁(yè)面上。如果有編輯鏈接,則位于li#ca-edit標簽的li#ca-edit→span→a中。調整前面的代碼,我們可以構建一個(gè)爬蟲(chóng)和數據的組合程序采集,代碼如下: import redef getLinks(pageUrl):global pageshtml = urlopen("" + pageUrl)soup = BeautifulSoup(html)嘗試: print(soup.h1.get_text())print(soup.find(id="mw-content-text").findAll("p")[0])print(soup.find(id =" ca-edit").find("span").find("a").attrs['href' 此規則適用于除文件頁(yè)面之外的所有頁(yè)面。編輯鏈接僅出現在入口頁(yè)面上。如果有編輯鏈接,則位于li#ca-edit標簽的li#ca-edit→span→a中。調整前面的代碼,我們可以構建一個(gè)爬蟲(chóng)和數據的組合程序采集,代碼如下: import redef getLinks(pageUrl):global pageshtml = urlopen("" + pageUrl)soup = BeautifulSoup(html)嘗試: print(soup.h1.get_text())print(soup.find(id="mw-content-text").findAll("p")[0])print(soup.find(id =" ca-edit").find("span").find("a").attrs['href' 此規則適用于除文件頁(yè)面之外的所有頁(yè)面。編輯鏈接僅出現在入口頁(yè)面上。如果有編輯鏈接,則位于li#ca-edit標簽的li#ca-edit→span→a中。調整前面的代碼,我們可以構建一個(gè)爬蟲(chóng)和數據的組合程序采集,代碼如下: import redef getLinks(pageUrl):global pageshtml = urlopen("" + pageUrl)soup = BeautifulSoup(html)嘗試: print(soup.h1.get_text())print(soup.find(id="mw-content-text").findAll("p")[0])print(soup.find(id =" ca-edit").find("span").find("a").attrs['href'
<p>在數據存儲到 MySQL 之前,數據已經(jīng)被獲取。直接打印出來(lái)比較麻煩,所以我們可以直接存入MySQL。這里只存儲鏈接是沒(méi)有意義的,所以我們存儲頁(yè)面的標題和內容。我之前有兩篇文章 文章 介紹了如何在 MySQL 中存儲數據。數據表為pages,代碼如下: import reimport datetimeimport randomimport pymysqlconn = pymysql.connect(host = '127.< @0. 查看全部
文章采集api(在之前的文章中Python實(shí)現“維基百科六度分隔理論”)
在之前的文章 Python實(shí)現“維基百科六度分離理論”基礎爬蟲(chóng)中,我們實(shí)現了一個(gè)網(wǎng)站隨機從一個(gè)鏈接到另一個(gè)鏈接,但是如果我們需要系統對整個(gè)< @網(wǎng)站 分類(lèi),或者要搜索 網(wǎng)站 上的每一頁(yè),我們該怎么辦?我們需要采集整個(gè)網(wǎng)站,但這是一個(gè)非常占用內存的過(guò)程,尤其是在處理大的網(wǎng)站時(shí),更合適的工具是使用數據庫來(lái)存儲< @k11 資源為@>,之前也說(shuō)過(guò)。這是如何做到的。網(wǎng)站地圖站點(diǎn)地圖網(wǎng)站地圖,也稱(chēng)為站點(diǎn)地圖,是一個(gè)頁(yè)面,上面放置了網(wǎng)站上所有需要被搜索引擎抓取的頁(yè)面(注:不是所有頁(yè)面,所有 文章 鏈接。大多數人在 網(wǎng)站 上找不到所需信息時(shí),可能會(huì )求助于 網(wǎng)站 地圖。搜索引擎蜘蛛我非常喜歡 網(wǎng)站maps。對于 SEO,網(wǎng)站maps 的好處: 1. 為搜索引擎蜘蛛提供可以瀏覽整個(gè) 網(wǎng)站 的鏈接,簡(jiǎn)單地反映 網(wǎng)站 的整體框架 2. 為搜索引擎提供一些鏈接蜘蛛指向動(dòng)態(tài)頁(yè)面或其他方法更難訪(fǎng)問(wèn)的頁(yè)面;3、作為潛在的落地頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。當他們在 網(wǎng)站 上找不到他們需要的信息時(shí),地圖作為一種補救措施。搜索引擎蜘蛛我非常喜歡 網(wǎng)站maps。對于 SEO,網(wǎng)站maps 的好處: 1. 為搜索引擎蜘蛛提供可以瀏覽整個(gè) 網(wǎng)站 的鏈接,簡(jiǎn)單地反映 網(wǎng)站 的整體框架 2. 為搜索引擎提供一些鏈接蜘蛛指向動(dòng)態(tài)頁(yè)面或其他方法更難訪(fǎng)問(wèn)的頁(yè)面;3、作為潛在的落地頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。當他們在 網(wǎng)站 上找不到他們需要的信息時(shí),地圖作為一種補救措施。搜索引擎蜘蛛我非常喜歡 網(wǎng)站maps。對于 SEO,網(wǎng)站maps 的好處: 1. 為搜索引擎蜘蛛提供可以瀏覽整個(gè) 網(wǎng)站 的鏈接,簡(jiǎn)單地反映 網(wǎng)站 的整體框架 2. 為搜索引擎提供一些鏈接蜘蛛指向動(dòng)態(tài)頁(yè)面或其他方法更難訪(fǎng)問(wèn)的頁(yè)面;3、作為潛在的落地頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。@網(wǎng)站。搜索引擎蜘蛛我非常喜歡 網(wǎng)站maps。對于 SEO,網(wǎng)站maps 的好處: 1. 為搜索引擎蜘蛛提供可以瀏覽整個(gè) 網(wǎng)站 的鏈接,簡(jiǎn)單地反映 網(wǎng)站 的整體框架 2. 為搜索引擎提供一些鏈接蜘蛛指向動(dòng)態(tài)頁(yè)面或其他方法更難訪(fǎng)問(wèn)的頁(yè)面;3、作為潛在的落地頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。@網(wǎng)站。搜索引擎蜘蛛我非常喜歡 網(wǎng)站maps。對于 SEO,網(wǎng)站maps 的好處: 1. 為搜索引擎蜘蛛提供可以瀏覽整個(gè) 網(wǎng)站 的鏈接,簡(jiǎn)單地反映 網(wǎng)站 的整體框架 2. 為搜索引擎提供一些鏈接蜘蛛指向動(dòng)態(tài)頁(yè)面或其他方法更難訪(fǎng)問(wèn)的頁(yè)面;3、作為潛在的落地頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。為搜索引擎蜘蛛提供可以瀏覽整個(gè)網(wǎng)站的鏈接,簡(jiǎn)單反映網(wǎng)站的整體框架 2. 為搜索引擎蜘蛛提供一些鏈接,指向動(dòng)態(tài)頁(yè)面或更難到達的頁(yè)面其他方法;3、作為潛在的落地頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。為搜索引擎蜘蛛提供可以瀏覽整個(gè)網(wǎng)站的鏈接,簡(jiǎn)單反映網(wǎng)站的整體框架 2. 為搜索引擎蜘蛛提供一些鏈接,指向動(dòng)態(tài)頁(yè)面或更難到達的頁(yè)面其他方法;3、作為潛在的落地頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。作為一個(gè)潛在的著(zhù)陸頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。作為一個(gè)潛在的著(zhù)陸頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。
數據采集采集網(wǎng)站數據不難,但需要爬蟲(chóng)有足夠的深度。我們創(chuàng )建了一個(gè)爬蟲(chóng),它遞歸地遍歷每個(gè) 網(wǎng)站 并且只采集那些 網(wǎng)站 頁(yè)面上的數據。通常耗時(shí)的 網(wǎng)站采集 方法從頂層頁(yè)面(通常是 網(wǎng)站 主頁(yè))開(kāi)始,然后搜索頁(yè)面上的所有鏈接,形成一個(gè)列表,然后去到采集到這些鏈接的頁(yè)面,繼續采集到每個(gè)頁(yè)面的鏈接形成一個(gè)新列表,重復執行。顯然,這是一個(gè)復雜性迅速增長(cháng)的過(guò)程。每頁(yè)添加 10 個(gè)鏈接,在 網(wǎng)站 上添加 5 個(gè)頁(yè)面深度。如果采集 整個(gè)網(wǎng)站,則采集 頁(yè)的總數為105,即100,000 頁(yè)。因為很多網(wǎng)站的內部鏈接都是重復的,為了避免重復的采集,需要鏈接和去重。在 Python 中,最常用的去重方法是使用內置的集合采集方法。只有“新”鏈接是 采集??匆幌麓a示例: from urllib.request import urlopenfrom bs4 import BeautifulSoup import repages = set()def getLinks(pageurl):globalpageshtml= urlopen("" + pageurl)soup= BeautifulSoup(html)forlink in soup.findAll( "a", href=pile("^(/wiki/)")):if'href' in link.attrs:iflink.attrs['href'] not in pages:#這是一個(gè)新頁(yè)面 newPage= 鏈接。屬性[' @采集??匆幌麓a示例: from urllib.request import urlopenfrom bs4 import BeautifulSoup import repages = set()def getLinks(pageurl):globalpageshtml= urlopen("" + pageurl)soup= BeautifulSoup(html)forlink in soup.findAll( "a", href=pile("^(/wiki/)")):if'href' in link.attrs:iflink.attrs['href'] not in pages:#這是一個(gè)新頁(yè)面 newPage= 鏈接。屬性[' @采集??匆幌麓a示例: from urllib.request import urlopenfrom bs4 import BeautifulSoup import repages = set()def getLinks(pageurl):globalpageshtml= urlopen("" + pageurl)soup= BeautifulSoup(html)forlink in soup.findAll( "a", href=pile("^(/wiki/)")):if'href' in link.attrs:iflink.attrs['href'] not in pages:#這是一個(gè)新頁(yè)面 newPage= 鏈接。屬性['
遞歸警告:Python 的默認遞歸*為 1000 次,因為維基百科的鏈接太多,所以程序在達到遞歸*時(shí)停止。如果你不想讓它停止,你可以設置一個(gè)遞歸計數器或其他東西。采集整個(gè)網(wǎng)站數據為了有效地使用爬蟲(chóng),我們在使用爬蟲(chóng)時(shí)需要在頁(yè)面上做一些事情。讓我們創(chuàng )建一個(gè)爬蟲(chóng)來(lái)采集有關(guān)頁(yè)面標題、正文第一段和編輯頁(yè)面的鏈接(如果有的話(huà))的信息。第一步,我們需要在網(wǎng)站上觀(guān)察頁(yè)面,然后制定采集模式,通過(guò)F12(一般情況下)檢查元素,就可以看到頁(yè)面的構成了。查看維基百科頁(yè)面,包括入口和非入口頁(yè)面,例如隱私政策頁(yè)面,可以得出以下規則:所有標題都在h1→span標簽中,頁(yè)面上只有一個(gè)h1標簽。所有正文都在 div#bodyContent 標記中。如果要獲取第一段文字,可以使用div#mw-content-text→p。此規則適用于除文件頁(yè)面之外的所有頁(yè)面。編輯鏈接僅出現在入口頁(yè)面上。如果有編輯鏈接,則位于li#ca-edit標簽的li#ca-edit→span→a中。調整前面的代碼,我們可以構建一個(gè)爬蟲(chóng)和數據的組合程序采集,代碼如下: import redef getLinks(pageUrl):global pageshtml = urlopen("" + pageUrl)soup = BeautifulSoup(html)嘗試: print(soup.h1.get_text())print(soup.find(id="mw-content-text").findAll("p")[0])print(soup.find(id =" ca-edit").find("span").find("a").attrs['href' 并且頁(yè)面上只有一個(gè) h1 標簽。所有正文都在 div#bodyContent 標記中。如果要獲取第一段文字,可以使用div#mw-content-text→p。此規則適用于除文件頁(yè)面之外的所有頁(yè)面。編輯鏈接僅出現在入口頁(yè)面上。如果有編輯鏈接,則位于li#ca-edit標簽的li#ca-edit→span→a中。調整前面的代碼,我們可以構建一個(gè)爬蟲(chóng)和數據的組合程序采集,代碼如下: import redef getLinks(pageUrl):global pageshtml = urlopen("" + pageUrl)soup = BeautifulSoup(html)嘗試: print(soup.h1.get_text())print(soup.find(id="mw-content-text").findAll("p")[0])print(soup.find(id =" ca-edit").find("span").find("a").attrs['href' 并且頁(yè)面上只有一個(gè) h1 標簽。所有正文都在 div#bodyContent 標記中。如果要獲取第一段文字,可以使用div#mw-content-text→p。此規則適用于除文件頁(yè)面之外的所有頁(yè)面。編輯鏈接僅出現在入口頁(yè)面上。如果有編輯鏈接,則位于li#ca-edit標簽的li#ca-edit→span→a中。調整前面的代碼,我們可以構建一個(gè)爬蟲(chóng)和數據的組合程序采集,代碼如下: import redef getLinks(pageUrl):global pageshtml = urlopen("" + pageUrl)soup = BeautifulSoup(html)嘗試: print(soup.h1.get_text())print(soup.find(id="mw-content-text").findAll("p")[0])print(soup.find(id =" ca-edit").find("span").find("a").attrs['href' 所有正文都在 div#bodyContent 標記中。如果要獲取第一段文字,可以使用div#mw-content-text→p。此規則適用于除文件頁(yè)面之外的所有頁(yè)面。編輯鏈接僅出現在入口頁(yè)面上。如果有編輯鏈接,則位于li#ca-edit標簽的li#ca-edit→span→a中。調整前面的代碼,我們可以構建一個(gè)爬蟲(chóng)和數據的組合程序采集,代碼如下: import redef getLinks(pageUrl):global pageshtml = urlopen("" + pageUrl)soup = BeautifulSoup(html)嘗試: print(soup.h1.get_text())print(soup.find(id="mw-content-text").findAll("p")[0])print(soup.find(id =" ca-edit").find("span").find("a").attrs['href' 所有正文都在 div#bodyContent 標記中。如果要獲取第一段文字,可以使用div#mw-content-text→p。此規則適用于除文件頁(yè)面之外的所有頁(yè)面。編輯鏈接僅出現在入口頁(yè)面上。如果有編輯鏈接,則位于li#ca-edit標簽的li#ca-edit→span→a中。調整前面的代碼,我們可以構建一個(gè)爬蟲(chóng)和數據的組合程序采集,代碼如下: import redef getLinks(pageUrl):global pageshtml = urlopen("" + pageUrl)soup = BeautifulSoup(html)嘗試: print(soup.h1.get_text())print(soup.find(id="mw-content-text").findAll("p")[0])print(soup.find(id =" ca-edit").find("span").find("a").attrs['href' 此規則適用于除文件頁(yè)面之外的所有頁(yè)面。編輯鏈接僅出現在入口頁(yè)面上。如果有編輯鏈接,則位于li#ca-edit標簽的li#ca-edit→span→a中。調整前面的代碼,我們可以構建一個(gè)爬蟲(chóng)和數據的組合程序采集,代碼如下: import redef getLinks(pageUrl):global pageshtml = urlopen("" + pageUrl)soup = BeautifulSoup(html)嘗試: print(soup.h1.get_text())print(soup.find(id="mw-content-text").findAll("p")[0])print(soup.find(id =" ca-edit").find("span").find("a").attrs['href' 此規則適用于除文件頁(yè)面之外的所有頁(yè)面。編輯鏈接僅出現在入口頁(yè)面上。如果有編輯鏈接,則位于li#ca-edit標簽的li#ca-edit→span→a中。調整前面的代碼,我們可以構建一個(gè)爬蟲(chóng)和數據的組合程序采集,代碼如下: import redef getLinks(pageUrl):global pageshtml = urlopen("" + pageUrl)soup = BeautifulSoup(html)嘗試: print(soup.h1.get_text())print(soup.find(id="mw-content-text").findAll("p")[0])print(soup.find(id =" ca-edit").find("span").find("a").attrs['href'
<p>在數據存儲到 MySQL 之前,數據已經(jīng)被獲取。直接打印出來(lái)比較麻煩,所以我們可以直接存入MySQL。這里只存儲鏈接是沒(méi)有意義的,所以我們存儲頁(yè)面的標題和內容。我之前有兩篇文章 文章 介紹了如何在 MySQL 中存儲數據。數據表為pages,代碼如下: import reimport datetimeimport randomimport pymysqlconn = pymysql.connect(host = '127.< @0.
文章采集api(大數據搜集體系有哪些分類(lèi)?搜集日志數據分類(lèi))
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 136 次瀏覽 ? 2022-02-24 21:11
【摘要】大數據采集技術(shù)對數據進(jìn)行ETL運算,提取、轉換、加載數據,最終挖掘數據的潛在價(jià)值,進(jìn)而為用戶(hù)提供解決方案或決策參考。那么,大數據采集系統的分類(lèi)有哪些呢?今天就和小編一起來(lái)了解一下吧!
1、系統日志采集系統
采集和采集日志數據信息,然后進(jìn)行數據分析,挖掘日志數據在公司交易渠道中的潛在價(jià)值??傊?,采集日志數據提供了離線(xiàn)和在線(xiàn)的實(shí)時(shí)分析應用。目前常用的開(kāi)源日志采集系統是 Flume。
2、網(wǎng)絡(luò )數據采集系統
通過(guò)網(wǎng)絡(luò )爬蟲(chóng)和一些網(wǎng)站渠道提供的公共API(如推特和新浪微博API)從網(wǎng)站獲取數據。它可以從網(wǎng)頁(yè)中提取非結構化數據和半結構化數據的網(wǎng)頁(yè)數據,提取、清洗并轉換為結構化數據,并存儲為一致的本地文件數據。
目前常用的網(wǎng)絡(luò )爬蟲(chóng)系統包括Apache Nutch、Crawler4j、Scrapy等結構。
3、數據庫采集系統
數據庫采集系統直接與企業(yè)事務(wù)后臺服務(wù)器結合后,在企業(yè)事務(wù)后臺每時(shí)每刻都將大量事務(wù)記錄寫(xiě)入數據庫,最終由特定的處理系統對系統進(jìn)行分析。
目前,存儲數據常用MySQL、Oracle等關(guān)系型數據庫,采集數據也常用Redis、MongoDB等NoSQL數據庫。
關(guān)于大數據采集系統的分類(lèi),青騰小編就在這里跟大家分享一下。如果你對大數據工程有濃厚的興趣,希望這篇文章可以幫助到你。如果想了解更多數據分析師和大數據工程師的技能和資料,可以點(diǎn)擊本站其他文章進(jìn)行學(xué)習。 查看全部
文章采集api(大數據搜集體系有哪些分類(lèi)?搜集日志數據分類(lèi))
【摘要】大數據采集技術(shù)對數據進(jìn)行ETL運算,提取、轉換、加載數據,最終挖掘數據的潛在價(jià)值,進(jìn)而為用戶(hù)提供解決方案或決策參考。那么,大數據采集系統的分類(lèi)有哪些呢?今天就和小編一起來(lái)了解一下吧!

1、系統日志采集系統
采集和采集日志數據信息,然后進(jìn)行數據分析,挖掘日志數據在公司交易渠道中的潛在價(jià)值??傊?,采集日志數據提供了離線(xiàn)和在線(xiàn)的實(shí)時(shí)分析應用。目前常用的開(kāi)源日志采集系統是 Flume。
2、網(wǎng)絡(luò )數據采集系統
通過(guò)網(wǎng)絡(luò )爬蟲(chóng)和一些網(wǎng)站渠道提供的公共API(如推特和新浪微博API)從網(wǎng)站獲取數據。它可以從網(wǎng)頁(yè)中提取非結構化數據和半結構化數據的網(wǎng)頁(yè)數據,提取、清洗并轉換為結構化數據,并存儲為一致的本地文件數據。
目前常用的網(wǎng)絡(luò )爬蟲(chóng)系統包括Apache Nutch、Crawler4j、Scrapy等結構。
3、數據庫采集系統
數據庫采集系統直接與企業(yè)事務(wù)后臺服務(wù)器結合后,在企業(yè)事務(wù)后臺每時(shí)每刻都將大量事務(wù)記錄寫(xiě)入數據庫,最終由特定的處理系統對系統進(jìn)行分析。
目前,存儲數據常用MySQL、Oracle等關(guān)系型數據庫,采集數據也常用Redis、MongoDB等NoSQL數據庫。
關(guān)于大數據采集系統的分類(lèi),青騰小編就在這里跟大家分享一下。如果你對大數據工程有濃厚的興趣,希望這篇文章可以幫助到你。如果想了解更多數據分析師和大數據工程師的技能和資料,可以點(diǎn)擊本站其他文章進(jìn)行學(xué)習。
文章采集api(Scrapy一個(gè) )
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 152 次瀏覽 ? 2022-02-23 07:17
)
內容
架構介紹
Scrapy 是一個(gè)開(kāi)源和協(xié)作框架,最初是為頁(yè)面抓?。ǜ鼫蚀_地說(shuō)是網(wǎng)頁(yè)抓?。┒O計的,它允許您以快速、簡(jiǎn)單和可擴展的方式從所需數據中提取所有信息。但目前,Scrapy 的用途非常廣泛,例如數據挖掘、監控和自動(dòng)化測試,也可以用來(lái)獲取 API(例如 Amazon Associates Web Services)或一般網(wǎng)絡(luò )爬蟲(chóng)返回的數據。
Scrapy 是基于 twisted 框架開(kāi)發(fā)的,這是一個(gè)流行的事件驅動(dòng)的 Python 網(wǎng)絡(luò )框架。所以 Scrapy 使用非阻塞(又名異步)代碼來(lái)實(shí)現并發(fā)。整體結構大致如下
IO多路復用
# 引擎(EGINE)(大總管)
引擎負責控制系統所有組件之間的數據流,并在某些動(dòng)作發(fā)生時(shí)觸發(fā)事件。有關(guān)詳細信息,請參見(jiàn)上面的數據流部分。
# 調度器(SCHEDULER)
用來(lái)接受引擎發(fā)過(guò)來(lái)的請求, 壓入隊列中, 并在引擎再次請求的時(shí)候返回. 可以想像成一個(gè)URL的優(yōu)先級隊列, 由它來(lái)決定下一個(gè)要抓取的網(wǎng)址是什么, 同時(shí)去除重復的網(wǎng)址
# 下載器(DOWLOADER)
用于下載網(wǎng)頁(yè)內容, 并將網(wǎng)頁(yè)內容返回給EGINE,下載器是建立在twisted這個(gè)高效的異步模型上的
# 爬蟲(chóng)(SPIDERS)
SPIDERS是開(kāi)發(fā)人員自定義的類(lèi),用來(lái)解析responses,并且提取items,或者發(fā)送新的請求
# 項目管道(ITEM PIPLINES)
在items被提取后負責處理它們,主要包括清理、驗證、持久化(比如存到數據庫)等操作
# 兩個(gè)中間件
-爬蟲(chóng)中間件
-下載中間件(用的最多,加頭,加代理,加cookie,集成selenium)
安裝創(chuàng )建和啟動(dòng)
# 1 框架 不是 模塊
# 2 號稱(chēng)爬蟲(chóng)界的django(你會(huì )發(fā)現,跟django很多地方一樣)
# 3 安裝
-mac,linux平臺:pip3 install scrapy
-windows平臺:pip3 install scrapy(大部分人可以)
- 如果失?。?br /> 1、pip3 install wheel #安裝后,便支持通過(guò)wheel文件安裝軟件,wheel文件官網(wǎng):https://www.lfd.uci.edu/~gohlke/pythonlibs
3、pip3 install lxml
4、pip3 install pyopenssl
5、下載并安裝pywin32:https://sourceforge.net/projec ... in32/
6、下載twisted的wheel文件:http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
7、執行pip3 install 下載目錄\Twisted-17.9.0-cp36-cp36m-win_amd64.whl
8、pip3 install scrapy
# 4 在script文件夾下會(huì )有scrapy.exe可執行文件
-創(chuàng )建scrapy項目:scrapy startproject 項目名 (django創(chuàng )建項目)
-創(chuàng )建爬蟲(chóng):scrapy genspider 爬蟲(chóng)名 要爬取的網(wǎng)站地址 # 可以創(chuàng )建多個(gè)爬蟲(chóng)
# 5 命令啟動(dòng)爬蟲(chóng)
-scrapy crawl 爬蟲(chóng)名字
-scrapy crawl 爬蟲(chóng)名字 --nolog # 沒(méi)有日志輸出啟動(dòng)
# 6 文件執行爬蟲(chóng)(推薦使用)
-在項目路徑下創(chuàng )建一個(gè)main.py,右鍵執行即可
from scrapy.cmdline import execute
# execute(['scrapy','crawl','chouti','--nolog']) # 沒(méi)有設置日志級別
execute(['scrapy','crawl','chouti']) # 設置了日志級別
配置文件目錄介紹
-crawl_chouti # 項目名
-crawl_chouti # 跟項目一個(gè)名,文件夾
-spiders # spiders:放著(zhù)爬蟲(chóng) genspider生成的爬蟲(chóng),都放在這下面
-__init__.py
-chouti.py # 抽屜爬蟲(chóng)
-cnblogs.py # cnblogs 爬蟲(chóng)
-items.py # 對比django中的models.py文件 ,寫(xiě)一個(gè)個(gè)的模型類(lèi)
-middlewares.py # 中間件(爬蟲(chóng)中間件,下載中間件),中間件寫(xiě)在這
-pipelines.py # 寫(xiě)持久化的地方(持久化到文件,mysql,redis,mongodb)
-settings.py # 配置文件
-scrapy.cfg # 不用關(guān)注,上線(xiàn)相關(guān)的
# 配置文件settings.py
ROBOTSTXT_OBEY = False # 是否遵循爬蟲(chóng)協(xié)議,強行運行
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36' # 請求頭中的ua,去瀏覽器復制,或者用ua池拿
LOG_LEVEL='ERROR' # 這樣配置,程序錯誤信息才會(huì )打印,
#啟動(dòng)爬蟲(chóng)直接 scrapy crawl 爬蟲(chóng)名 就沒(méi)有日志輸出
# scrapy crawl 爬蟲(chóng)名 --nolog # 配置了就不需要這樣啟動(dòng)了
# 爬蟲(chóng)文件
class ChoutiSpider(scrapy.Spider):
name = 'chouti' # 爬蟲(chóng)名字
allowed_domains = ['https://dig.chouti.com/'] # 允許爬取的域,想要多爬就注釋掉
start_urls = ['https://dig.chouti.com/'] # 起始爬取的位置,爬蟲(chóng)一啟動(dòng),會(huì )先向它發(fā)請求
def parse(self, response): # 解析,請求回來(lái),自動(dòng)執行parser,在這個(gè)方法中做解析
print('---------------------------',response)
抓取數據并解析
# 1 解析,可以使用bs4解析
from bs4 import BeautifulSoup
soup=BeautifulSoup(response.text,'lxml')
soup.find_all() # bs4解析
soup.select() # css解析
# 2 內置的解析器
response.css
response.xpath
# 內置解析
# 所有用css或者xpath選擇出來(lái)的都放在列表中
# 取第一個(gè):extract_first()
# 取出所有extract()
# css選擇器取文本和屬性:
# .link-title::text # 取文本,數據都在data中
# .link-title::attr(href) # 取屬性,數據都在data中
# xpath選擇器取文本和屬性
# .//a[contains(@class,"link-title")/text()]
#.//a[contains(@class,"link-title")/@href]
# 內置css選擇期,取所有
div_list = response.css('.link-con .link-item')
for div in div_list:
content = div.css('.link-title').extract()
print(content)
數據持久化
# 方式一(不推薦)
-1 parser解析函數,return 列表,列表套字典
# 命令 (支持:('json', 'jsonlines', 'jl', 'csv', 'xml', 'marshal', 'pickle')
# 數據到aa.json文件中
-2 scrapy crawl chouti -o aa.json
# 代碼:
lis = []
for div in div_list:
content = div.select('.link-title')[0].text
lis.append({'title':content})
return lis
# 方式二 pipline的方式(管道)
-1 在items.py中創(chuàng )建模型類(lèi)
-2 在爬蟲(chóng)中chouti.py,引入,把解析的數據放到item對象中(要用中括號)
-3 yield item對象
-4 配置文件配置管道
ITEM_PIPELINES = {
# 數字表示優(yōu)先級(數字越小,優(yōu)先級越大)
'crawl_chouti.pipelines.CrawlChoutiPipeline': 300,
'crawl_chouti.pipelines.CrawlChoutiRedisPipeline': 301,
}
-5 pipline.py中寫(xiě)持久化的類(lèi)
spider_open # 方法,一開(kāi)始就打開(kāi)文件
process_item # 方法,寫(xiě)入文件
spider_close # 方法,關(guān)閉文件
保存到文件
# choutiaa.py 爬蟲(chóng)文件
import scrapy
from chouti.items import ChoutiItem # 導入模型類(lèi)
class ChoutiaaSpider(scrapy.Spider):
name = 'choutiaa'
# allowed_domains = ['https://dig.chouti.com/'] # 允許爬取的域
start_urls = ['https://dig.chouti.com//'] # 起始爬取位置
# 解析,請求回來(lái),自動(dòng)執行parse,在這個(gè)方法中解析
def parse(self, response):
print('----------------',response)
from bs4 import BeautifulSoup
soup = BeautifulSoup(response.text,'lxml')
div_list = soup.select('.link-con .link-item')
for div in div_list:
content = div.select('.link-title')[0].text
href = div.select('.link-title')[0].attrs['href']
item = ChoutiItem() # 生成模型對象
item['content'] = content # 添加值
item['href'] = href
yield item # 必須用yield
# items.py 模型類(lèi)文件
import scrapy
class ChoutiItem(scrapy.Item):
content = scrapy.Field()
href = scrapy.Field()
# pipelines.py 數據持久化文件
class ChoutiPipeline(object):
def open_spider(self, spider):
# 一開(kāi)始就打開(kāi)文件
self.f = open('a.txt', 'w', encoding='utf-8')
def process_item(self, item, spider):
# print(item)
# 寫(xiě)入文件的操作 查看全部
文章采集api(Scrapy一個(gè)
)
內容
架構介紹
Scrapy 是一個(gè)開(kāi)源和協(xié)作框架,最初是為頁(yè)面抓?。ǜ鼫蚀_地說(shuō)是網(wǎng)頁(yè)抓?。┒O計的,它允許您以快速、簡(jiǎn)單和可擴展的方式從所需數據中提取所有信息。但目前,Scrapy 的用途非常廣泛,例如數據挖掘、監控和自動(dòng)化測試,也可以用來(lái)獲取 API(例如 Amazon Associates Web Services)或一般網(wǎng)絡(luò )爬蟲(chóng)返回的數據。
Scrapy 是基于 twisted 框架開(kāi)發(fā)的,這是一個(gè)流行的事件驅動(dòng)的 Python 網(wǎng)絡(luò )框架。所以 Scrapy 使用非阻塞(又名異步)代碼來(lái)實(shí)現并發(fā)。整體結構大致如下
IO多路復用
# 引擎(EGINE)(大總管)
引擎負責控制系統所有組件之間的數據流,并在某些動(dòng)作發(fā)生時(shí)觸發(fā)事件。有關(guān)詳細信息,請參見(jiàn)上面的數據流部分。
# 調度器(SCHEDULER)
用來(lái)接受引擎發(fā)過(guò)來(lái)的請求, 壓入隊列中, 并在引擎再次請求的時(shí)候返回. 可以想像成一個(gè)URL的優(yōu)先級隊列, 由它來(lái)決定下一個(gè)要抓取的網(wǎng)址是什么, 同時(shí)去除重復的網(wǎng)址
# 下載器(DOWLOADER)
用于下載網(wǎng)頁(yè)內容, 并將網(wǎng)頁(yè)內容返回給EGINE,下載器是建立在twisted這個(gè)高效的異步模型上的
# 爬蟲(chóng)(SPIDERS)
SPIDERS是開(kāi)發(fā)人員自定義的類(lèi),用來(lái)解析responses,并且提取items,或者發(fā)送新的請求
# 項目管道(ITEM PIPLINES)
在items被提取后負責處理它們,主要包括清理、驗證、持久化(比如存到數據庫)等操作
# 兩個(gè)中間件
-爬蟲(chóng)中間件
-下載中間件(用的最多,加頭,加代理,加cookie,集成selenium)
安裝創(chuàng )建和啟動(dòng)
# 1 框架 不是 模塊
# 2 號稱(chēng)爬蟲(chóng)界的django(你會(huì )發(fā)現,跟django很多地方一樣)
# 3 安裝
-mac,linux平臺:pip3 install scrapy
-windows平臺:pip3 install scrapy(大部分人可以)
- 如果失?。?br /> 1、pip3 install wheel #安裝后,便支持通過(guò)wheel文件安裝軟件,wheel文件官網(wǎng):https://www.lfd.uci.edu/~gohlke/pythonlibs
3、pip3 install lxml
4、pip3 install pyopenssl
5、下載并安裝pywin32:https://sourceforge.net/projec ... in32/
6、下載twisted的wheel文件:http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
7、執行pip3 install 下載目錄\Twisted-17.9.0-cp36-cp36m-win_amd64.whl
8、pip3 install scrapy
# 4 在script文件夾下會(huì )有scrapy.exe可執行文件
-創(chuàng )建scrapy項目:scrapy startproject 項目名 (django創(chuàng )建項目)
-創(chuàng )建爬蟲(chóng):scrapy genspider 爬蟲(chóng)名 要爬取的網(wǎng)站地址 # 可以創(chuàng )建多個(gè)爬蟲(chóng)
# 5 命令啟動(dòng)爬蟲(chóng)
-scrapy crawl 爬蟲(chóng)名字
-scrapy crawl 爬蟲(chóng)名字 --nolog # 沒(méi)有日志輸出啟動(dòng)
# 6 文件執行爬蟲(chóng)(推薦使用)
-在項目路徑下創(chuàng )建一個(gè)main.py,右鍵執行即可
from scrapy.cmdline import execute
# execute(['scrapy','crawl','chouti','--nolog']) # 沒(méi)有設置日志級別
execute(['scrapy','crawl','chouti']) # 設置了日志級別
配置文件目錄介紹
-crawl_chouti # 項目名
-crawl_chouti # 跟項目一個(gè)名,文件夾
-spiders # spiders:放著(zhù)爬蟲(chóng) genspider生成的爬蟲(chóng),都放在這下面
-__init__.py
-chouti.py # 抽屜爬蟲(chóng)
-cnblogs.py # cnblogs 爬蟲(chóng)
-items.py # 對比django中的models.py文件 ,寫(xiě)一個(gè)個(gè)的模型類(lèi)
-middlewares.py # 中間件(爬蟲(chóng)中間件,下載中間件),中間件寫(xiě)在這
-pipelines.py # 寫(xiě)持久化的地方(持久化到文件,mysql,redis,mongodb)
-settings.py # 配置文件
-scrapy.cfg # 不用關(guān)注,上線(xiàn)相關(guān)的
# 配置文件settings.py
ROBOTSTXT_OBEY = False # 是否遵循爬蟲(chóng)協(xié)議,強行運行
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36' # 請求頭中的ua,去瀏覽器復制,或者用ua池拿
LOG_LEVEL='ERROR' # 這樣配置,程序錯誤信息才會(huì )打印,
#啟動(dòng)爬蟲(chóng)直接 scrapy crawl 爬蟲(chóng)名 就沒(méi)有日志輸出
# scrapy crawl 爬蟲(chóng)名 --nolog # 配置了就不需要這樣啟動(dòng)了
# 爬蟲(chóng)文件
class ChoutiSpider(scrapy.Spider):
name = 'chouti' # 爬蟲(chóng)名字
allowed_domains = ['https://dig.chouti.com/'] # 允許爬取的域,想要多爬就注釋掉
start_urls = ['https://dig.chouti.com/'] # 起始爬取的位置,爬蟲(chóng)一啟動(dòng),會(huì )先向它發(fā)請求
def parse(self, response): # 解析,請求回來(lái),自動(dòng)執行parser,在這個(gè)方法中做解析
print('---------------------------',response)
抓取數據并解析
# 1 解析,可以使用bs4解析
from bs4 import BeautifulSoup
soup=BeautifulSoup(response.text,'lxml')
soup.find_all() # bs4解析
soup.select() # css解析
# 2 內置的解析器
response.css
response.xpath
# 內置解析
# 所有用css或者xpath選擇出來(lái)的都放在列表中
# 取第一個(gè):extract_first()
# 取出所有extract()
# css選擇器取文本和屬性:
# .link-title::text # 取文本,數據都在data中
# .link-title::attr(href) # 取屬性,數據都在data中
# xpath選擇器取文本和屬性
# .//a[contains(@class,"link-title")/text()]
#.//a[contains(@class,"link-title")/@href]
# 內置css選擇期,取所有
div_list = response.css('.link-con .link-item')
for div in div_list:
content = div.css('.link-title').extract()
print(content)
數據持久化
# 方式一(不推薦)
-1 parser解析函數,return 列表,列表套字典
# 命令 (支持:('json', 'jsonlines', 'jl', 'csv', 'xml', 'marshal', 'pickle')
# 數據到aa.json文件中
-2 scrapy crawl chouti -o aa.json
# 代碼:
lis = []
for div in div_list:
content = div.select('.link-title')[0].text
lis.append({'title':content})
return lis
# 方式二 pipline的方式(管道)
-1 在items.py中創(chuàng )建模型類(lèi)
-2 在爬蟲(chóng)中chouti.py,引入,把解析的數據放到item對象中(要用中括號)
-3 yield item對象
-4 配置文件配置管道
ITEM_PIPELINES = {
# 數字表示優(yōu)先級(數字越小,優(yōu)先級越大)
'crawl_chouti.pipelines.CrawlChoutiPipeline': 300,
'crawl_chouti.pipelines.CrawlChoutiRedisPipeline': 301,
}
-5 pipline.py中寫(xiě)持久化的類(lèi)
spider_open # 方法,一開(kāi)始就打開(kāi)文件
process_item # 方法,寫(xiě)入文件
spider_close # 方法,關(guān)閉文件
保存到文件
# choutiaa.py 爬蟲(chóng)文件
import scrapy
from chouti.items import ChoutiItem # 導入模型類(lèi)
class ChoutiaaSpider(scrapy.Spider):
name = 'choutiaa'
# allowed_domains = ['https://dig.chouti.com/'] # 允許爬取的域
start_urls = ['https://dig.chouti.com//'] # 起始爬取位置
# 解析,請求回來(lái),自動(dòng)執行parse,在這個(gè)方法中解析
def parse(self, response):
print('----------------',response)
from bs4 import BeautifulSoup
soup = BeautifulSoup(response.text,'lxml')
div_list = soup.select('.link-con .link-item')
for div in div_list:
content = div.select('.link-title')[0].text
href = div.select('.link-title')[0].attrs['href']
item = ChoutiItem() # 生成模型對象
item['content'] = content # 添加值
item['href'] = href
yield item # 必須用yield
# items.py 模型類(lèi)文件
import scrapy
class ChoutiItem(scrapy.Item):
content = scrapy.Field()
href = scrapy.Field()
# pipelines.py 數據持久化文件
class ChoutiPipeline(object):
def open_spider(self, spider):
# 一開(kāi)始就打開(kāi)文件
self.f = open('a.txt', 'w', encoding='utf-8')
def process_item(self, item, spider):
# print(item)
# 寫(xiě)入文件的操作
文章采集api( 爬蟲(chóng)海外網(wǎng)站獲取ip之前,請檢查是否添加白名單?)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 151 次瀏覽 ? 2022-02-21 19:03
爬蟲(chóng)海外網(wǎng)站獲取ip之前,請檢查是否添加白名單?)
海外網(wǎng)站如何使用代理IP采集?
我們在做爬蟲(chóng)的時(shí)候,經(jīng)常會(huì )遇到這種情況。爬蟲(chóng)第一次運行時(shí),可以正常獲取數據,一切看起來(lái)都是那么美好。但是過(guò)一會(huì )可能會(huì )出現403 Forbidden,然后你會(huì )打開(kāi)網(wǎng)站查看一下,你可能會(huì )看到“你的IP訪(fǎng)問(wèn)頻率太高,請稍后再試”。遇到這種情況,通常這種情況下,我們會(huì )使用代理IP隱藏自己的IP,實(shí)現大量爬取。國內代理常用的產(chǎn)品有幾十種,而我們需要在海外爬的時(shí)候網(wǎng)站這些代理都用不上,所以我們今天用的是Ipidea全球代理。
用法與國內相差不大??梢愿鶕枰x擇在指定國家或全球播放,通過(guò)api接口調用,指定提取次數,也可以指定接口返回數據格式,如txt、json、html、等等,這里以全局混合和json格式為例,獲取一個(gè)代理,一次一個(gè),python代碼如下:
import requestsurl = "http://tiqu.linksocket.com:81/ ... Bresp = requests.get(url)# 成功獲取到的數據為:{'code': 0, 'data': [{'ip': '47.74.232.57', 'port': 21861}], 'msg': '0', 'success': True}data = resp.json().get('data')[0]proxy = { "http": "http://%s:%d" % (data.get("ip"), data.get("port")), "https": "https://%s:%d" % (data.get("ip"), data.get("port"))}
在獲取IP之前,我們需要通過(guò)個(gè)人中心設置IP白名單,否則無(wú)法獲取數據。
只需填寫(xiě)你本地的公網(wǎng)并保存即可(官方界面也提供了添加或刪除白名單的界面)。如果不知道公網(wǎng)IP是什么,可以通過(guò)百度搜索IP。
爬蟲(chóng)演示如下。以下是六度新聞的示例:
import requestsurl = "http://tiqu.linksocket.com:81/ ... 3Bdef get_proxy(): """ 獲取代理 """ resp = requests.get(url) data = resp.json().get('data')[0] proxy = { "http": "http://%s:%d" % (data.get("ip"), data.get("port")), "https": "https://%s:%d" % (data.get("ip"), data.get("port")) } return proxydef download_html(url): """ 獲取url接口數據 """ resp = requests.get(url,proxies=get_proxy()) return resp.json()def run(): """ 主程序 :return: """ url = "https://6do.news/api/tag/114?page=1" content = download_html(url) # 數據處理略if __name__ == '__main__': run()
數據如圖:
前后端分離的界面對爬蟲(chóng)比較友好,提取數據也比較方便。這里不需要做太多處理,可以根據需要提取數據。
如果代理不能掛在爬蟲(chóng)中,請檢查是否添加白名單。
本次海外網(wǎng)站的采集教程到此結束,詳細交流請聯(lián)系我。
本文章僅供交流分享,【未經(jīng)許可,請拒絕轉載】 查看全部
文章采集api(
爬蟲(chóng)海外網(wǎng)站獲取ip之前,請檢查是否添加白名單?)
海外網(wǎng)站如何使用代理IP采集?
我們在做爬蟲(chóng)的時(shí)候,經(jīng)常會(huì )遇到這種情況。爬蟲(chóng)第一次運行時(shí),可以正常獲取數據,一切看起來(lái)都是那么美好。但是過(guò)一會(huì )可能會(huì )出現403 Forbidden,然后你會(huì )打開(kāi)網(wǎng)站查看一下,你可能會(huì )看到“你的IP訪(fǎng)問(wèn)頻率太高,請稍后再試”。遇到這種情況,通常這種情況下,我們會(huì )使用代理IP隱藏自己的IP,實(shí)現大量爬取。國內代理常用的產(chǎn)品有幾十種,而我們需要在海外爬的時(shí)候網(wǎng)站這些代理都用不上,所以我們今天用的是Ipidea全球代理。
用法與國內相差不大??梢愿鶕枰x擇在指定國家或全球播放,通過(guò)api接口調用,指定提取次數,也可以指定接口返回數據格式,如txt、json、html、等等,這里以全局混合和json格式為例,獲取一個(gè)代理,一次一個(gè),python代碼如下:
import requestsurl = "http://tiqu.linksocket.com:81/ ... Bresp = requests.get(url)# 成功獲取到的數據為:{'code': 0, 'data': [{'ip': '47.74.232.57', 'port': 21861}], 'msg': '0', 'success': True}data = resp.json().get('data')[0]proxy = { "http": "http://%s:%d" % (data.get("ip"), data.get("port")), "https": "https://%s:%d" % (data.get("ip"), data.get("port"))}
在獲取IP之前,我們需要通過(guò)個(gè)人中心設置IP白名單,否則無(wú)法獲取數據。

只需填寫(xiě)你本地的公網(wǎng)并保存即可(官方界面也提供了添加或刪除白名單的界面)。如果不知道公網(wǎng)IP是什么,可以通過(guò)百度搜索IP。
爬蟲(chóng)演示如下。以下是六度新聞的示例:
import requestsurl = "http://tiqu.linksocket.com:81/ ... 3Bdef get_proxy(): """ 獲取代理 """ resp = requests.get(url) data = resp.json().get('data')[0] proxy = { "http": "http://%s:%d" % (data.get("ip"), data.get("port")), "https": "https://%s:%d" % (data.get("ip"), data.get("port")) } return proxydef download_html(url): """ 獲取url接口數據 """ resp = requests.get(url,proxies=get_proxy()) return resp.json()def run(): """ 主程序 :return: """ url = "https://6do.news/api/tag/114?page=1" content = download_html(url) # 數據處理略if __name__ == '__main__': run()
數據如圖:

前后端分離的界面對爬蟲(chóng)比較友好,提取數據也比較方便。這里不需要做太多處理,可以根據需要提取數據。
如果代理不能掛在爬蟲(chóng)中,請檢查是否添加白名單。
本次海外網(wǎng)站的采集教程到此結束,詳細交流請聯(lián)系我。
本文章僅供交流分享,【未經(jīng)許可,請拒絕轉載】
文章采集api(如何通過(guò)MySQL存儲采集到的數據)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 133 次瀏覽 ? 2022-02-21 06:08
MySQL是目前最流行的開(kāi)源關(guān)系數據庫管理系統。令人驚訝的是,一個(gè)開(kāi)源項目的競爭力如此之強,以至于它的受歡迎程度不斷接近另外兩個(gè)閉源商業(yè)數據庫系統:微軟的 SQL Server 和甲骨文的甲骨文數據庫(MySQL 于 2010 年被甲骨文收購)。)。
它的受歡迎程度不辜負它的名字。對于大多數應用程序,MySQL 是顯而易見(jiàn)的選擇。它是一個(gè)非常靈活、穩定、功能齊全的 DBMS,許多頂級 網(wǎng)站 都在使用它:Youtube、Twitter、Facebook 等。
由于使用廣泛、免費、開(kāi)箱即用,是web data采集項目中常用的數據庫,在此文章我們介紹如何存儲數據采集 通過(guò) MySQL。
安裝 MySQL
如果您是 MySQL 新手,您可能會(huì )覺(jué)得它有點(diǎn)麻煩。其實(shí)安裝方法和安裝其他軟件一樣簡(jiǎn)單。歸根結底,MySQL 是由一系列數據文件組成的,存儲在你的遠程服務(wù)器或本地計算機上,其中收錄了存儲在數據庫中的所有信息。
在Windows上安裝MySQL,在Ubuntu上安裝MySQL,在MAC上安裝MySQL具體步驟在這里:在所有平臺上安裝MySQL
此處無(wú)需過(guò)多解釋?zhuān)凑找曨l操作即可。
基本命令
MySQL服務(wù)器啟動(dòng)后,與數據庫服務(wù)器交互的方式有很多種。因為許多工具都是圖形界面,所以您可以不使用 MySQL 的命令行(或很少使用)來(lái)管理數據庫。phpMyAdmin 和 MySQL Workbench 等工具可以輕松查看、排序和創(chuàng )建數據庫。但是,掌握命令行操作數據庫還是很重要的。
除了用戶(hù)定義的變量名,MySQL 不區分大小寫(xiě)。例如,SELECT 與 select 相同,但習慣上所有 MySQL 關(guān)鍵詞 的 MySQL 語(yǔ)句都以大寫(xiě)形式編寫(xiě)。大多數開(kāi)發(fā)人員還喜歡使用小寫(xiě)字母作為數據庫和數據表名稱(chēng)。
首次登錄 MySQL 數據庫時(shí),沒(méi)有數據庫來(lái)存儲數據。我們需要創(chuàng )建一個(gè)數據庫:
CREATE DATABASE scraping_article DEFAULT CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI;
因為每個(gè) MySQL 實(shí)例可以有多個(gè)數據庫,所以在使用數據庫之前需要指定數據庫名稱(chēng):
使用scraping_article
從現在開(kāi)始(直到關(guān)閉 MySQL 鏈接或切換到另一個(gè)數據庫),所有命令都在這個(gè)新的“scraping_article”數據庫中運行。
所有的操作看起來(lái)都很簡(jiǎn)單。那么在數據庫中新建表的操作方法應該也差不多吧?我們在庫中新建一個(gè)表來(lái)存儲采集的網(wǎng)頁(yè)文章的數據:
創(chuàng )建表文章;
結果顯示錯誤:
錯誤 1113 (42000): 一個(gè)表必須至少有 1 列
與數據庫不同,MySQL 數據表必須有列,否則無(wú)法創(chuàng )建。要在 MySQL 中定義字段(數據列),我們還必須將字段定義放在 CREATE TABLE 語(yǔ)句之后的帶括號的逗號分隔列表中:
create table articles
(
id int auto_increment
primary key,
title varchar(64) null,
body text null,
summary varchar(256) null,
body_html text null,
create_time datetime default CURRENT_TIMESTAMP null,
time_updated datetime null,
link_text varchar(128) null
);
每個(gè)字段定義由三部分組成:
在字段定義列表的最后,還定義了一個(gè)“主鍵”(key)。MySQL使用這個(gè)主鍵來(lái)組織表的內容,方便以后快速查詢(xún)。以后文章會(huì )介紹如何通過(guò)這些主鍵來(lái)提高數據庫的查詢(xún)速度,不過(guò)目前我們可以使用表的id列作為主鍵。
語(yǔ)句執行完畢后,我們可以使用DESCRIBE查看數據表的結構:
+--------------+--------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+-------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| title | varchar(64) | YES | | NULL | |
| body | text | YES | | NULL | |
| summary | varchar(256) | YES | | NULL | |
| body_html | text | YES | | NULL | |
| create_time | datetime | YES | | CURRENT_TIMESTAMP | |
| time_updated | datetime | YES | | NULL | |
| link_text | varchar(128) | YES | | NULL | |
+--------------+--------------+------+-----+-------------------+----------------+
8 rows in set (0.03 sec)
現在這張表是空表,我們插入數據看看,如下圖:
INSERT INTO articles(title,body,summary,body_html,link_text) VALUES ("Test page title","Test page body.","Test page summary.","<p>Test page body.","test-page");</p>
這里需要注意,雖然articles表有8個(gè)字段(id、title、body、summary、body_html、create_time、time_update、link_text),但實(shí)際上我們只插入了5個(gè)字段(title、body、summary、body_html、link_text) ) ) 數據。因為id字段是自動(dòng)遞增的(MySQL每次插入數據時(shí)默認遞增1),一般不需要處理。另外create_time字段的類(lèi)型是current_timestamp,時(shí)間戳是通過(guò)插入的默認。
當然,我們也可以自定義字段內容來(lái)插入數據:
INSERT INTO articles(id,title,body,summary,body_html,create_time,link_text) VALUES (4,"Test page title","Test page body.","Test page summary.","<p>Test page body.","2021-11-20 15:51:45","test-page");</p>
只要你定義的整數不在數據表的id字段中,就可以插入到數據表中。但是,這非常糟糕;除非絕對必要(比如程序中缺少一行數據),否則讓 MySQL 自己處理 id 和 timestamp 字段。
現在表中有一些數據,我們可以通過(guò)多種方式查詢(xún)這些數據。以下是 SELECT 語(yǔ)句的一些示例:
SELECT * FROM articles WHERE id=1;
該語(yǔ)句告訴 MySQL “從文章表中選擇 id 等于 2 的所有數據”。此星號 (*) 是通配符,表示所有字段。這行語(yǔ)句將顯示所有滿(mǎn)足條件的字段(其中 id=1))。如果沒(méi)有 id 等于 1 的行,它將返回一個(gè)空集。例如,以下不區分大小寫(xiě)的查詢(xún)將返回標題字段中收錄“test”的所有行的所有字段(% 符號表示 MySQL 字符串通配符):
SELECT * FROM articles WHERE title LIKE "%test%";
但是如果你有很多字段并且你只想返回其中的一部分呢?您可以使用以下命令代替星號:
SELECT title, body FROM articles WHERE body LIKE "%test%";
這將只返回正文內容收錄“test”的所有行的標題和正文字段。
DELETE 語(yǔ)句的語(yǔ)法類(lèi)似于 SELECT 語(yǔ)句:
DELETE FROM articles WHERE id=1;
由于數據庫的數據刪除無(wú)法恢復,建議在執行DELETE語(yǔ)句前使用SELECT確認要刪除的數據(上述刪除語(yǔ)句可以使用SELECT * FROM文章WHERE id=1;查看),以及然后將 SELECT * 替換為 DELETE 就可以了,這是一個(gè)好習慣。很多程序員都有過(guò) DELETE 誤操作的悲慘故事,也有一些恐怖的故事是有人驚慌失措的忘記在語(yǔ)句中輸入 WHERE,結果所有客戶(hù)數據都被刪除了。不要讓這種事情發(fā)生在你身上!
要介紹的另一件事是 UPDATE 語(yǔ)句:
UPDATE articles SET title="A new title", body="Some new body." WHERE id=4;
以上只使用了最基本的 MySQL 語(yǔ)句來(lái)做一些簡(jiǎn)單的數據查詢(xún)、創(chuàng )建和更新。
與 Python 集成
Python 沒(méi)有對 MySQL 的內置支持。但是,有很多開(kāi)源的可以用來(lái)和 MySQL 交互,Python 2.x 和 Python 3.x 版本都支持。最著(zhù)名的一個(gè)是 PyMySQL。
我們可以使用pip來(lái)安裝,執行如下命令:
python3 -m pip 安裝 PyMySQL
安裝完成后,我們就可以使用 PyMySQL 包了。如果您的 MySQL 服務(wù)器正在運行,您應該能夠成功執行以下命令:
import pymysql
import os
from dotenv import load_dotenv
class DataSaveToMySQL(object):
def __init__(self):
# loading env config file
dotenv_path = os.path.join(os.getcwd(), '.env')
if os.path.exists(dotenv_path):
load_dotenv(dotenv_path)
conn = pymysql.connect(host=os.environ.get('MYSQL_HOST'), port=os.environ.get('MYSQL_PORT'),
user=os.environ.get('MYSQL_USER'), password=os.environ.get('MYSQL_PASSWORD'),
db=os.environ.get('MYSQL_DATABASES'))
cur = conn.cursor()
cur.execute("SELECT * FROM articles WHERE id=4;")
print(cur.fetchone())
cur.close()
conn.close()
這個(gè)程序有兩個(gè)對象:一個(gè)連接對象(conn)和一個(gè)游標對象(cur)。
連接/游標模式是數據庫編程中常用的模式。當您不熟悉數據庫時(shí),有時(shí)很難區分這兩種模式之間的區別。連接方式除了連接數據庫外,還發(fā)送數據庫信息,處理回滾操作(當一個(gè)查詢(xún)或一組查詢(xún)中斷時(shí),數據庫需要回到初始狀態(tài),一般使用事務(wù)來(lái)實(shí)現狀態(tài)回滾),創(chuàng )建新游標等
一個(gè)連接可以有很多游標,一個(gè)游標跟蹤一種狀態(tài)信息,比如跟蹤數據庫的使用狀態(tài)。如果您有多個(gè)數據庫,并且需要寫(xiě)入所有數據庫,則需要多個(gè)游標來(lái)處理。游標還可以收錄上次查詢(xún)執行的結果。查詢(xún)結果可以通過(guò)調用cur.fetchone()等游標函數獲得。
請記住在使用完連接和游標后關(guān)閉它們。如果不關(guān)閉,會(huì )導致連接泄漏(connection leak),造成連接關(guān)閉現象,即連接不再使用,但是數據庫無(wú)法關(guān)閉,因為數據庫不確定是否你想繼續使用它。這種現象會(huì )一直消耗數據庫資源,所以使用數據庫后記得關(guān)閉連接!
剛開(kāi)始時(shí),您要做的就是將 采集 的數據保存到數據庫中。我們繼續采集blog文章的例子來(lái)演示如何實(shí)現數據存儲。
import pymysql
import os
from dotenv import load_dotenv
from config import logger_config
from utils import connection_util
class DataSaveToMySQL(object):
def __init__(self):
# loading env config file
dotenv_path = os.path.join(os.getcwd(), '.env')
if os.path.exists(dotenv_path):
load_dotenv(dotenv_path)
# MySQL config
self._host = os.environ.get('MYSQL_HOST')
self._port = int(os.environ.get('MYSQL_PORT'))
self._user = os.environ.get('MYSQL_USER')
self._password = os.environ.get('MYSQL_PASSWORD')
self._db = os.environ.get('MYSQL_DATABASES')
self._target_url = 'https://www.scrapingbee.com/blog/'
self._baseUrl = 'https://www.scrapingbee.com'
self._init_connection = connection_util.ProcessConnection()
logging_name = 'store_mysql'
init_logging = logger_config.LoggingConfig()
self._logging = init_logging.init_logging(logging_name)
def scrape_data(self):
get_content = self._init_connection.init_connection(self._target_url)
if get_content:
parent = get_content.findAll("section", {"class": "section-sm"})[0]
get_row = parent.findAll("div", {"class": "col-lg-12 mb-5 mb-lg-0"})[0]
get_child_item = get_row.findAll("div", {"class": "col-md-4 mb-4"})
for item in get_child_item:
# 獲取標題文字
get_title = item.find("a", {"class": "h5 d-block mb-3 post-title"}).get_text()
# 獲取發(fā)布時(shí)間
get_release_date = item.find("div", {"class": "mb-3 mt-2"}).findAll("span")[1].get_text()
# 獲取文章描述
get_description = item.find("p", {"class": "card-text post-description"}).get_text()
self.article_save_mysql(title=get_title, description=get_description, release_date=get_release_date)
else:
self._logging.warning('未獲取到文章任何內容,請檢查!')
def article_save_mysql(self, title, description, release_date):
connection = pymysql.connect(host=self._host, port=self._port, user=self._user, password=self._password,
db=self._db, charset='utf-8')
with connection.cursor() as cursor:
# Create a new record
sql = "INSERT INTO articles (title,summary,create_time) VALUES (%s,%s,%s);"
cursor.execute(sql, (title, description, release_date))
# connection is not autocommit by default. So you must commit to save
# your changes.
connection.commit()
這里需要注意幾點(diǎn):首先,將 charset='utf-8' 添加到連接字符串中。這是為了讓conn把所有發(fā)送到數據庫的信息都當作utf-8編碼格式(當然前提是數據庫默認編碼設置為UTF-8)。
然后需要注意article_save_mysql函數。它有3個(gè)參數:title、description和release_date,并將這兩個(gè)參數添加到INSERT語(yǔ)句中并用游標執行,然后用游標確認。這是將光標與連接分開(kāi)的一個(gè)很好的例子;當游標存儲一些數據庫和數據庫上下文信息時(shí),需要通過(guò)連接確認才能將信息傳遞到數據庫中,然后再將信息插入到數據庫中。
上述代碼沒(méi)有使用 try...finally 語(yǔ)句關(guān)閉數據庫,而是使用 with() 關(guān)閉數據庫連接。在上一期中,我們也使用了 with() 來(lái)關(guān)閉 CSV 文件。
PyMySQL的規模雖然不大,但里面有一些非常實(shí)用的功能,在本文章中就不演示了。具體請參考 Python DBAPI 標準文檔。
以上是關(guān)于將采集的內容保存到MySQL。本示例的所有代碼都托管在 github 上。
github: 查看全部
文章采集api(如何通過(guò)MySQL存儲采集到的數據)
MySQL是目前最流行的開(kāi)源關(guān)系數據庫管理系統。令人驚訝的是,一個(gè)開(kāi)源項目的競爭力如此之強,以至于它的受歡迎程度不斷接近另外兩個(gè)閉源商業(yè)數據庫系統:微軟的 SQL Server 和甲骨文的甲骨文數據庫(MySQL 于 2010 年被甲骨文收購)。)。
它的受歡迎程度不辜負它的名字。對于大多數應用程序,MySQL 是顯而易見(jiàn)的選擇。它是一個(gè)非常靈活、穩定、功能齊全的 DBMS,許多頂級 網(wǎng)站 都在使用它:Youtube、Twitter、Facebook 等。
由于使用廣泛、免費、開(kāi)箱即用,是web data采集項目中常用的數據庫,在此文章我們介紹如何存儲數據采集 通過(guò) MySQL。
安裝 MySQL
如果您是 MySQL 新手,您可能會(huì )覺(jué)得它有點(diǎn)麻煩。其實(shí)安裝方法和安裝其他軟件一樣簡(jiǎn)單。歸根結底,MySQL 是由一系列數據文件組成的,存儲在你的遠程服務(wù)器或本地計算機上,其中收錄了存儲在數據庫中的所有信息。
在Windows上安裝MySQL,在Ubuntu上安裝MySQL,在MAC上安裝MySQL具體步驟在這里:在所有平臺上安裝MySQL
此處無(wú)需過(guò)多解釋?zhuān)凑找曨l操作即可。
基本命令
MySQL服務(wù)器啟動(dòng)后,與數據庫服務(wù)器交互的方式有很多種。因為許多工具都是圖形界面,所以您可以不使用 MySQL 的命令行(或很少使用)來(lái)管理數據庫。phpMyAdmin 和 MySQL Workbench 等工具可以輕松查看、排序和創(chuàng )建數據庫。但是,掌握命令行操作數據庫還是很重要的。
除了用戶(hù)定義的變量名,MySQL 不區分大小寫(xiě)。例如,SELECT 與 select 相同,但習慣上所有 MySQL 關(guān)鍵詞 的 MySQL 語(yǔ)句都以大寫(xiě)形式編寫(xiě)。大多數開(kāi)發(fā)人員還喜歡使用小寫(xiě)字母作為數據庫和數據表名稱(chēng)。
首次登錄 MySQL 數據庫時(shí),沒(méi)有數據庫來(lái)存儲數據。我們需要創(chuàng )建一個(gè)數據庫:
CREATE DATABASE scraping_article DEFAULT CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI;
因為每個(gè) MySQL 實(shí)例可以有多個(gè)數據庫,所以在使用數據庫之前需要指定數據庫名稱(chēng):
使用scraping_article
從現在開(kāi)始(直到關(guān)閉 MySQL 鏈接或切換到另一個(gè)數據庫),所有命令都在這個(gè)新的“scraping_article”數據庫中運行。
所有的操作看起來(lái)都很簡(jiǎn)單。那么在數據庫中新建表的操作方法應該也差不多吧?我們在庫中新建一個(gè)表來(lái)存儲采集的網(wǎng)頁(yè)文章的數據:
創(chuàng )建表文章;
結果顯示錯誤:
錯誤 1113 (42000): 一個(gè)表必須至少有 1 列
與數據庫不同,MySQL 數據表必須有列,否則無(wú)法創(chuàng )建。要在 MySQL 中定義字段(數據列),我們還必須將字段定義放在 CREATE TABLE 語(yǔ)句之后的帶括號的逗號分隔列表中:
create table articles
(
id int auto_increment
primary key,
title varchar(64) null,
body text null,
summary varchar(256) null,
body_html text null,
create_time datetime default CURRENT_TIMESTAMP null,
time_updated datetime null,
link_text varchar(128) null
);
每個(gè)字段定義由三部分組成:
在字段定義列表的最后,還定義了一個(gè)“主鍵”(key)。MySQL使用這個(gè)主鍵來(lái)組織表的內容,方便以后快速查詢(xún)。以后文章會(huì )介紹如何通過(guò)這些主鍵來(lái)提高數據庫的查詢(xún)速度,不過(guò)目前我們可以使用表的id列作為主鍵。
語(yǔ)句執行完畢后,我們可以使用DESCRIBE查看數據表的結構:
+--------------+--------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+-------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| title | varchar(64) | YES | | NULL | |
| body | text | YES | | NULL | |
| summary | varchar(256) | YES | | NULL | |
| body_html | text | YES | | NULL | |
| create_time | datetime | YES | | CURRENT_TIMESTAMP | |
| time_updated | datetime | YES | | NULL | |
| link_text | varchar(128) | YES | | NULL | |
+--------------+--------------+------+-----+-------------------+----------------+
8 rows in set (0.03 sec)
現在這張表是空表,我們插入數據看看,如下圖:
INSERT INTO articles(title,body,summary,body_html,link_text) VALUES ("Test page title","Test page body.","Test page summary.","<p>Test page body.","test-page");</p>
這里需要注意,雖然articles表有8個(gè)字段(id、title、body、summary、body_html、create_time、time_update、link_text),但實(shí)際上我們只插入了5個(gè)字段(title、body、summary、body_html、link_text) ) ) 數據。因為id字段是自動(dòng)遞增的(MySQL每次插入數據時(shí)默認遞增1),一般不需要處理。另外create_time字段的類(lèi)型是current_timestamp,時(shí)間戳是通過(guò)插入的默認。
當然,我們也可以自定義字段內容來(lái)插入數據:
INSERT INTO articles(id,title,body,summary,body_html,create_time,link_text) VALUES (4,"Test page title","Test page body.","Test page summary.","<p>Test page body.","2021-11-20 15:51:45","test-page");</p>
只要你定義的整數不在數據表的id字段中,就可以插入到數據表中。但是,這非常糟糕;除非絕對必要(比如程序中缺少一行數據),否則讓 MySQL 自己處理 id 和 timestamp 字段。
現在表中有一些數據,我們可以通過(guò)多種方式查詢(xún)這些數據。以下是 SELECT 語(yǔ)句的一些示例:
SELECT * FROM articles WHERE id=1;
該語(yǔ)句告訴 MySQL “從文章表中選擇 id 等于 2 的所有數據”。此星號 (*) 是通配符,表示所有字段。這行語(yǔ)句將顯示所有滿(mǎn)足條件的字段(其中 id=1))。如果沒(méi)有 id 等于 1 的行,它將返回一個(gè)空集。例如,以下不區分大小寫(xiě)的查詢(xún)將返回標題字段中收錄“test”的所有行的所有字段(% 符號表示 MySQL 字符串通配符):
SELECT * FROM articles WHERE title LIKE "%test%";
但是如果你有很多字段并且你只想返回其中的一部分呢?您可以使用以下命令代替星號:
SELECT title, body FROM articles WHERE body LIKE "%test%";
這將只返回正文內容收錄“test”的所有行的標題和正文字段。
DELETE 語(yǔ)句的語(yǔ)法類(lèi)似于 SELECT 語(yǔ)句:
DELETE FROM articles WHERE id=1;
由于數據庫的數據刪除無(wú)法恢復,建議在執行DELETE語(yǔ)句前使用SELECT確認要刪除的數據(上述刪除語(yǔ)句可以使用SELECT * FROM文章WHERE id=1;查看),以及然后將 SELECT * 替換為 DELETE 就可以了,這是一個(gè)好習慣。很多程序員都有過(guò) DELETE 誤操作的悲慘故事,也有一些恐怖的故事是有人驚慌失措的忘記在語(yǔ)句中輸入 WHERE,結果所有客戶(hù)數據都被刪除了。不要讓這種事情發(fā)生在你身上!
要介紹的另一件事是 UPDATE 語(yǔ)句:
UPDATE articles SET title="A new title", body="Some new body." WHERE id=4;
以上只使用了最基本的 MySQL 語(yǔ)句來(lái)做一些簡(jiǎn)單的數據查詢(xún)、創(chuàng )建和更新。
與 Python 集成
Python 沒(méi)有對 MySQL 的內置支持。但是,有很多開(kāi)源的可以用來(lái)和 MySQL 交互,Python 2.x 和 Python 3.x 版本都支持。最著(zhù)名的一個(gè)是 PyMySQL。
我們可以使用pip來(lái)安裝,執行如下命令:
python3 -m pip 安裝 PyMySQL
安裝完成后,我們就可以使用 PyMySQL 包了。如果您的 MySQL 服務(wù)器正在運行,您應該能夠成功執行以下命令:
import pymysql
import os
from dotenv import load_dotenv
class DataSaveToMySQL(object):
def __init__(self):
# loading env config file
dotenv_path = os.path.join(os.getcwd(), '.env')
if os.path.exists(dotenv_path):
load_dotenv(dotenv_path)
conn = pymysql.connect(host=os.environ.get('MYSQL_HOST'), port=os.environ.get('MYSQL_PORT'),
user=os.environ.get('MYSQL_USER'), password=os.environ.get('MYSQL_PASSWORD'),
db=os.environ.get('MYSQL_DATABASES'))
cur = conn.cursor()
cur.execute("SELECT * FROM articles WHERE id=4;")
print(cur.fetchone())
cur.close()
conn.close()
這個(gè)程序有兩個(gè)對象:一個(gè)連接對象(conn)和一個(gè)游標對象(cur)。
連接/游標模式是數據庫編程中常用的模式。當您不熟悉數據庫時(shí),有時(shí)很難區分這兩種模式之間的區別。連接方式除了連接數據庫外,還發(fā)送數據庫信息,處理回滾操作(當一個(gè)查詢(xún)或一組查詢(xún)中斷時(shí),數據庫需要回到初始狀態(tài),一般使用事務(wù)來(lái)實(shí)現狀態(tài)回滾),創(chuàng )建新游標等
一個(gè)連接可以有很多游標,一個(gè)游標跟蹤一種狀態(tài)信息,比如跟蹤數據庫的使用狀態(tài)。如果您有多個(gè)數據庫,并且需要寫(xiě)入所有數據庫,則需要多個(gè)游標來(lái)處理。游標還可以收錄上次查詢(xún)執行的結果。查詢(xún)結果可以通過(guò)調用cur.fetchone()等游標函數獲得。
請記住在使用完連接和游標后關(guān)閉它們。如果不關(guān)閉,會(huì )導致連接泄漏(connection leak),造成連接關(guān)閉現象,即連接不再使用,但是數據庫無(wú)法關(guān)閉,因為數據庫不確定是否你想繼續使用它。這種現象會(huì )一直消耗數據庫資源,所以使用數據庫后記得關(guān)閉連接!
剛開(kāi)始時(shí),您要做的就是將 采集 的數據保存到數據庫中。我們繼續采集blog文章的例子來(lái)演示如何實(shí)現數據存儲。
import pymysql
import os
from dotenv import load_dotenv
from config import logger_config
from utils import connection_util
class DataSaveToMySQL(object):
def __init__(self):
# loading env config file
dotenv_path = os.path.join(os.getcwd(), '.env')
if os.path.exists(dotenv_path):
load_dotenv(dotenv_path)
# MySQL config
self._host = os.environ.get('MYSQL_HOST')
self._port = int(os.environ.get('MYSQL_PORT'))
self._user = os.environ.get('MYSQL_USER')
self._password = os.environ.get('MYSQL_PASSWORD')
self._db = os.environ.get('MYSQL_DATABASES')
self._target_url = 'https://www.scrapingbee.com/blog/'
self._baseUrl = 'https://www.scrapingbee.com'
self._init_connection = connection_util.ProcessConnection()
logging_name = 'store_mysql'
init_logging = logger_config.LoggingConfig()
self._logging = init_logging.init_logging(logging_name)
def scrape_data(self):
get_content = self._init_connection.init_connection(self._target_url)
if get_content:
parent = get_content.findAll("section", {"class": "section-sm"})[0]
get_row = parent.findAll("div", {"class": "col-lg-12 mb-5 mb-lg-0"})[0]
get_child_item = get_row.findAll("div", {"class": "col-md-4 mb-4"})
for item in get_child_item:
# 獲取標題文字
get_title = item.find("a", {"class": "h5 d-block mb-3 post-title"}).get_text()
# 獲取發(fā)布時(shí)間
get_release_date = item.find("div", {"class": "mb-3 mt-2"}).findAll("span")[1].get_text()
# 獲取文章描述
get_description = item.find("p", {"class": "card-text post-description"}).get_text()
self.article_save_mysql(title=get_title, description=get_description, release_date=get_release_date)
else:
self._logging.warning('未獲取到文章任何內容,請檢查!')
def article_save_mysql(self, title, description, release_date):
connection = pymysql.connect(host=self._host, port=self._port, user=self._user, password=self._password,
db=self._db, charset='utf-8')
with connection.cursor() as cursor:
# Create a new record
sql = "INSERT INTO articles (title,summary,create_time) VALUES (%s,%s,%s);"
cursor.execute(sql, (title, description, release_date))
# connection is not autocommit by default. So you must commit to save
# your changes.
connection.commit()
這里需要注意幾點(diǎn):首先,將 charset='utf-8' 添加到連接字符串中。這是為了讓conn把所有發(fā)送到數據庫的信息都當作utf-8編碼格式(當然前提是數據庫默認編碼設置為UTF-8)。
然后需要注意article_save_mysql函數。它有3個(gè)參數:title、description和release_date,并將這兩個(gè)參數添加到INSERT語(yǔ)句中并用游標執行,然后用游標確認。這是將光標與連接分開(kāi)的一個(gè)很好的例子;當游標存儲一些數據庫和數據庫上下文信息時(shí),需要通過(guò)連接確認才能將信息傳遞到數據庫中,然后再將信息插入到數據庫中。
上述代碼沒(méi)有使用 try...finally 語(yǔ)句關(guān)閉數據庫,而是使用 with() 關(guān)閉數據庫連接。在上一期中,我們也使用了 with() 來(lái)關(guān)閉 CSV 文件。
PyMySQL的規模雖然不大,但里面有一些非常實(shí)用的功能,在本文章中就不演示了。具體請參考 Python DBAPI 標準文檔。
以上是關(guān)于將采集的內容保存到MySQL。本示例的所有代碼都托管在 github 上。
github:
文章采集api(【干貨】Kubernetes日志采集難點(diǎn)分析(一)——Kubernetes)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 119 次瀏覽 ? 2022-02-21 06:02
前言
上一期主要介紹了Kubernetes日志輸出的一些注意事項。日志輸出的最終目的是做統一的采集和分析。在 Kubernetes 中,記錄采集的方式與普通虛擬機有很大不同,相對實(shí)現難度和部署成本也略高。但是,如果使用得當,可以實(shí)現比傳統方式更高的自動(dòng)化程度和更低的運維成本。
Kubernetes 日志采集 難點(diǎn)
在 Kubernetes 中,log采集 比傳統的虛擬機和物理機要復雜得多。最根本的原因是Kubernetes屏蔽了底層異常,提供了更細粒度的資源調度,向上提供了一個(gè)穩定動(dòng)態(tài)的環(huán)境。因此,日志采集面臨著(zhù)更豐富、更動(dòng)態(tài)的環(huán)境,需要考慮的點(diǎn)也更多。
例如:
對于一個(gè)運行時(shí)間很短的Job應用,從啟動(dòng)到停止只需要幾秒,如何保證日志采集的實(shí)時(shí)性能跟得上,數據不丟失?K8s 一般推薦使用大型節點(diǎn)。每個(gè)節點(diǎn)可以運行 10-100+ 個(gè)容器。如何以盡可能低的資源消耗采集100+ 個(gè)容器?在K8s中,應用以yaml的形式部署,日志采集主要是手動(dòng)配置文件的形式。日志采集如何以K8s的方式部署?
Kubernetes傳統日志類(lèi)型文件、stdout、host文件、journal文件、journal日志源業(yè)務(wù)容器、系統組件、宿主業(yè)務(wù)、宿主采集方法代理(Sidecar、DaemonSet)、直寫(xiě)(DockerEngine、業(yè)務(wù))代理、直接-write 單機應用號 10-1001-10 應用動(dòng)態(tài)高低 節點(diǎn)動(dòng)態(tài)高低 采集 部署方式手動(dòng)、Yaml手動(dòng)、自定義
采集模式:主動(dòng)或被動(dòng)
日志采集方法有兩種:被動(dòng)采集和主動(dòng)推送。在K8s中,被動(dòng)采集一般分為Sidecar和DaemonSet兩種方式。主動(dòng)推送包括 DockerEngine 推送和業(yè)務(wù)直推。寫(xiě)兩種方式。
總結:DockerEngine直接寫(xiě)一般不推薦;日志量大的場(chǎng)景推薦業(yè)務(wù)直寫(xiě);DaemonSet 一般用于中小型集群;建議在非常大的集群中使用 Sidecar。各種采集方法的詳細對比如下:
DockerEngine業(yè)務(wù)直接寫(xiě)入DaemonSet方法Sidecar方法采集日志類(lèi)型標準輸出業(yè)務(wù)日志標準輸出+部分文件文件部署運維低,原生支持低,只需要維護配置文件正常,需要為了維護 DaemonSet 高,每個(gè)需要 采集 日志的 POD 都需要部署一個(gè) sidecar 容器。日志分類(lèi)和存儲無(wú)法實(shí)現業(yè)務(wù)無(wú)關(guān)的配置。一般來(lái)說(shuō),每個(gè)POD都可以通過(guò)容器/路徑映射來(lái)單獨配置,靈活性高,多租戶(hù)隔離性較弱。日志直寫(xiě)一般會(huì )和業(yè)務(wù)邏輯競爭資源。只能通過(guò)強配置隔離,通過(guò)容器隔離,資源可獨立分配,支持集群規模無(wú)限本地存儲。如果使用 syslog 和 fluentd,根據配置會(huì )有單點(diǎn)限制和無(wú)限制。無(wú)限資源數量低,dockerengine提供整體最低,節省采集的成本,每個(gè)節點(diǎn)運行一個(gè)容器高,每個(gè)POD運行一個(gè)容器,查詢(xún)便利性低,只有g(shù)rep raw日志高,可根據業(yè)務(wù)特點(diǎn)定制高,可定制查詢(xún),高統計,可根據業(yè)務(wù)特點(diǎn)定制低高可定制性,可自由擴展低高,每個(gè)POD單獨配置高耦合,并且強綁定 DockerEngine 固定,修改需要重啟 DockerEngine 高,<
日志輸出:標準輸出或文件
與虛擬機/物理機不同,K8s 容器提供標準輸出和文件。在容器中,標準輸出直接將日志輸出到stdout或stderr,DockerEngine接管stdout和stderr文件描述符,收到日志后根據DockerEngine配置的LogDriver規則進(jìn)行處理;日志打印到文件的方式與虛擬機/物理機不同?;绢?lèi)似,只是日志可以使用不同的存儲方式,比如默認存儲、EmptyDir、HostVolume、NFS等。
雖然 Docker 官方推薦使用 Stdout 打印日志,但需要注意的是,這個(gè)推薦是基于容器僅作為簡(jiǎn)單應用使用的場(chǎng)景。在實(shí)際業(yè)務(wù)場(chǎng)景中,我們還是建議大家盡量使用文件方式。主要原因如下。觀(guān)點(diǎn):
stdout性能問(wèn)題,從應用輸出stdout到服務(wù)器,會(huì )有幾個(gè)過(guò)程(比如常用的JSON LogDriver):應用stdout -> DockerEngine -> LogDriver -> 序列化成JSON -> 保存到文件 -> Agent< @采集文件 -> 解析 JSON -> 上傳服務(wù)器。整個(gè)過(guò)程需要比文件更多的開(kāi)銷(xiāo)。壓力測試時(shí),每秒輸出 10 萬(wàn)行日志會(huì )占用 DockerEngine 的額外 CPU 內核。stdout 不支持分類(lèi),即所有輸出混合在一個(gè)流中,不能像文件一樣分類(lèi)輸出。通常,一個(gè)應用程序包括AccessLog、ErrorLog、InterfaceLog(調用外部接口的日志)、TraceLog等。這些日志的格式和用途不,會(huì )很難采集 如果在同一流中混合,則進(jìn)行分析。stdout 只支持容器主程序的輸出。如果是 daemon/fork 模式下運行的程序,則無(wú)法使用 stdout。文件轉儲方式支持多種策略,如同步/異步寫(xiě)入、緩存大小、文件輪換策略、壓縮策略、清除策略等,相對更加靈活。
因此,我們建議在線(xiàn)應用使用文件輸出日志,而Stdout僅用于功能單一或部分K8s系統/運維組件的應用。
CICD 集成:日志記錄操作員
Kubernetes提供了標準化的業(yè)務(wù)部署方式,可以通過(guò)yaml(K8s API)聲明路由規則、暴露服務(wù)、掛載存儲、運行業(yè)務(wù)、定義伸縮規則等,因此Kubernetes很容易與CICD系統集成。日志采集也是運維監控過(guò)程的重要組成部分。必須實(shí)時(shí)采集業(yè)務(wù)上線(xiàn)后的所有日志。
原來(lái)的方法是在發(fā)布后手動(dòng)部署log采集的邏輯。這種方式需要人工干預,違背了CICD自動(dòng)化的目的;為了實(shí)現自動(dòng)化,已經(jīng)有人開(kāi)始基于日志包裝API/SDK采集一個(gè)自動(dòng)部署的服務(wù),發(fā)布后通過(guò)CICD的webhook觸發(fā)調用,但是這種方式開(kāi)發(fā)成本高。
在 Kubernetes 中,集成日志最標準的方式是在 Kubernetes 系統中注冊一個(gè)新資源,并以 Operator(CRD)的形式對其進(jìn)行管理和維護。這樣CICD系統就不需要額外開(kāi)發(fā),部署到Kubernetes系統時(shí)只需要附加日志相關(guān)的配置即可。
Kubernetes 日志采集 方案
早在 Kubernetes 出現之前,我們就開(kāi)始為容器環(huán)境開(kāi)發(fā) log采集 解決方案。隨著(zhù)K8s的逐漸穩定,我們開(kāi)始將很多業(yè)務(wù)遷移到K8s平臺上,所以我們也在之前的基礎上開(kāi)發(fā)了一套。K8s 上的 log采集 方案。主要功能有:
支持各種數據的實(shí)時(shí)采集,包括容器文件、容器Stdout、宿主文件、Journal、Event等;支持多種采集部署方式,包括DaemonSet、Sidecar、DockerEngine LogDriver等;日志數據豐富,包括Namespace、Pod、Container、Image、Node等附加信息;穩定高可靠,基于阿里巴巴自研Logtail采集Agent實(shí)現。目前,全網(wǎng)部署實(shí)例數以百萬(wàn)計。; 基于CRD擴展,日志采集規則可以以Kubernetes部署發(fā)布的方式部署,與CICD完美集成。
安裝日志采集組件
目前,這個(gè)采集解決方案已經(jīng)對外開(kāi)放。我們提供 Helm 安裝包,收錄 Logtail 的 DaemonSet、AliyunlogConfig 的 CRD 聲明和 CRD Controller。安裝后直接使用DaemonS優(yōu)采云采集器即可,CRD配置完畢。安裝方法如下:
阿里云Kubernetes集群在激活的時(shí)候就可以安裝,這樣在創(chuàng )建集群的時(shí)候會(huì )自動(dòng)安裝以上的組件。如果激活的時(shí)候沒(méi)有安裝,可以手動(dòng)安裝。如果是自建Kubernetes,無(wú)論是自建在阿里云上還是在其他云上還是離線(xiàn),都可以使用這個(gè)采集方案。具體安裝方法請參考【自建Kubernetes安裝】()。
上述組件安裝完成后,Logtail和對應的Controller會(huì )在集群中運行,但默認這些組件不會(huì )采集任何日志,需要配置日志采集規則為采集@ > 指定各種日志的Pod。
采集規則配置:環(huán)境變量或CRD
除了在日志服務(wù)控制臺手動(dòng)配置外,Kubernetes 還支持另外兩種配置方式:環(huán)境變量和 CRD。
環(huán)境變量是自swarm時(shí)代以來(lái)一直使用的配置方式。你只需要在你想要采集的容器環(huán)境變量上聲明需要采集的數據地址,Logtail會(huì )自動(dòng)采集這個(gè)數據>到服務(wù)器。該方法部署簡(jiǎn)單,學(xué)習成本低,易于使用;但是可以支持的配置規則很少,很多高級配置(如解析方式、過(guò)濾方式、黑白名單等)都不支持,而且這種聲明方式也不支持修改/刪除,每個(gè)修改實(shí)際上創(chuàng )建了一個(gè)新的 采集 配置。歷史采集配置需要手動(dòng)清理,否則會(huì )造成資源浪費。
CRD的配置方式非常符合Kubernetes官方推薦的標準擴展方式,允許采集配置以K8s資源的形式進(jìn)行管理,通過(guò)部署特殊的CRD資源AliyunLogConfig到Kubernetes來(lái)聲明數據這需要 采集。例如,下面的例子是部署一個(gè)容器的標準輸出采集,其中定義需要Stdout和Stderr 采集,并且排除環(huán)境變量收錄COLLEXT_STDOUT_FLAG: false的容器?;贑RD的配置方式以Kubernetes標準擴展資源的方式進(jìn)行管理,支持配置的完整語(yǔ)義的增刪改查,支持各種高級配置。
采集推薦的規則配置方式
在實(shí)際應用場(chǎng)景中,一般使用 DaemonSet 或者 DaemonSet 和 Sidecar 的混合。DaemonSet 的優(yōu)點(diǎn)是資源利用率高。但是存在一個(gè)問(wèn)題,DaemonSet的所有Logtail共享全局配置,單個(gè)Logtail有配置支持上限。因此,它無(wú)法支持具有大量應用程序的集群。以上是我們給出的推薦配置方式。核心思想是:
一個(gè)盡可能多的采集相似數據的配置,減少了配置的數量,減輕了DaemonSet的壓力;核心應用 采集 需要獲得足夠的資源,并且可以使用 Sidecar 方法;配置方式盡量使用CRD方式;Sidecar 由于每個(gè)Logtail都是獨立配置的,所以配置數量沒(méi)有限制,適用于非常大的集群。
練習 1 - 中小型集群
大多數 Kubernetes 集群都是中小型的。中小企業(yè)沒(méi)有明確的定義。一般應用數量小于500,節點(diǎn)規模小于1000。沒(méi)有功能清晰的Kubernetes平臺運維。這個(gè)場(chǎng)景的應用數量不是特別多,DaemonSet可以支持所有的采集配置:
大部分業(yè)務(wù)應用的數據使用DaemonS優(yōu)采云采集器方式,核心應用(對于可靠性要求較高的采集,如訂單/交易系統)單獨使用Sidecar方式采集 @>
練習 2 - 大型集群
對于一些用作PAAS平臺的大型/超大型集群,一般業(yè)務(wù)在1000以上,節點(diǎn)規模也在1000以上。有專(zhuān)門(mén)的Kubernetes平臺運維人員。這種場(chǎng)景下應用的數量沒(méi)有限制,DaemonSet 無(wú)法支持。因此,必須使用 Sidecar 方法??傮w規劃如下:
Kubernetes平臺的系統組件日志和內核日志的類(lèi)型是比較固定的。這部分日志使用了DaemonS優(yōu)采云采集器,主要為平臺的運維人員提供服務(wù);每個(gè)業(yè)務(wù)的日志使用Sidecar方式采集,每個(gè)業(yè)務(wù)可以獨立設置Sidecar的采集目的地址,為業(yè)務(wù)的DevOps人員提供了足夠的靈活性。 查看全部
文章采集api(【干貨】Kubernetes日志采集難點(diǎn)分析(一)——Kubernetes)
前言
上一期主要介紹了Kubernetes日志輸出的一些注意事項。日志輸出的最終目的是做統一的采集和分析。在 Kubernetes 中,記錄采集的方式與普通虛擬機有很大不同,相對實(shí)現難度和部署成本也略高。但是,如果使用得當,可以實(shí)現比傳統方式更高的自動(dòng)化程度和更低的運維成本。
Kubernetes 日志采集 難點(diǎn)
在 Kubernetes 中,log采集 比傳統的虛擬機和物理機要復雜得多。最根本的原因是Kubernetes屏蔽了底層異常,提供了更細粒度的資源調度,向上提供了一個(gè)穩定動(dòng)態(tài)的環(huán)境。因此,日志采集面臨著(zhù)更豐富、更動(dòng)態(tài)的環(huán)境,需要考慮的點(diǎn)也更多。
例如:
對于一個(gè)運行時(shí)間很短的Job應用,從啟動(dòng)到停止只需要幾秒,如何保證日志采集的實(shí)時(shí)性能跟得上,數據不丟失?K8s 一般推薦使用大型節點(diǎn)。每個(gè)節點(diǎn)可以運行 10-100+ 個(gè)容器。如何以盡可能低的資源消耗采集100+ 個(gè)容器?在K8s中,應用以yaml的形式部署,日志采集主要是手動(dòng)配置文件的形式。日志采集如何以K8s的方式部署?
Kubernetes傳統日志類(lèi)型文件、stdout、host文件、journal文件、journal日志源業(yè)務(wù)容器、系統組件、宿主業(yè)務(wù)、宿主采集方法代理(Sidecar、DaemonSet)、直寫(xiě)(DockerEngine、業(yè)務(wù))代理、直接-write 單機應用號 10-1001-10 應用動(dòng)態(tài)高低 節點(diǎn)動(dòng)態(tài)高低 采集 部署方式手動(dòng)、Yaml手動(dòng)、自定義
采集模式:主動(dòng)或被動(dòng)
日志采集方法有兩種:被動(dòng)采集和主動(dòng)推送。在K8s中,被動(dòng)采集一般分為Sidecar和DaemonSet兩種方式。主動(dòng)推送包括 DockerEngine 推送和業(yè)務(wù)直推。寫(xiě)兩種方式。
總結:DockerEngine直接寫(xiě)一般不推薦;日志量大的場(chǎng)景推薦業(yè)務(wù)直寫(xiě);DaemonSet 一般用于中小型集群;建議在非常大的集群中使用 Sidecar。各種采集方法的詳細對比如下:
DockerEngine業(yè)務(wù)直接寫(xiě)入DaemonSet方法Sidecar方法采集日志類(lèi)型標準輸出業(yè)務(wù)日志標準輸出+部分文件文件部署運維低,原生支持低,只需要維護配置文件正常,需要為了維護 DaemonSet 高,每個(gè)需要 采集 日志的 POD 都需要部署一個(gè) sidecar 容器。日志分類(lèi)和存儲無(wú)法實(shí)現業(yè)務(wù)無(wú)關(guān)的配置。一般來(lái)說(shuō),每個(gè)POD都可以通過(guò)容器/路徑映射來(lái)單獨配置,靈活性高,多租戶(hù)隔離性較弱。日志直寫(xiě)一般會(huì )和業(yè)務(wù)邏輯競爭資源。只能通過(guò)強配置隔離,通過(guò)容器隔離,資源可獨立分配,支持集群規模無(wú)限本地存儲。如果使用 syslog 和 fluentd,根據配置會(huì )有單點(diǎn)限制和無(wú)限制。無(wú)限資源數量低,dockerengine提供整體最低,節省采集的成本,每個(gè)節點(diǎn)運行一個(gè)容器高,每個(gè)POD運行一個(gè)容器,查詢(xún)便利性低,只有g(shù)rep raw日志高,可根據業(yè)務(wù)特點(diǎn)定制高,可定制查詢(xún),高統計,可根據業(yè)務(wù)特點(diǎn)定制低高可定制性,可自由擴展低高,每個(gè)POD單獨配置高耦合,并且強綁定 DockerEngine 固定,修改需要重啟 DockerEngine 高,<
日志輸出:標準輸出或文件
與虛擬機/物理機不同,K8s 容器提供標準輸出和文件。在容器中,標準輸出直接將日志輸出到stdout或stderr,DockerEngine接管stdout和stderr文件描述符,收到日志后根據DockerEngine配置的LogDriver規則進(jìn)行處理;日志打印到文件的方式與虛擬機/物理機不同?;绢?lèi)似,只是日志可以使用不同的存儲方式,比如默認存儲、EmptyDir、HostVolume、NFS等。
雖然 Docker 官方推薦使用 Stdout 打印日志,但需要注意的是,這個(gè)推薦是基于容器僅作為簡(jiǎn)單應用使用的場(chǎng)景。在實(shí)際業(yè)務(wù)場(chǎng)景中,我們還是建議大家盡量使用文件方式。主要原因如下。觀(guān)點(diǎn):
stdout性能問(wèn)題,從應用輸出stdout到服務(wù)器,會(huì )有幾個(gè)過(guò)程(比如常用的JSON LogDriver):應用stdout -> DockerEngine -> LogDriver -> 序列化成JSON -> 保存到文件 -> Agent< @采集文件 -> 解析 JSON -> 上傳服務(wù)器。整個(gè)過(guò)程需要比文件更多的開(kāi)銷(xiāo)。壓力測試時(shí),每秒輸出 10 萬(wàn)行日志會(huì )占用 DockerEngine 的額外 CPU 內核。stdout 不支持分類(lèi),即所有輸出混合在一個(gè)流中,不能像文件一樣分類(lèi)輸出。通常,一個(gè)應用程序包括AccessLog、ErrorLog、InterfaceLog(調用外部接口的日志)、TraceLog等。這些日志的格式和用途不,會(huì )很難采集 如果在同一流中混合,則進(jìn)行分析。stdout 只支持容器主程序的輸出。如果是 daemon/fork 模式下運行的程序,則無(wú)法使用 stdout。文件轉儲方式支持多種策略,如同步/異步寫(xiě)入、緩存大小、文件輪換策略、壓縮策略、清除策略等,相對更加靈活。
因此,我們建議在線(xiàn)應用使用文件輸出日志,而Stdout僅用于功能單一或部分K8s系統/運維組件的應用。
CICD 集成:日志記錄操作員
Kubernetes提供了標準化的業(yè)務(wù)部署方式,可以通過(guò)yaml(K8s API)聲明路由規則、暴露服務(wù)、掛載存儲、運行業(yè)務(wù)、定義伸縮規則等,因此Kubernetes很容易與CICD系統集成。日志采集也是運維監控過(guò)程的重要組成部分。必須實(shí)時(shí)采集業(yè)務(wù)上線(xiàn)后的所有日志。
原來(lái)的方法是在發(fā)布后手動(dòng)部署log采集的邏輯。這種方式需要人工干預,違背了CICD自動(dòng)化的目的;為了實(shí)現自動(dòng)化,已經(jīng)有人開(kāi)始基于日志包裝API/SDK采集一個(gè)自動(dòng)部署的服務(wù),發(fā)布后通過(guò)CICD的webhook觸發(fā)調用,但是這種方式開(kāi)發(fā)成本高。
在 Kubernetes 中,集成日志最標準的方式是在 Kubernetes 系統中注冊一個(gè)新資源,并以 Operator(CRD)的形式對其進(jìn)行管理和維護。這樣CICD系統就不需要額外開(kāi)發(fā),部署到Kubernetes系統時(shí)只需要附加日志相關(guān)的配置即可。
Kubernetes 日志采集 方案
早在 Kubernetes 出現之前,我們就開(kāi)始為容器環(huán)境開(kāi)發(fā) log采集 解決方案。隨著(zhù)K8s的逐漸穩定,我們開(kāi)始將很多業(yè)務(wù)遷移到K8s平臺上,所以我們也在之前的基礎上開(kāi)發(fā)了一套。K8s 上的 log采集 方案。主要功能有:
支持各種數據的實(shí)時(shí)采集,包括容器文件、容器Stdout、宿主文件、Journal、Event等;支持多種采集部署方式,包括DaemonSet、Sidecar、DockerEngine LogDriver等;日志數據豐富,包括Namespace、Pod、Container、Image、Node等附加信息;穩定高可靠,基于阿里巴巴自研Logtail采集Agent實(shí)現。目前,全網(wǎng)部署實(shí)例數以百萬(wàn)計。; 基于CRD擴展,日志采集規則可以以Kubernetes部署發(fā)布的方式部署,與CICD完美集成。
安裝日志采集組件
目前,這個(gè)采集解決方案已經(jīng)對外開(kāi)放。我們提供 Helm 安裝包,收錄 Logtail 的 DaemonSet、AliyunlogConfig 的 CRD 聲明和 CRD Controller。安裝后直接使用DaemonS優(yōu)采云采集器即可,CRD配置完畢。安裝方法如下:
阿里云Kubernetes集群在激活的時(shí)候就可以安裝,這樣在創(chuàng )建集群的時(shí)候會(huì )自動(dòng)安裝以上的組件。如果激活的時(shí)候沒(méi)有安裝,可以手動(dòng)安裝。如果是自建Kubernetes,無(wú)論是自建在阿里云上還是在其他云上還是離線(xiàn),都可以使用這個(gè)采集方案。具體安裝方法請參考【自建Kubernetes安裝】()。
上述組件安裝完成后,Logtail和對應的Controller會(huì )在集群中運行,但默認這些組件不會(huì )采集任何日志,需要配置日志采集規則為采集@ > 指定各種日志的Pod。
采集規則配置:環(huán)境變量或CRD
除了在日志服務(wù)控制臺手動(dòng)配置外,Kubernetes 還支持另外兩種配置方式:環(huán)境變量和 CRD。
環(huán)境變量是自swarm時(shí)代以來(lái)一直使用的配置方式。你只需要在你想要采集的容器環(huán)境變量上聲明需要采集的數據地址,Logtail會(huì )自動(dòng)采集這個(gè)數據>到服務(wù)器。該方法部署簡(jiǎn)單,學(xué)習成本低,易于使用;但是可以支持的配置規則很少,很多高級配置(如解析方式、過(guò)濾方式、黑白名單等)都不支持,而且這種聲明方式也不支持修改/刪除,每個(gè)修改實(shí)際上創(chuàng )建了一個(gè)新的 采集 配置。歷史采集配置需要手動(dòng)清理,否則會(huì )造成資源浪費。
CRD的配置方式非常符合Kubernetes官方推薦的標準擴展方式,允許采集配置以K8s資源的形式進(jìn)行管理,通過(guò)部署特殊的CRD資源AliyunLogConfig到Kubernetes來(lái)聲明數據這需要 采集。例如,下面的例子是部署一個(gè)容器的標準輸出采集,其中定義需要Stdout和Stderr 采集,并且排除環(huán)境變量收錄COLLEXT_STDOUT_FLAG: false的容器?;贑RD的配置方式以Kubernetes標準擴展資源的方式進(jìn)行管理,支持配置的完整語(yǔ)義的增刪改查,支持各種高級配置。
采集推薦的規則配置方式
在實(shí)際應用場(chǎng)景中,一般使用 DaemonSet 或者 DaemonSet 和 Sidecar 的混合。DaemonSet 的優(yōu)點(diǎn)是資源利用率高。但是存在一個(gè)問(wèn)題,DaemonSet的所有Logtail共享全局配置,單個(gè)Logtail有配置支持上限。因此,它無(wú)法支持具有大量應用程序的集群。以上是我們給出的推薦配置方式。核心思想是:
一個(gè)盡可能多的采集相似數據的配置,減少了配置的數量,減輕了DaemonSet的壓力;核心應用 采集 需要獲得足夠的資源,并且可以使用 Sidecar 方法;配置方式盡量使用CRD方式;Sidecar 由于每個(gè)Logtail都是獨立配置的,所以配置數量沒(méi)有限制,適用于非常大的集群。
練習 1 - 中小型集群
大多數 Kubernetes 集群都是中小型的。中小企業(yè)沒(méi)有明確的定義。一般應用數量小于500,節點(diǎn)規模小于1000。沒(méi)有功能清晰的Kubernetes平臺運維。這個(gè)場(chǎng)景的應用數量不是特別多,DaemonSet可以支持所有的采集配置:
大部分業(yè)務(wù)應用的數據使用DaemonS優(yōu)采云采集器方式,核心應用(對于可靠性要求較高的采集,如訂單/交易系統)單獨使用Sidecar方式采集 @>
練習 2 - 大型集群
對于一些用作PAAS平臺的大型/超大型集群,一般業(yè)務(wù)在1000以上,節點(diǎn)規模也在1000以上。有專(zhuān)門(mén)的Kubernetes平臺運維人員。這種場(chǎng)景下應用的數量沒(méi)有限制,DaemonSet 無(wú)法支持。因此,必須使用 Sidecar 方法??傮w規劃如下:
Kubernetes平臺的系統組件日志和內核日志的類(lèi)型是比較固定的。這部分日志使用了DaemonS優(yōu)采云采集器,主要為平臺的運維人員提供服務(wù);每個(gè)業(yè)務(wù)的日志使用Sidecar方式采集,每個(gè)業(yè)務(wù)可以獨立設置Sidecar的采集目的地址,為業(yè)務(wù)的DevOps人員提供了足夠的靈活性。
文章采集api(來(lái)說(shuō)獲得用戶(hù)專(zhuān)欄文章的鏈接信息,此乃神器!)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 147 次瀏覽 ? 2022-02-17 05:24
目前還沒(méi)有官方API支持?;蛟S最有用的就是用戶(hù)的“個(gè)性化URL”(好別扭,以下簡(jiǎn)稱(chēng)UID),比如黃繼新老師的UID:jixin,不過(guò)可以用戶(hù)自己修改,但是每個(gè)用戶(hù)都必須是獨特的。
將對應的 UID 替換為 {{%UID}}。
1. 獲取用戶(hù)列條目:
URI: http://www.zhihu.com/people/{{%UID}}/posts GET/HTTP 1.1
XPATH: //div[@id='zh-profile-list-container']
通過(guò)解析上述內容,可以得到用戶(hù)的所有列入口地址。
2. 獲取列 文章 信息:
URI: http://zhuanlan.zhihu.com/api/columns/{{%UID}}/posts?limit={{%LIMIT}}&offset={{%OFFSET}} GET/HTTP 1.1
{{%LIMIT}}:表示本次GET請求獲取的數據項個(gè)數,即文章列信息的個(gè)數。我沒(méi)有具體測試過(guò)最大值是多少,但是可以設置大于默認值。默認值為 10。
{{%OFFSET}}:表示本次GET請求獲取的數據項的起始偏移量。
通過(guò)分析以上內容,可以得到每一列文章的信息,如標題、題圖、列文章摘要、發(fā)布時(shí)間、批準數等。請求返回JSON數據。
注意:解析該信息時(shí),可以得到該列文章的鏈接信息。
3. 獲取列 文章:
URI: http://zhuanlan.zhihu.com/api/columns/{{%UID}}/posts/{{%SLUG}} GET/HTTP 1.1
{{%SLUG}}:是2中得到的文章鏈接信息,目前是8位數字。
通過(guò)分析以上內容,可以得到文章欄的內容,以及文章的一些相關(guān)信息。請求返回 JSON 數據。
以上應該足以滿(mǎn)足題主的要求。最重要的是用好Chrome調試工具,這是神器!
* * * * * * * * * *
這里有一些零散的更新來(lái)記錄 知乎 爬蟲(chóng)的想法。當然,相關(guān)實(shí)現還是需要尊重ROBOTS協(xié)議,可以通過(guò)
/機器人.txt
檢查相關(guān)參數。
UID是用戶(hù)所有信息的入口。
雖然用戶(hù)信息有修改間隔限制(一般為幾個(gè)月不等),但考慮到即使是修改用戶(hù)名的操作也會(huì )導致UID發(fā)生變化,從而使之前的存儲失效。當然,這也可以破解:用戶(hù)哈希。這個(gè)哈希值是一個(gè) 32 位的字符串,對于每個(gè)賬戶(hù)來(lái)說(shuō)都是唯一且不變的。
通過(guò) UID 獲取哈希:
URI: http://www.zhihu.com/people/%{{UID}} GET/HTTP 1.1
XPATH: //body/div[@class='zg-wrap zu-main']//div[@class='zm-profile-header-op-btns clearfix']/button/@data-id
通過(guò)解析上面的內容,可以得到UID對應的hash值。(是的,該值存儲在“關(guān)注/取消關(guān)注”按鈕中。)這唯一地標識了用戶(hù)。
目前沒(méi)有辦法通過(guò)hash_id獲取UID,但是有間接方法可以參考:定期通過(guò)關(guān)注列表查看用戶(hù)信息是否發(fā)生變化,當然關(guān)注/取消關(guān)注操作也可以自動(dòng)化:
關(guān)注操作
URI: http://www.zhihu.com/node/MemberFollowBaseV2 POST/HTTP 1.1
Form Data
method: follow_member
params: {"hash_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}
_xsrf:
取消關(guān)注操作
URI: http://www.zhihu.com/node/MemberFollowBaseV2 POST/HTTP 1.1
Form Data
method: unfollow_member
params: {"hash_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}
_xsrf:
知乎爬蟲(chóng)需要一個(gè)UID列表才能正常運行,如何獲取這個(gè)列表是需要考慮的問(wèn)題。目前一個(gè)可行的思路是選擇幾個(gè)大V用戶(hù),批量爬取他們的關(guān)注列表。比如張老師目前跟隨著(zhù)58W+,通過(guò):
URI: http://www.zhihu.com/node/ProfileFollowersListV2 POST/HTTP 1.1
Form Data
method: next
params: {"offset": {{%OFFSET}}, "order_by": "hash_id", "hash_id": "{{%HASHID}}"}
_xsrf:
每次可以獲得20個(gè)關(guān)注者的用戶(hù)信息。此信息包括 hash_id、用戶(hù)名、UID、關(guān)注者/關(guān)注者數量、問(wèn)題數量、答案數量等。 查看全部
文章采集api(來(lái)說(shuō)獲得用戶(hù)專(zhuān)欄文章的鏈接信息,此乃神器!)
目前還沒(méi)有官方API支持?;蛟S最有用的就是用戶(hù)的“個(gè)性化URL”(好別扭,以下簡(jiǎn)稱(chēng)UID),比如黃繼新老師的UID:jixin,不過(guò)可以用戶(hù)自己修改,但是每個(gè)用戶(hù)都必須是獨特的。
將對應的 UID 替換為 {{%UID}}。
1. 獲取用戶(hù)列條目:
URI: http://www.zhihu.com/people/{{%UID}}/posts GET/HTTP 1.1
XPATH: //div[@id='zh-profile-list-container']
通過(guò)解析上述內容,可以得到用戶(hù)的所有列入口地址。
2. 獲取列 文章 信息:
URI: http://zhuanlan.zhihu.com/api/columns/{{%UID}}/posts?limit={{%LIMIT}}&offset={{%OFFSET}} GET/HTTP 1.1
{{%LIMIT}}:表示本次GET請求獲取的數據項個(gè)數,即文章列信息的個(gè)數。我沒(méi)有具體測試過(guò)最大值是多少,但是可以設置大于默認值。默認值為 10。
{{%OFFSET}}:表示本次GET請求獲取的數據項的起始偏移量。
通過(guò)分析以上內容,可以得到每一列文章的信息,如標題、題圖、列文章摘要、發(fā)布時(shí)間、批準數等。請求返回JSON數據。
注意:解析該信息時(shí),可以得到該列文章的鏈接信息。
3. 獲取列 文章:
URI: http://zhuanlan.zhihu.com/api/columns/{{%UID}}/posts/{{%SLUG}} GET/HTTP 1.1
{{%SLUG}}:是2中得到的文章鏈接信息,目前是8位數字。
通過(guò)分析以上內容,可以得到文章欄的內容,以及文章的一些相關(guān)信息。請求返回 JSON 數據。
以上應該足以滿(mǎn)足題主的要求。最重要的是用好Chrome調試工具,這是神器!
* * * * * * * * * *
這里有一些零散的更新來(lái)記錄 知乎 爬蟲(chóng)的想法。當然,相關(guān)實(shí)現還是需要尊重ROBOTS協(xié)議,可以通過(guò)
/機器人.txt
檢查相關(guān)參數。
UID是用戶(hù)所有信息的入口。
雖然用戶(hù)信息有修改間隔限制(一般為幾個(gè)月不等),但考慮到即使是修改用戶(hù)名的操作也會(huì )導致UID發(fā)生變化,從而使之前的存儲失效。當然,這也可以破解:用戶(hù)哈希。這個(gè)哈希值是一個(gè) 32 位的字符串,對于每個(gè)賬戶(hù)來(lái)說(shuō)都是唯一且不變的。
通過(guò) UID 獲取哈希:
URI: http://www.zhihu.com/people/%{{UID}} GET/HTTP 1.1
XPATH: //body/div[@class='zg-wrap zu-main']//div[@class='zm-profile-header-op-btns clearfix']/button/@data-id
通過(guò)解析上面的內容,可以得到UID對應的hash值。(是的,該值存儲在“關(guān)注/取消關(guān)注”按鈕中。)這唯一地標識了用戶(hù)。
目前沒(méi)有辦法通過(guò)hash_id獲取UID,但是有間接方法可以參考:定期通過(guò)關(guān)注列表查看用戶(hù)信息是否發(fā)生變化,當然關(guān)注/取消關(guān)注操作也可以自動(dòng)化:
關(guān)注操作
URI: http://www.zhihu.com/node/MemberFollowBaseV2 POST/HTTP 1.1
Form Data
method: follow_member
params: {"hash_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}
_xsrf:
取消關(guān)注操作
URI: http://www.zhihu.com/node/MemberFollowBaseV2 POST/HTTP 1.1
Form Data
method: unfollow_member
params: {"hash_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}
_xsrf:
知乎爬蟲(chóng)需要一個(gè)UID列表才能正常運行,如何獲取這個(gè)列表是需要考慮的問(wèn)題。目前一個(gè)可行的思路是選擇幾個(gè)大V用戶(hù),批量爬取他們的關(guān)注列表。比如張老師目前跟隨著(zhù)58W+,通過(guò):
URI: http://www.zhihu.com/node/ProfileFollowersListV2 POST/HTTP 1.1
Form Data
method: next
params: {"offset": {{%OFFSET}}, "order_by": "hash_id", "hash_id": "{{%HASHID}}"}
_xsrf:
每次可以獲得20個(gè)關(guān)注者的用戶(hù)信息。此信息包括 hash_id、用戶(hù)名、UID、關(guān)注者/關(guān)注者數量、問(wèn)題數量、答案數量等。
文章采集api(什么是zhihu-articles-api(.json)。。)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 135 次瀏覽 ? 2022-02-16 14:20
簡(jiǎn)介:知乎-articles-api
將您的 知乎文章 導出為可用的 API (.json)。
什么是知乎文章API?
知乎-articles-api 是一個(gè)基于 JavaScript DOM 的腳本,通過(guò) DOM 將你的 知乎文章 導出為 json 格式的 API 文檔,其中收錄標題、鏈接、標題圖等信息。這些 API 可用于其他網(wǎng)站或您自己來(lái)顯示您創(chuàng )建的內容。當用戶(hù)訪(fǎng)問(wèn)這些內容時(shí),用戶(hù)會(huì )跳轉到知乎,從而批準和評論您的內容。
如何使用知乎文章API?
與其他 JavaScript 腳本一樣,您需要使用瀏覽器的調試功能來(lái)執行這些腳本。
首先,您需要訪(fǎng)問(wèn)您的個(gè)人主頁(yè)。
知乎的個(gè)人主頁(yè)一般是:
您的個(gè)人域名
如果您不知道自己的個(gè)人域名,可以從首頁(yè)右上角的頭像訪(fǎng)問(wèn)“我的首頁(yè)”。
切換到“文章”選項卡
zaa 只能在該選項卡下工作。
如果您希望導出其他內容,請務(wù)必仔細閱讀源代碼并修改相關(guān)內容。
在這個(gè)選項卡下,通過(guò)調試腳本的執行,瀏覽器會(huì )自動(dòng)下載一個(gè)名為username.json的文件。
腳本:
例子:
{
"Article_0": {
"headline": "為K100 Pro更換更大容量的電池",
"url": "zhuanlan.zhihu.com/p/205607070",
"dateP": "2020-08-29T14:22:15.000Z",
"dateM": "2020-09-01T17:17:49.000Z",
"img": "https://pic4.zhimg.com/v2-8ac0 ... ot%3B
},
"Article_1": {
"headline": "ES6動(dòng)態(tài)計算屬性名的另外一種用法/屬性名表達式",
"url": "zhuanlan.zhihu.com/p/199698763",
"dateP": "2020-08-26T15:24:06.000Z",
"dateM": "2020-08-27T02:42:41.000Z",
"img": "https://pic4.zhimg.com/v2-8ac0 ... ot%3B
},
"Article_2": {
"headline": "為Vuetify的UI組件添加滾動(dòng)條",
"url": "zhuanlan.zhihu.com/p/196736891",
"dateP": "2020-08-24T10:25:53.000Z",
"dateM": "2020-08-24T10:25:53.000Z",
"img": "https://pic4.zhimg.com/v2-8ac0 ... ot%3B
},
"Article_3": {
"headline": "解決移動(dòng)端左右滑動(dòng)/溢出問(wèn)題",
"url": "zhuanlan.zhihu.com/p/194403402",
"dateP": "2020-08-22T16:20:05.000Z",
"dateM": "2020-08-22T16:20:05.000Z",
"img": "https://pic4.zhimg.com/v2-8ac0 ... ot%3B
},
知乎-articles-api 合法嗎?
與所有爬蟲(chóng)、API 等一樣,請確保您在相關(guān)用戶(hù)協(xié)議的規范范圍內使用您獲取的內容。
由于 知乎-articles-api 在 DOM 上運行,獲取的內容是公開(kāi)可用的,并且已經(jīng)加載到用戶(hù)端,我認為這不會(huì )導致非法行為。
但是,請不要將本腳本用于非您創(chuàng )作的內容,也不要將本腳本獲得的內容用于商業(yè)目的,本人對本腳本的任何使用概不負責。
我還是不明白這個(gè)腳本是做什么的
對于托管在 Github 上的靜態(tài)頁(yè)面,如何動(dòng)態(tài)生成博文是一個(gè)非常棘手的問(wèn)題。如果使用普通的靜態(tài)頁(yè)面生成器(markdown),雖然可行,但還是不方便更新維護。個(gè)人網(wǎng)站的流量往往比較少,不利于創(chuàng )意內容的傳播。
通過(guò)知乎-articles-api,將你的文章轉換成API,生成json文件。將此文件部署到對象存儲并進(jìn)行 CDN 分發(fā)。根據這個(gè)json文件生成文章的列表,可以實(shí)現創(chuàng )作內容的遷移。只要在云端修改json文件,就可以動(dòng)態(tài)修改靜態(tài)頁(yè)面的內容,無(wú)需重新生成靜態(tài)頁(yè)面。
簡(jiǎn)單來(lái)說(shuō),你將自己創(chuàng )建的內容托管在知乎上,相關(guān)的靜態(tài)資源也托管在知乎的服務(wù)器上。
已知問(wèn)題和版本更新:
版本 1.00:
如果你的標題圖片是.png格式的透明文件,知乎可能會(huì )在服務(wù)器上生成兩個(gè)文件,白色背景和源文件。通過(guò)知乎-articles-api生成json文件時(shí),只能訪(fǎng)問(wèn)前者。如果您的網(wǎng)站使用深色主題或夜間模式,則可能值得考慮將 知乎 源文件替換為其他來(lái)源的 .png 文件。
感激:
將對象導出為 JSON:
根據自定義屬性獲取元素(原文已過(guò)期,這是轉載鏈接): 查看全部
文章采集api(什么是zhihu-articles-api(.json)。。)
簡(jiǎn)介:知乎-articles-api
將您的 知乎文章 導出為可用的 API (.json)。
什么是知乎文章API?
知乎-articles-api 是一個(gè)基于 JavaScript DOM 的腳本,通過(guò) DOM 將你的 知乎文章 導出為 json 格式的 API 文檔,其中收錄標題、鏈接、標題圖等信息。這些 API 可用于其他網(wǎng)站或您自己來(lái)顯示您創(chuàng )建的內容。當用戶(hù)訪(fǎng)問(wèn)這些內容時(shí),用戶(hù)會(huì )跳轉到知乎,從而批準和評論您的內容。
如何使用知乎文章API?
與其他 JavaScript 腳本一樣,您需要使用瀏覽器的調試功能來(lái)執行這些腳本。
首先,您需要訪(fǎng)問(wèn)您的個(gè)人主頁(yè)。
知乎的個(gè)人主頁(yè)一般是:
您的個(gè)人域名
如果您不知道自己的個(gè)人域名,可以從首頁(yè)右上角的頭像訪(fǎng)問(wèn)“我的首頁(yè)”。
切換到“文章”選項卡
zaa 只能在該選項卡下工作。
如果您希望導出其他內容,請務(wù)必仔細閱讀源代碼并修改相關(guān)內容。
在這個(gè)選項卡下,通過(guò)調試腳本的執行,瀏覽器會(huì )自動(dòng)下載一個(gè)名為username.json的文件。
腳本:
例子:
{
"Article_0": {
"headline": "為K100 Pro更換更大容量的電池",
"url": "zhuanlan.zhihu.com/p/205607070",
"dateP": "2020-08-29T14:22:15.000Z",
"dateM": "2020-09-01T17:17:49.000Z",
"img": "https://pic4.zhimg.com/v2-8ac0 ... ot%3B
},
"Article_1": {
"headline": "ES6動(dòng)態(tài)計算屬性名的另外一種用法/屬性名表達式",
"url": "zhuanlan.zhihu.com/p/199698763",
"dateP": "2020-08-26T15:24:06.000Z",
"dateM": "2020-08-27T02:42:41.000Z",
"img": "https://pic4.zhimg.com/v2-8ac0 ... ot%3B
},
"Article_2": {
"headline": "為Vuetify的UI組件添加滾動(dòng)條",
"url": "zhuanlan.zhihu.com/p/196736891",
"dateP": "2020-08-24T10:25:53.000Z",
"dateM": "2020-08-24T10:25:53.000Z",
"img": "https://pic4.zhimg.com/v2-8ac0 ... ot%3B
},
"Article_3": {
"headline": "解決移動(dòng)端左右滑動(dòng)/溢出問(wèn)題",
"url": "zhuanlan.zhihu.com/p/194403402",
"dateP": "2020-08-22T16:20:05.000Z",
"dateM": "2020-08-22T16:20:05.000Z",
"img": "https://pic4.zhimg.com/v2-8ac0 ... ot%3B
},
知乎-articles-api 合法嗎?
與所有爬蟲(chóng)、API 等一樣,請確保您在相關(guān)用戶(hù)協(xié)議的規范范圍內使用您獲取的內容。
由于 知乎-articles-api 在 DOM 上運行,獲取的內容是公開(kāi)可用的,并且已經(jīng)加載到用戶(hù)端,我認為這不會(huì )導致非法行為。
但是,請不要將本腳本用于非您創(chuàng )作的內容,也不要將本腳本獲得的內容用于商業(yè)目的,本人對本腳本的任何使用概不負責。
我還是不明白這個(gè)腳本是做什么的
對于托管在 Github 上的靜態(tài)頁(yè)面,如何動(dòng)態(tài)生成博文是一個(gè)非常棘手的問(wèn)題。如果使用普通的靜態(tài)頁(yè)面生成器(markdown),雖然可行,但還是不方便更新維護。個(gè)人網(wǎng)站的流量往往比較少,不利于創(chuàng )意內容的傳播。
通過(guò)知乎-articles-api,將你的文章轉換成API,生成json文件。將此文件部署到對象存儲并進(jìn)行 CDN 分發(fā)。根據這個(gè)json文件生成文章的列表,可以實(shí)現創(chuàng )作內容的遷移。只要在云端修改json文件,就可以動(dòng)態(tài)修改靜態(tài)頁(yè)面的內容,無(wú)需重新生成靜態(tài)頁(yè)面。
簡(jiǎn)單來(lái)說(shuō),你將自己創(chuàng )建的內容托管在知乎上,相關(guān)的靜態(tài)資源也托管在知乎的服務(wù)器上。
已知問(wèn)題和版本更新:
版本 1.00:
如果你的標題圖片是.png格式的透明文件,知乎可能會(huì )在服務(wù)器上生成兩個(gè)文件,白色背景和源文件。通過(guò)知乎-articles-api生成json文件時(shí),只能訪(fǎng)問(wèn)前者。如果您的網(wǎng)站使用深色主題或夜間模式,則可能值得考慮將 知乎 源文件替換為其他來(lái)源的 .png 文件。
感激:
將對象導出為 JSON:
根據自定義屬性獲取元素(原文已過(guò)期,這是轉載鏈接):
文章采集api(網(wǎng)站權重越高是不是收錄速度就越快,是不是DedeCMS采集 )
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 153 次瀏覽 ? 2022-02-16 06:26
)
網(wǎng)站權重越高收錄速度越快,有沒(méi)有可能只要網(wǎng)站權重足夠高網(wǎng)站內容可以秒做< @收錄? 對于新站點(diǎn),低權限站點(diǎn)是否無(wú)法實(shí)現快速內容收錄?這樣想是一廂情愿的想法,也是不成熟的想法。
決定網(wǎng)站內容爬取速度的因素,以及搜索引擎影響網(wǎng)站爬取速度的核心因素,還是取決于你內容的屬性。對于咨詢(xún)等具有一定時(shí)效性?xún)热輰傩缘木W(wǎng)站,可以實(shí)現較好的收錄速度,秒級收錄即可?;谒阉饕?,意思是給用戶(hù)他們需要的信息。但信息化信息屬于優(yōu)質(zhì)內容,類(lèi)似重復內容的概率相對較小,因此更有價(jià)值。今天教大家一個(gè)快速的采集優(yōu)質(zhì)文章Dedecms采集(很多大佬都在用)。
這個(gè)dedecms采集不需要學(xué)習更專(zhuān)業(yè)的技術(shù),簡(jiǎn)單幾步就可以輕松采集內容數據,用戶(hù)只需要dedecms采集@對>進(jìn)行簡(jiǎn)單的設置,完成后dedecms采集會(huì )根據用戶(hù)設置的關(guān)鍵詞匹配內容和圖片的準確率,可以選擇保存在本地或者選擇< @k1@ >發(fā)布后,提供方便快捷的內容采集偽原創(chuàng )發(fā)布服務(wù)??!
和其他的Dedecms采集相比,這個(gè)Dedecms采集基本沒(méi)有什么門(mén)檻,也不需要花很多時(shí)間去學(xué)習正則表達式或者html標簽,一分鐘只需要輸入關(guān)鍵詞即可實(shí)現采集(dedecms采集也自帶關(guān)鍵詞采集的功能)。一路掛斷!設置任務(wù)自動(dòng)執行采集偽原創(chuàng )發(fā)布和推送任務(wù)。
幾十萬(wàn)個(gè)不同的cms網(wǎng)站可以統一管理。一個(gè)人維護數百個(gè) 網(wǎng)站文章 更新也不是問(wèn)題。
這類(lèi)Dedecms采集發(fā)布插件工具還配備了很多SEO功能。通過(guò)采集偽原創(chuàng )軟件發(fā)布時(shí),還可以提升很多SEO優(yōu)化。
例如:設置自動(dòng)下載圖片保存在本地或第三方(使內容不再有對方的外鏈)。自動(dòng)內鏈(讓搜索引擎更深入地抓取你的鏈接)、內容或標題插入,以及網(wǎng)站內容插入或隨機作者、隨機閱讀等,形成一個(gè)“高原創(chuàng )”。
這些SEO小功能不僅提高了網(wǎng)站頁(yè)面原創(chuàng )的度數,還間接提升了網(wǎng)站的收錄排名。您可以通過(guò)軟件工具上的監控管理直接查看文章采集的發(fā)布狀態(tài),不再需要每天登錄網(wǎng)站后臺查看。目前博主親測軟件是免費的,可以直接下載使用!
比如當大家看到一個(gè)引起你注意的熱搜,當你需要了解相關(guān)信息的時(shí)候,如果搜索引擎不能快速抓取并展示相關(guān)內容,那么就是非常糟糕的用戶(hù)體驗。.
這再次建立在上述觀(guān)點(diǎn)之上,如果高權重 網(wǎng)站 可以獲得良好的 收錄 速度,那么會(huì )發(fā)生什么?一般來(lái)說(shuō),很多高權重的網(wǎng)站信息量很大。如果權重高再去快速收錄,很有可能搜索引擎抓取壓力太大,所以顯示很不切實(shí)際的快速收錄對于很多< @網(wǎng)站。
比如圖庫網(wǎng)站,很多這類(lèi)網(wǎng)站網(wǎng)站的權重很高,每天的內容可能會(huì )增加成百上千。但是,這類(lèi)網(wǎng)站的特點(diǎn)就是內容在網(wǎng)絡(luò )上并不特殊,也沒(méi)有時(shí)效性,那么秒收這些網(wǎng)站又有什么意義呢。不僅不是秒收錄,這種類(lèi)型的網(wǎng)站很多頁(yè)面都不是收錄。
很多人會(huì )驚訝,權重這么高,怎么可能不是收錄?首先,例如,圖像 網(wǎng)站 的權重為 7,而另一個(gè)新聞類(lèi) 網(wǎng)站 的權重僅為 5。
基本上基于以上兩點(diǎn),新聞網(wǎng)站的收錄速度比較快。一是權重不是決定收錄的因素,二是所謂權重只是第三方工具根據關(guān)鍵詞預測流量。根據預估的站點(diǎn)流量,根據流量大小確定網(wǎng)站的權重評價(jià)。對于搜索引擎來(lái)說(shuō),根本就沒(méi)有所謂的權重,所以很多時(shí)候,權重高的網(wǎng)站在各方面的表現并不一定比搜索引擎好。重量輕 網(wǎng)站 有利于速度。
權重只能作為優(yōu)化程度的參考,所以單純認為權重高網(wǎng)站可以快收錄就更加荒謬了。
可以低權重網(wǎng)站秒收錄嗎?答案是肯定的,我體驗過(guò)很多權重只有1的網(wǎng)站,還可以?xún)?yōu)化到秒?;旧现灰獌热葙|(zhì)量還可以,秒級接收還可以的文字內容還是比較容易的。收錄是SEO優(yōu)化的基本開(kāi)始,網(wǎng)站內容秒數并不決定你的內容能否上榜。
網(wǎng)站即使你能做到內容秒收錄,并不代表你能獲得好的排名,即使你有排名,也不一定意味著(zhù)你有流量。
更多流量仍然取決于您的內容的受歡迎程度。許多網(wǎng)站非常擅長(cháng)在幾秒鐘內采集內容。事實(shí)上,這類(lèi)內容的競爭很小,本身也不是很受歡迎,所以很容易成為比較。易收錄內容,快收錄不是什么難技巧。
如果能在競爭激烈的內容下實(shí)現快速收錄,那可以說(shuō)是非常不錯了。在同樣的內容網(wǎng)站下,大致可以認為此時(shí)的權重較高。收錄速度越快,此時(shí)越科學(xué)??觳⒉淮砻胧?,只是凸顯了一個(gè)時(shí)間的速度。
看完這篇文章,如果覺(jué)得不錯,不妨采集一下,或者發(fā)給需要的朋友同事。每天跟著(zhù)博主為你展示各種SEO經(jīng)驗,打通你的兩條血脈!
查看全部
文章采集api(網(wǎng)站權重越高是不是收錄速度就越快,是不是DedeCMS采集
)
網(wǎng)站權重越高收錄速度越快,有沒(méi)有可能只要網(wǎng)站權重足夠高網(wǎng)站內容可以秒做< @收錄? 對于新站點(diǎn),低權限站點(diǎn)是否無(wú)法實(shí)現快速內容收錄?這樣想是一廂情愿的想法,也是不成熟的想法。
決定網(wǎng)站內容爬取速度的因素,以及搜索引擎影響網(wǎng)站爬取速度的核心因素,還是取決于你內容的屬性。對于咨詢(xún)等具有一定時(shí)效性?xún)热輰傩缘木W(wǎng)站,可以實(shí)現較好的收錄速度,秒級收錄即可?;谒阉饕?,意思是給用戶(hù)他們需要的信息。但信息化信息屬于優(yōu)質(zhì)內容,類(lèi)似重復內容的概率相對較小,因此更有價(jià)值。今天教大家一個(gè)快速的采集優(yōu)質(zhì)文章Dedecms采集(很多大佬都在用)。
這個(gè)dedecms采集不需要學(xué)習更專(zhuān)業(yè)的技術(shù),簡(jiǎn)單幾步就可以輕松采集內容數據,用戶(hù)只需要dedecms采集@對>進(jìn)行簡(jiǎn)單的設置,完成后dedecms采集會(huì )根據用戶(hù)設置的關(guān)鍵詞匹配內容和圖片的準確率,可以選擇保存在本地或者選擇< @k1@ >發(fā)布后,提供方便快捷的內容采集偽原創(chuàng )發(fā)布服務(wù)??!
和其他的Dedecms采集相比,這個(gè)Dedecms采集基本沒(méi)有什么門(mén)檻,也不需要花很多時(shí)間去學(xué)習正則表達式或者html標簽,一分鐘只需要輸入關(guān)鍵詞即可實(shí)現采集(dedecms采集也自帶關(guān)鍵詞采集的功能)。一路掛斷!設置任務(wù)自動(dòng)執行采集偽原創(chuàng )發(fā)布和推送任務(wù)。
幾十萬(wàn)個(gè)不同的cms網(wǎng)站可以統一管理。一個(gè)人維護數百個(gè) 網(wǎng)站文章 更新也不是問(wèn)題。
這類(lèi)Dedecms采集發(fā)布插件工具還配備了很多SEO功能。通過(guò)采集偽原創(chuàng )軟件發(fā)布時(shí),還可以提升很多SEO優(yōu)化。
例如:設置自動(dòng)下載圖片保存在本地或第三方(使內容不再有對方的外鏈)。自動(dòng)內鏈(讓搜索引擎更深入地抓取你的鏈接)、內容或標題插入,以及網(wǎng)站內容插入或隨機作者、隨機閱讀等,形成一個(gè)“高原創(chuàng )”。
這些SEO小功能不僅提高了網(wǎng)站頁(yè)面原創(chuàng )的度數,還間接提升了網(wǎng)站的收錄排名。您可以通過(guò)軟件工具上的監控管理直接查看文章采集的發(fā)布狀態(tài),不再需要每天登錄網(wǎng)站后臺查看。目前博主親測軟件是免費的,可以直接下載使用!
比如當大家看到一個(gè)引起你注意的熱搜,當你需要了解相關(guān)信息的時(shí)候,如果搜索引擎不能快速抓取并展示相關(guān)內容,那么就是非常糟糕的用戶(hù)體驗。.
這再次建立在上述觀(guān)點(diǎn)之上,如果高權重 網(wǎng)站 可以獲得良好的 收錄 速度,那么會(huì )發(fā)生什么?一般來(lái)說(shuō),很多高權重的網(wǎng)站信息量很大。如果權重高再去快速收錄,很有可能搜索引擎抓取壓力太大,所以顯示很不切實(shí)際的快速收錄對于很多< @網(wǎng)站。
比如圖庫網(wǎng)站,很多這類(lèi)網(wǎng)站網(wǎng)站的權重很高,每天的內容可能會(huì )增加成百上千。但是,這類(lèi)網(wǎng)站的特點(diǎn)就是內容在網(wǎng)絡(luò )上并不特殊,也沒(méi)有時(shí)效性,那么秒收這些網(wǎng)站又有什么意義呢。不僅不是秒收錄,這種類(lèi)型的網(wǎng)站很多頁(yè)面都不是收錄。
很多人會(huì )驚訝,權重這么高,怎么可能不是收錄?首先,例如,圖像 網(wǎng)站 的權重為 7,而另一個(gè)新聞類(lèi) 網(wǎng)站 的權重僅為 5。
基本上基于以上兩點(diǎn),新聞網(wǎng)站的收錄速度比較快。一是權重不是決定收錄的因素,二是所謂權重只是第三方工具根據關(guān)鍵詞預測流量。根據預估的站點(diǎn)流量,根據流量大小確定網(wǎng)站的權重評價(jià)。對于搜索引擎來(lái)說(shuō),根本就沒(méi)有所謂的權重,所以很多時(shí)候,權重高的網(wǎng)站在各方面的表現并不一定比搜索引擎好。重量輕 網(wǎng)站 有利于速度。
權重只能作為優(yōu)化程度的參考,所以單純認為權重高網(wǎng)站可以快收錄就更加荒謬了。
可以低權重網(wǎng)站秒收錄嗎?答案是肯定的,我體驗過(guò)很多權重只有1的網(wǎng)站,還可以?xún)?yōu)化到秒?;旧现灰獌热葙|(zhì)量還可以,秒級接收還可以的文字內容還是比較容易的。收錄是SEO優(yōu)化的基本開(kāi)始,網(wǎng)站內容秒數并不決定你的內容能否上榜。
網(wǎng)站即使你能做到內容秒收錄,并不代表你能獲得好的排名,即使你有排名,也不一定意味著(zhù)你有流量。
更多流量仍然取決于您的內容的受歡迎程度。許多網(wǎng)站非常擅長(cháng)在幾秒鐘內采集內容。事實(shí)上,這類(lèi)內容的競爭很小,本身也不是很受歡迎,所以很容易成為比較。易收錄內容,快收錄不是什么難技巧。
如果能在競爭激烈的內容下實(shí)現快速收錄,那可以說(shuō)是非常不錯了。在同樣的內容網(wǎng)站下,大致可以認為此時(shí)的權重較高。收錄速度越快,此時(shí)越科學(xué)??觳⒉淮砻胧?,只是凸顯了一個(gè)時(shí)間的速度。
看完這篇文章,如果覺(jué)得不錯,不妨采集一下,或者發(fā)給需要的朋友同事。每天跟著(zhù)博主為你展示各種SEO經(jīng)驗,打通你的兩條血脈!
文章采集api(4.1API通用規則API用一套非常標準的規則生成數據)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 106 次瀏覽 ? 2022-02-12 10:13
一般情況下,程序員可以使用HTPP協(xié)議向API發(fā)起請求,獲取一定的信息,API會(huì )以XML或JSON格式返回服務(wù)器響應信息。
API 使用通常不被視為網(wǎng)絡(luò )數據采集,但實(shí)際上使用的許多技術(shù)(都發(fā)送 HTTP 請求)和結果(都獲取信息)是相似的;兩者經(jīng)常有重疊的相容關(guān)系。
例如,結合 Wikipedia 編輯歷史記錄(其中收錄編輯者的 IP 地址)和 IP 地址解析 API 以獲取 Wikipedia 條目的編輯者的地理位置。
4.1 API 概述
谷歌 API
4.2 API 通用規則
API 使用一套非常標準的規則來(lái)生成數據,并且生成的數據以非常標準的方式組織。
四種方式:GET、POST、PUT、DELETE
驗證:需要客戶(hù)端驗證
4.3 服務(wù)器響應
大多數反饋數據格式是 XML 和 JSON
過(guò)去,服務(wù)器端使用 PHP 和 .NET 等程序作為 API 的接收端?,F在,服務(wù)器端也使用一些 JavaScript 框架作為 API 的發(fā)送和接收端,例如 Angular 或 Backbone。
接口調用:
4.4 回聲巢穴
回聲巢音樂(lè )資料網(wǎng)站
4.5 推特 API
點(diǎn)安裝推特
from twitter import Twitter
t = Twitter(auth=OAuth(,,,))
pythonTweets = t.search.tweets(q = "#python")
print(pythonTweets)
鳴叫 4.6 個(gè) Google API
無(wú)論您想使用哪種信息,包括語(yǔ)言翻譯、地理位置、日歷,甚至基因數據,Google 都提供 API。Google 還為其一些知名應用程序提供 API,例如 Gmail、YouTube 和 Blogger。
4.7 解析 JSON 數據
import json
from urllib.request import urlopen
def getCountry(ipAddress):
response = urlopen("http://freegeoip.net/json/"+ipAddress).read().decode('utf-8')
responseJson = json.loads(response)
return responseJson.get("country_code")
print(getCountry("50.78.253.58"))
4.8 返回主題
將多個(gè)數據源組合成新的形式,或者使用 API 作為工具從新的角度解釋數據采集。
先做一個(gè)采集維基百科的基礎程序,找到編輯歷史頁(yè)面,然后在編輯歷史中找出IP地址
# -*- coding: utf-8 -*-
from urllib.request import urlopen
from bs4 import BeautifulSoup
import datetime
import random
import re
import json
random.seed(datetime.datetime.now())
# https://en.wikipedia.org/wiki/Python_(programming_language)
def getLinks(articleUrl):
html = urlopen("http://en.wikipedia.org"+articleUrl)
bsObj = BeautifulSoup(html)
return bsObj.find("div",{"id":"bodyContent"}).findAll("a", href=re.compile("^(/wiki/)((?!:).)*$"))
def getHistoryIPs(pageUrl):
# 編輯歷史頁(yè)面URL鏈接格式是:
# https://en.wikipedia.org/w/index.php?title=Python_(programming_language)&action=history
pageUrl = pageUrl.replace("/wiki/", "")
historyUrl = "https://en.wikipedia.org/w/ind ... ot%3B
print("history url is: "+historyUrl)
html = urlopen(historyUrl)
bsObj = BeautifulSoup(html)
# 找出class屬性是"mw-anonuserlink"的鏈接
# 它們用IP地址代替用戶(hù)名
ipAddresses = bsObj.findAll("a", {"class":"mw-anonuserlink"})
addressList = set()
for ipAddress in ipAddresses:
addressList.add(ipAddress.get_text())
return addressList
links = getLinks("/wiki/Python_(programming_language)")
def getCountry(ipAddress):
try:
response = urlopen("http://freegeoip.net/json/"+ipAddress).read().decode('utf-8')
except HTTPError:
return None
responseJson = json.loads(response)
return responseJson.get("country_code")
while (len(links) > 0):
for link in links:
print("-------------------")
historyIPs = getHistoryIPs(link.attrs["href"])
for historyIP in historyIPs:
#print(historyIP)
country = getCountry(historyIP)
if country is not None:
print(historyIP+" is from "+country)
newLink = links[random.randint(0, len(links)-1)].attrs["href"]
links = getLinks(newLink)
4.9 更多 API
Leonard Richardson、Mike Amundsen 和 Sam Ruby 的 RESTful Web APIs ( ) 為使用 Web APIs 提供了非常全面的理論和實(shí)踐指南。此外,Mike Amundsen 的精彩視頻教程 Designing APIs for the Web() 教您如何創(chuàng )建自己的 API。如果您想以方便的方式分享您的 采集 數據,他的視頻非常有用 查看全部
文章采集api(4.1API通用規則API用一套非常標準的規則生成數據)
一般情況下,程序員可以使用HTPP協(xié)議向API發(fā)起請求,獲取一定的信息,API會(huì )以XML或JSON格式返回服務(wù)器響應信息。
API 使用通常不被視為網(wǎng)絡(luò )數據采集,但實(shí)際上使用的許多技術(shù)(都發(fā)送 HTTP 請求)和結果(都獲取信息)是相似的;兩者經(jīng)常有重疊的相容關(guān)系。
例如,結合 Wikipedia 編輯歷史記錄(其中收錄編輯者的 IP 地址)和 IP 地址解析 API 以獲取 Wikipedia 條目的編輯者的地理位置。
4.1 API 概述
谷歌 API
4.2 API 通用規則
API 使用一套非常標準的規則來(lái)生成數據,并且生成的數據以非常標準的方式組織。
四種方式:GET、POST、PUT、DELETE
驗證:需要客戶(hù)端驗證
4.3 服務(wù)器響應
大多數反饋數據格式是 XML 和 JSON
過(guò)去,服務(wù)器端使用 PHP 和 .NET 等程序作為 API 的接收端?,F在,服務(wù)器端也使用一些 JavaScript 框架作為 API 的發(fā)送和接收端,例如 Angular 或 Backbone。
接口調用:
4.4 回聲巢穴
回聲巢音樂(lè )資料網(wǎng)站
4.5 推特 API
點(diǎn)安裝推特
from twitter import Twitter
t = Twitter(auth=OAuth(,,,))
pythonTweets = t.search.tweets(q = "#python")
print(pythonTweets)
鳴叫 4.6 個(gè) Google API
無(wú)論您想使用哪種信息,包括語(yǔ)言翻譯、地理位置、日歷,甚至基因數據,Google 都提供 API。Google 還為其一些知名應用程序提供 API,例如 Gmail、YouTube 和 Blogger。
4.7 解析 JSON 數據
import json
from urllib.request import urlopen
def getCountry(ipAddress):
response = urlopen("http://freegeoip.net/json/"+ipAddress).read().decode('utf-8')
responseJson = json.loads(response)
return responseJson.get("country_code")
print(getCountry("50.78.253.58"))
4.8 返回主題
將多個(gè)數據源組合成新的形式,或者使用 API 作為工具從新的角度解釋數據采集。
先做一個(gè)采集維基百科的基礎程序,找到編輯歷史頁(yè)面,然后在編輯歷史中找出IP地址
# -*- coding: utf-8 -*-
from urllib.request import urlopen
from bs4 import BeautifulSoup
import datetime
import random
import re
import json
random.seed(datetime.datetime.now())
# https://en.wikipedia.org/wiki/Python_(programming_language)
def getLinks(articleUrl):
html = urlopen("http://en.wikipedia.org"+articleUrl)
bsObj = BeautifulSoup(html)
return bsObj.find("div",{"id":"bodyContent"}).findAll("a", href=re.compile("^(/wiki/)((?!:).)*$"))
def getHistoryIPs(pageUrl):
# 編輯歷史頁(yè)面URL鏈接格式是:
# https://en.wikipedia.org/w/index.php?title=Python_(programming_language)&action=history
pageUrl = pageUrl.replace("/wiki/", "")
historyUrl = "https://en.wikipedia.org/w/ind ... ot%3B
print("history url is: "+historyUrl)
html = urlopen(historyUrl)
bsObj = BeautifulSoup(html)
# 找出class屬性是"mw-anonuserlink"的鏈接
# 它們用IP地址代替用戶(hù)名
ipAddresses = bsObj.findAll("a", {"class":"mw-anonuserlink"})
addressList = set()
for ipAddress in ipAddresses:
addressList.add(ipAddress.get_text())
return addressList
links = getLinks("/wiki/Python_(programming_language)")
def getCountry(ipAddress):
try:
response = urlopen("http://freegeoip.net/json/"+ipAddress).read().decode('utf-8')
except HTTPError:
return None
responseJson = json.loads(response)
return responseJson.get("country_code")
while (len(links) > 0):
for link in links:
print("-------------------")
historyIPs = getHistoryIPs(link.attrs["href"])
for historyIP in historyIPs:
#print(historyIP)
country = getCountry(historyIP)
if country is not None:
print(historyIP+" is from "+country)
newLink = links[random.randint(0, len(links)-1)].attrs["href"]
links = getLinks(newLink)
4.9 更多 API
Leonard Richardson、Mike Amundsen 和 Sam Ruby 的 RESTful Web APIs ( ) 為使用 Web APIs 提供了非常全面的理論和實(shí)踐指南。此外,Mike Amundsen 的精彩視頻教程 Designing APIs for the Web() 教您如何創(chuàng )建自己的 API。如果您想以方便的方式分享您的 采集 數據,他的視頻非常有用
文章采集api(終于找到解決方案了,這是一個(gè)值得慶祝的事情..)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 121 次瀏覽 ? 2022-02-11 00:09
終于找到了解決辦法,值得慶賀....
原來(lái)是因為微信在源碼中添加了反采集代碼,把文章源碼中的這一段去掉就好了!
具體代碼如下:
public function getCon(){<br style="margin:0px;padding:0px;" /> header('Content-type: text/html; charset=utf-8');<br style="margin:0px;padding:0px;" /> import('Vendor.QL.QueryList');<br style="margin:0px;padding:0px;" /> $w_url=$_POST['wurl']; //接收到的文章地址<br style="margin:0px;padding:0px;" />// 測試文章地址<br style="margin:0px;padding:0px;" />// $w_url='http://mp.weixin.qq.com/s%3F__ ... %3Bbr style="margin:0px;padding:0px;" />// echo "alert('".$w_url."');";<br style="margin:0px;padding:0px;" /> $html = file_get_contents($w_url); //獲取文章源碼并保存到參數中<br style="margin:0px;padding:0px;" />// echo "alert('".$html."');";<br style="margin:0px;padding:0px;" /> $html = str_replace("", "", $html); //去除微信中的抓取干擾代碼<br style="margin:0px;padding:0px;" />// die($w_url);<br style="margin:0px;padding:0px;" /><br style="margin:0px;padding:0px;" />// var_dump($html);<br style="margin:0px;padding:0px;" /> $data = \QueryList::Query($html,array(<br style="margin:0px;padding:0px;" /> //采集規則庫<br style="margin:0px;padding:0px;" /> //'規則名' => array('jQuery選擇器','要采集的屬性'),<br style="margin:0px;padding:0px;" /> 'titleTag' => array('title','text'),<br style="margin:0px;padding:0px;" />// 'title' => array('#activity-name','text'),<br style="margin:0px;padding:0px;" /> 'content' => array('body','text'),<br style="margin:0px;padding:0px;" />// 'image' => array('img','src'),<br style="margin:0px;padding:0px;" /> //微信規則<br style="margin:0px;padding:0px;" /> 'contentWx' => array('#js_content','text'),<br style="margin:0px;padding:0px;" />// 'imageWx' => array('img','data-src'),<br style="margin:0px;padding:0px;" />// 'conText' => array('.rich_media_content>p','text'),<br style="margin:0px;padding:0px;" /> ))->data;<br style="margin:0px;padding:0px;" /> foreach ($data as $k => $v) {<br style="margin:0px;padding:0px;" /> $data[$k]['imageWx'] = $this->cut_str($v['imageWx'],'?',0);<br style="margin:0px;padding:0px;" /> }<br style="margin:0px;padding:0px;" />//打印結果<br style="margin:0px;padding:0px;" />// print_r($data);<br style="margin:0px;padding:0px;" /> $this->assign('conD',$data);<br style="margin:0px;padding:0px;" /> $this->display();<br style="margin:0px;padding:0px;" /><br style="margin:0px;padding:0px;" /> }
String token = AccessTokenTool.getAccessToken();
String URL = "https://api.weixin.qq.com/cgi- ... 3B%3B
// 原始json
String jsonResult = HttpUtil.sendGet(URL.replace("OPENID", openid).replace("ACCESS_TOKEN", token));
System.out.println(jsonResult);
// 編碼后的json
String json = new String(jsonResult.getBytes("ISO-8859-1"), "UTF-8");
System.out.println(json);
坐下來(lái)輸入代碼。沒(méi)有什么技能不經(jīng)過(guò)多年的深思熟慮就能輕易做到的 查看全部
文章采集api(終于找到解決方案了,這是一個(gè)值得慶祝的事情..)
終于找到了解決辦法,值得慶賀....
原來(lái)是因為微信在源碼中添加了反采集代碼,把文章源碼中的這一段去掉就好了!
具體代碼如下:
public function getCon(){<br style="margin:0px;padding:0px;" /> header('Content-type: text/html; charset=utf-8');<br style="margin:0px;padding:0px;" /> import('Vendor.QL.QueryList');<br style="margin:0px;padding:0px;" /> $w_url=$_POST['wurl']; //接收到的文章地址<br style="margin:0px;padding:0px;" />// 測試文章地址<br style="margin:0px;padding:0px;" />// $w_url='http://mp.weixin.qq.com/s%3F__ ... %3Bbr style="margin:0px;padding:0px;" />// echo "alert('".$w_url."');";<br style="margin:0px;padding:0px;" /> $html = file_get_contents($w_url); //獲取文章源碼并保存到參數中<br style="margin:0px;padding:0px;" />// echo "alert('".$html."');";<br style="margin:0px;padding:0px;" /> $html = str_replace("", "", $html); //去除微信中的抓取干擾代碼<br style="margin:0px;padding:0px;" />// die($w_url);<br style="margin:0px;padding:0px;" /><br style="margin:0px;padding:0px;" />// var_dump($html);<br style="margin:0px;padding:0px;" /> $data = \QueryList::Query($html,array(<br style="margin:0px;padding:0px;" /> //采集規則庫<br style="margin:0px;padding:0px;" /> //'規則名' => array('jQuery選擇器','要采集的屬性'),<br style="margin:0px;padding:0px;" /> 'titleTag' => array('title','text'),<br style="margin:0px;padding:0px;" />// 'title' => array('#activity-name','text'),<br style="margin:0px;padding:0px;" /> 'content' => array('body','text'),<br style="margin:0px;padding:0px;" />// 'image' => array('img','src'),<br style="margin:0px;padding:0px;" /> //微信規則<br style="margin:0px;padding:0px;" /> 'contentWx' => array('#js_content','text'),<br style="margin:0px;padding:0px;" />// 'imageWx' => array('img','data-src'),<br style="margin:0px;padding:0px;" />// 'conText' => array('.rich_media_content>p','text'),<br style="margin:0px;padding:0px;" /> ))->data;<br style="margin:0px;padding:0px;" /> foreach ($data as $k => $v) {<br style="margin:0px;padding:0px;" /> $data[$k]['imageWx'] = $this->cut_str($v['imageWx'],'?',0);<br style="margin:0px;padding:0px;" /> }<br style="margin:0px;padding:0px;" />//打印結果<br style="margin:0px;padding:0px;" />// print_r($data);<br style="margin:0px;padding:0px;" /> $this->assign('conD',$data);<br style="margin:0px;padding:0px;" /> $this->display();<br style="margin:0px;padding:0px;" /><br style="margin:0px;padding:0px;" /> }
String token = AccessTokenTool.getAccessToken();
String URL = "https://api.weixin.qq.com/cgi- ... 3B%3B
// 原始json
String jsonResult = HttpUtil.sendGet(URL.replace("OPENID", openid).replace("ACCESS_TOKEN", token));
System.out.println(jsonResult);
// 編碼后的json
String json = new String(jsonResult.getBytes("ISO-8859-1"), "UTF-8");
System.out.println(json);
坐下來(lái)輸入代碼。沒(méi)有什么技能不經(jīng)過(guò)多年的深思熟慮就能輕易做到的
文章采集api(cms如何添加采集api接口快速建站,網(wǎng)站模板建站平臺)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 137 次瀏覽 ? 2022-02-07 13:20
cms如何添加api采集接口快速建站,網(wǎng)站模板建站平臺
高端網(wǎng)站設計cms如何添加api采集接口平臺值得您免費注冊使用,您可以放心點(diǎn)擊使用!
?1、 網(wǎng)站模板免費使用,3000套海量網(wǎng)站行業(yè)模板任你選擇,所見(jiàn)即所得。
?2、易于維護。如果有錯,可以修改,直到合適為止。
?3、覆蓋范圍廣、產(chǎn)品穩定、每周持續更新、專(zhuān)人專(zhuān)職、優(yōu)質(zhì)服務(wù)讓您滿(mǎn)意
?4、覆蓋電腦網(wǎng)站、手機網(wǎng)站、小程序、微網(wǎng)站等多平臺終端,無(wú)需擔心流量曝光
?5、高性?xún)r(jià)比企業(yè)網(wǎng)站施工方案,買(mǎi)三年送三年,還在猶豫嗎?
cms如何添加api采集界面網(wǎng)站免費提供各行各業(yè)的網(wǎng)站模板供你選擇,總有一款適合你,有都是各種素材圖片,完全不用擔心沒(méi)有素材可做網(wǎng)站。
?1、cms如何添加api采集接口網(wǎng)站服務(wù),或者免費模板自建
?2、怎么做網(wǎng)站,只要你會(huì )用電腦制作網(wǎng)站,客服兄妹耐心教你
?3、我們如何制作自己的網(wǎng)站,cms如何添加api采集接口來(lái)幫助你實(shí)現你的網(wǎng)站夢(mèng)想
?4、不用自己寫(xiě)代碼,建個(gè)網(wǎng)站其實(shí)是很簡(jiǎn)單的事情
?5、提供建站+空間+域名+備案一站式服務(wù),讓您無(wú)后顧之憂(yōu)
?6、一鍵免費注冊建站,豐富的功能控件拖拽自由操作,快速編輯,網(wǎng)站可生成預覽
?7、新手會(huì )用網(wǎng)站build,不信可以試試
?8、網(wǎng)站四合一【電腦、手機、微網(wǎng)站、小程序】 查看全部
文章采集api(cms如何添加采集api接口快速建站,網(wǎng)站模板建站平臺)
cms如何添加api采集接口快速建站,網(wǎng)站模板建站平臺

高端網(wǎng)站設計cms如何添加api采集接口平臺值得您免費注冊使用,您可以放心點(diǎn)擊使用!
?1、 網(wǎng)站模板免費使用,3000套海量網(wǎng)站行業(yè)模板任你選擇,所見(jiàn)即所得。
?2、易于維護。如果有錯,可以修改,直到合適為止。
?3、覆蓋范圍廣、產(chǎn)品穩定、每周持續更新、專(zhuān)人專(zhuān)職、優(yōu)質(zhì)服務(wù)讓您滿(mǎn)意
?4、覆蓋電腦網(wǎng)站、手機網(wǎng)站、小程序、微網(wǎng)站等多平臺終端,無(wú)需擔心流量曝光
?5、高性?xún)r(jià)比企業(yè)網(wǎng)站施工方案,買(mǎi)三年送三年,還在猶豫嗎?

cms如何添加api采集界面網(wǎng)站免費提供各行各業(yè)的網(wǎng)站模板供你選擇,總有一款適合你,有都是各種素材圖片,完全不用擔心沒(méi)有素材可做網(wǎng)站。
?1、cms如何添加api采集接口網(wǎng)站服務(wù),或者免費模板自建
?2、怎么做網(wǎng)站,只要你會(huì )用電腦制作網(wǎng)站,客服兄妹耐心教你
?3、我們如何制作自己的網(wǎng)站,cms如何添加api采集接口來(lái)幫助你實(shí)現你的網(wǎng)站夢(mèng)想
?4、不用自己寫(xiě)代碼,建個(gè)網(wǎng)站其實(shí)是很簡(jiǎn)單的事情
?5、提供建站+空間+域名+備案一站式服務(wù),讓您無(wú)后顧之憂(yōu)
?6、一鍵免費注冊建站,豐富的功能控件拖拽自由操作,快速編輯,網(wǎng)站可生成預覽
?7、新手會(huì )用網(wǎng)站build,不信可以試試
?8、網(wǎng)站四合一【電腦、手機、微網(wǎng)站、小程序】
文章采集api(離線(xiàn)文檔查閱Dash的優(yōu)勢是什么?工具集成介紹)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 135 次瀏覽 ? 2022-02-01 16:09
對于軟件開(kāi)發(fā)領(lǐng)域的新手和絕大多數計算機科學(xué)專(zhuān)業(yè)的學(xué)生來(lái)說(shuō),API 文檔是眾多硬骨頭之一。大多數文檔存在交互不友好和索引不方便的問(wèn)題。本著(zhù)解決人民群眾需求的精神,介紹了本期的主角Dash。
Dash 將自己定位為開(kāi)發(fā)人員的文檔查詢(xún)工具。事實(shí)上,Dash 在易用性和實(shí)用性方面都非常強大。簡(jiǎn)要總結如下:
可以說(shuō),Dash 絕對對得起它的定位。用了之后,很有可能沒(méi)有它就活不下去了。
離線(xiàn)文檔審核
Dash首先是一個(gè)文檔查詢(xún)工具,也是它的核心。它基本上涵蓋了所有主流和一些非主流語(yǔ)言、框架和庫的文檔。大部分文檔來(lái)自這些語(yǔ)言的官方語(yǔ)言,所以也收錄了很多官方的介紹。
讓我們專(zhuān)注于 API 查詢(xún)。在 Dash 中查詢(xún) API 非常簡(jiǎn)單。您可以根據需要搜索所有下載的文檔,或雙擊選擇特定文檔,然后輸入關(guān)鍵字進(jìn)行搜索。在這種情況下,搜索范圍將被鎖定在該特定文檔中。文檔內。Dash的檢索效率非常高,基本秒出結果。
以 JavaScript 文檔為例,它被合理地劃分為“類(lèi)”、“方法”、“事件”、“函數”、“關(guān)鍵字”以及來(lái)自 MDN 的非常實(shí)用的介紹。與在線(xiàn)版本相比,像Dash這樣的離線(xiàn)文檔庫的優(yōu)勢不僅在于它可以處理更多的場(chǎng)景,而且所有內容一目了然,而且很容易檢索,無(wú)需忍受快速和慢速的外國服務(wù)器。
這是畫(huà)布教程,這部分來(lái)自 MDN(Mozilla 開(kāi)發(fā)者網(wǎng)絡(luò ),Web 標準的主要開(kāi)發(fā)和推廣組織之一一)。
第三方工具集成
由于其作為開(kāi)發(fā)和生產(chǎn)力工具的定位,Dash 與許多工具和 IDE 無(wú)縫集成?;旧?,您使用和將使用的工具都得到官方支持。插件的安裝方法在其GitHub對應的各個(gè)Repository上都有詳細的安裝說(shuō)明,點(diǎn)擊上方對應的工具圖標即可找到。
以Alfred為例,即使沒(méi)有額外的步驟,點(diǎn)擊圖標后會(huì )自動(dòng)跳轉到Alfred,點(diǎn)擊import即可安裝。集成 Dash 后,索引甚至不需要打開(kāi)應用程序本身,不太方便。
感受觸手可及的閱讀樂(lè )趣。
自定義數據源
如果你覺(jué)得 Dash 的官方庫不能滿(mǎn)足你的所有需求,你想自定義它作為文檔源!
沒(méi)問(wèn)題,Google Stack Overflow 已經(jīng)集成。您還可以將任何您喜歡的社區用作自定義搜索庫,并且很容易添加。以Medium為例,直接在上面搜索東西后,復制URL。
可以看到搜索關(guān)鍵詞是網(wǎng)址的q后面的段落。在 Dash 的偏好設置中點(diǎn)擊網(wǎng)頁(yè)搜索欄左下角的 +,在名稱(chēng)字段中輸入搜索源的名稱(chēng);將 URL 粘貼到 Search URL 字段中,然后輸入關(guān)鍵字只需將其替換為 {query}。
添加注釋
Dash還自帶注釋工具,可以在文檔的任意部分添加注釋?zhuān)瑢W(xué)習有很大幫助,也符合大學(xué)做筆記的風(fēng)格。
此外,您還可以將 Mark 學(xué)了一半時(shí)間的章節或 API 添加到書(shū)簽中,并將其添加到書(shū)簽中以供將來(lái)參考。
總的來(lái)說(shuō),Dash是一款在文檔的廣度和質(zhì)量上可以滿(mǎn)足大部分人使用場(chǎng)景的工具,同時(shí)還提供了包括自定義數據源、添加注釋等個(gè)性化功能,對于學(xué)習和工作都有很大的幫助. 明顯地。學(xué)習搜索是技術(shù)發(fā)展道路上不可或缺的一步,你也是嗎?
除了 Mac 端,Dash 還有一個(gè) iOS 版本。iOS 版本完全免費,還支持離線(xiàn)文檔。此外,它還支持 URL Schemes 等功能。您可以從 App Store 或 GitHub 下載源文件。 查看全部
文章采集api(離線(xiàn)文檔查閱Dash的優(yōu)勢是什么?工具集成介紹)
對于軟件開(kāi)發(fā)領(lǐng)域的新手和絕大多數計算機科學(xué)專(zhuān)業(yè)的學(xué)生來(lái)說(shuō),API 文檔是眾多硬骨頭之一。大多數文檔存在交互不友好和索引不方便的問(wèn)題。本著(zhù)解決人民群眾需求的精神,介紹了本期的主角Dash。
Dash 將自己定位為開(kāi)發(fā)人員的文檔查詢(xún)工具。事實(shí)上,Dash 在易用性和實(shí)用性方面都非常強大。簡(jiǎn)要總結如下:
可以說(shuō),Dash 絕對對得起它的定位。用了之后,很有可能沒(méi)有它就活不下去了。
離線(xiàn)文檔審核
Dash首先是一個(gè)文檔查詢(xún)工具,也是它的核心。它基本上涵蓋了所有主流和一些非主流語(yǔ)言、框架和庫的文檔。大部分文檔來(lái)自這些語(yǔ)言的官方語(yǔ)言,所以也收錄了很多官方的介紹。
讓我們專(zhuān)注于 API 查詢(xún)。在 Dash 中查詢(xún) API 非常簡(jiǎn)單。您可以根據需要搜索所有下載的文檔,或雙擊選擇特定文檔,然后輸入關(guān)鍵字進(jìn)行搜索。在這種情況下,搜索范圍將被鎖定在該特定文檔中。文檔內。Dash的檢索效率非常高,基本秒出結果。

以 JavaScript 文檔為例,它被合理地劃分為“類(lèi)”、“方法”、“事件”、“函數”、“關(guān)鍵字”以及來(lái)自 MDN 的非常實(shí)用的介紹。與在線(xiàn)版本相比,像Dash這樣的離線(xiàn)文檔庫的優(yōu)勢不僅在于它可以處理更多的場(chǎng)景,而且所有內容一目了然,而且很容易檢索,無(wú)需忍受快速和慢速的外國服務(wù)器。

這是畫(huà)布教程,這部分來(lái)自 MDN(Mozilla 開(kāi)發(fā)者網(wǎng)絡(luò ),Web 標準的主要開(kāi)發(fā)和推廣組織之一一)。

第三方工具集成
由于其作為開(kāi)發(fā)和生產(chǎn)力工具的定位,Dash 與許多工具和 IDE 無(wú)縫集成?;旧?,您使用和將使用的工具都得到官方支持。插件的安裝方法在其GitHub對應的各個(gè)Repository上都有詳細的安裝說(shuō)明,點(diǎn)擊上方對應的工具圖標即可找到。

以Alfred為例,即使沒(méi)有額外的步驟,點(diǎn)擊圖標后會(huì )自動(dòng)跳轉到Alfred,點(diǎn)擊import即可安裝。集成 Dash 后,索引甚至不需要打開(kāi)應用程序本身,不太方便。

感受觸手可及的閱讀樂(lè )趣。

自定義數據源
如果你覺(jué)得 Dash 的官方庫不能滿(mǎn)足你的所有需求,你想自定義它作為文檔源!
沒(méi)問(wèn)題,Google Stack Overflow 已經(jīng)集成。您還可以將任何您喜歡的社區用作自定義搜索庫,并且很容易添加。以Medium為例,直接在上面搜索東西后,復制URL。

可以看到搜索關(guān)鍵詞是網(wǎng)址的q后面的段落。在 Dash 的偏好設置中點(diǎn)擊網(wǎng)頁(yè)搜索欄左下角的 +,在名稱(chēng)字段中輸入搜索源的名稱(chēng);將 URL 粘貼到 Search URL 字段中,然后輸入關(guān)鍵字只需將其替換為 {query}。

添加注釋
Dash還自帶注釋工具,可以在文檔的任意部分添加注釋?zhuān)瑢W(xué)習有很大幫助,也符合大學(xué)做筆記的風(fēng)格。

此外,您還可以將 Mark 學(xué)了一半時(shí)間的章節或 API 添加到書(shū)簽中,并將其添加到書(shū)簽中以供將來(lái)參考。
總的來(lái)說(shuō),Dash是一款在文檔的廣度和質(zhì)量上可以滿(mǎn)足大部分人使用場(chǎng)景的工具,同時(shí)還提供了包括自定義數據源、添加注釋等個(gè)性化功能,對于學(xué)習和工作都有很大的幫助. 明顯地。學(xué)習搜索是技術(shù)發(fā)展道路上不可或缺的一步,你也是嗎?
除了 Mac 端,Dash 還有一個(gè) iOS 版本。iOS 版本完全免費,還支持離線(xiàn)文檔。此外,它還支持 URL Schemes 等功能。您可以從 App Store 或 GitHub 下載源文件。
文章采集api(Java開(kāi)發(fā)中常見(jiàn)的純文本解析方法-樂(lè )題庫)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 114 次瀏覽 ? 2022-01-29 00:21
其他可用的 python http 請求模塊:
你的頻率
你請求
其中frequests和grequests的使用方式相同,frequests的穩定性高于grequests;簡(jiǎn)單使用如下:
2.響應結果數據格式
常見(jiàn)的響應結果格式為:
3.各種數據格式的分析方法3.1 Html分析方法
常見(jiàn)的html數據解析方式有:
3.2 純文本解析方法
常見(jiàn)的純文本解析方法有:
3.3 網(wǎng)頁(yè)正文提取
網(wǎng)頁(yè)正文提取的重要性:
正則表達式可以準確提取某種固定格式的頁(yè)面,但面對各種HTML,難免要用規則來(lái)處理。能否高效、準確地提取頁(yè)面文本,使其在大規模網(wǎng)頁(yè)范圍內通用,是直接關(guān)系到上層應用的難題。
研究計劃:
JoyHTML的目的是解析HTML文本中的鏈接和文本,采用超鏈接密度法作為標記窗口算法的主要判斷依據,采用DOM樹(shù)解析方式。
這個(gè) Java 類(lèi)庫提供了檢測和刪除網(wǎng)頁(yè)主要文本內容旁邊的冗余重復內容的算法。它已經(jīng)提供了特殊的策略來(lái)處理一些常見(jiàn)的功能,例如新聞文章提取。
該算法首次將網(wǎng)頁(yè)文本提取問(wèn)題轉化為尋找頁(yè)面的行塊分布函數,并將其與HTML標簽完全分離。通過(guò)線(xiàn)性時(shí)間建立線(xiàn)塊分布函數圖,該圖可以直接、高效、準確地定位網(wǎng)頁(yè)文本。同時(shí)采用統計與規則相結合的方法解決系統的一般性問(wèn)題。
這里我們只使用 cx-extractor 和可讀性;這里是cx-extractor和可讀性的對比,如下:
cx-extractor的使用示例如下圖所示:
cx-extractor 和可讀性比較
4.數據解析詳解
建議: 查看全部
文章采集api(Java開(kāi)發(fā)中常見(jiàn)的純文本解析方法-樂(lè )題庫)
其他可用的 python http 請求模塊:
你的頻率
你請求
其中frequests和grequests的使用方式相同,frequests的穩定性高于grequests;簡(jiǎn)單使用如下:
2.響應結果數據格式
常見(jiàn)的響應結果格式為:
3.各種數據格式的分析方法3.1 Html分析方法
常見(jiàn)的html數據解析方式有:
3.2 純文本解析方法
常見(jiàn)的純文本解析方法有:
3.3 網(wǎng)頁(yè)正文提取
網(wǎng)頁(yè)正文提取的重要性:
正則表達式可以準確提取某種固定格式的頁(yè)面,但面對各種HTML,難免要用規則來(lái)處理。能否高效、準確地提取頁(yè)面文本,使其在大規模網(wǎng)頁(yè)范圍內通用,是直接關(guān)系到上層應用的難題。
研究計劃:
JoyHTML的目的是解析HTML文本中的鏈接和文本,采用超鏈接密度法作為標記窗口算法的主要判斷依據,采用DOM樹(shù)解析方式。
這個(gè) Java 類(lèi)庫提供了檢測和刪除網(wǎng)頁(yè)主要文本內容旁邊的冗余重復內容的算法。它已經(jīng)提供了特殊的策略來(lái)處理一些常見(jiàn)的功能,例如新聞文章提取。
該算法首次將網(wǎng)頁(yè)文本提取問(wèn)題轉化為尋找頁(yè)面的行塊分布函數,并將其與HTML標簽完全分離。通過(guò)線(xiàn)性時(shí)間建立線(xiàn)塊分布函數圖,該圖可以直接、高效、準確地定位網(wǎng)頁(yè)文本。同時(shí)采用統計與規則相結合的方法解決系統的一般性問(wèn)題。
這里我們只使用 cx-extractor 和可讀性;這里是cx-extractor和可讀性的對比,如下:
cx-extractor的使用示例如下圖所示:
cx-extractor 和可讀性比較
4.數據解析詳解
建議:
文章采集api(優(yōu)采云采集器官網(wǎng)-網(wǎng)頁(yè)抓取工具優(yōu)采云采集器免費網(wǎng)站采集軟件 )
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 173 次瀏覽 ? 2022-01-25 08:13
)
免責聲明:本教程沒(méi)有任何盈利目的,僅供學(xué)習使用,不會(huì )對網(wǎng)站的操作造成負擔。請不要將其用于任何商業(yè)目的。
優(yōu)采云簡(jiǎn)介
優(yōu)采云采集器官網(wǎng)-網(wǎng)頁(yè)抓取工具優(yōu)采云采集器免費網(wǎng)站采集軟件
優(yōu)采云采集器,專(zhuān)業(yè)的互聯(lián)網(wǎng)數據采集、處理、分析、挖掘軟件,可以靈活快速的抓取網(wǎng)頁(yè)上零散的數據信息,并通過(guò)一系列的分析處理,精準挖掘出來(lái)所需的數據。優(yōu)采云采集器歷經(jīng)十二年的升級更新,積累了大量的用戶(hù)和良好的口碑,是目前最受歡迎的網(wǎng)絡(luò )數據采集軟件。
簡(jiǎn)單來(lái)說(shuō),就是用軟件來(lái)簡(jiǎn)化我們的爬取過(guò)程。整個(gè)過(guò)程無(wú)需編寫(xiě)代碼即可實(shí)現爬蟲(chóng)邏輯。
示例爬取任務(wù)
需要爬取分頁(yè)中的所有頁(yè)面,并進(jìn)一步爬取頁(yè)面上所有有趣條目的二級URL
新任務(wù) 添加任務(wù)
URL采集規則 - URL 獲取
URL采集規則-分頁(yè)設置
分頁(yè)規則主要設置在這里,也就是說(shuō)不僅要抓取當前頁(yè)面,還需要抓取所有頁(yè)面。
內容采集規則
這里設置了將URL中的內容提取到前面的采集的規則,即每個(gè)商品詳情頁(yè)的內容
內容發(fā)布規則
用于指定如何處理采集發(fā)送的內容,這里設置為發(fā)送到一個(gè)api
單擊 + 號以添加規則
新發(fā)布模塊
這里指定要發(fā)送給api的參數,其中name為[Content 采集Rule]部分獲取的信息,參數為規則名稱(chēng)。
您可以保存其他設置而不更改它們。
然后填寫(xiě)請求的主機
其他設置
以下是一些常用設置,可選。
查看爬取的數據
計劃任務(wù)設置
這里可以指定任務(wù)重復運行的規則
發(fā)送通知
可以使用ios軟件bark來(lái)接受通知,其內容就是爬取的規則。在這里,使用 Golang 簡(jiǎn)單地創(chuàng )建了一個(gè)新的 api。當軟件爬取完成后,將信息發(fā)送到api【在內容發(fā)布規則中設置】,然后將消息發(fā)送到api。推送到ios
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package main
import (
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/net/ghttp"
"github.com/gogf/gf/os/glog"
"github.com/gogf/gf/util/gconv"
"github.com/gogf/gf/util/grand"
)
type Info struct {
Url string `json:"url"`
Name string `json:"name"`
TaskType string `json:"task_type"`
}
func main() {
s := g.Server()
s.SetPort(8080)
_ = glog.SetConfigWithMap(g.Map{
"path": "log",
"level": "all",
"file": "{Y-m-d}.log",
"flags": glog.F_TIME_DATE | glog.F_TIME_MILLI | glog.F_FILE_LONG,
})
s.BindHandler("/send_info", func(r *ghttp.Request){
requestId := grand.Letters(16)
var info Info
if err := r.ParseForm(&info); err != nil {
glog.Error(requestId, err)
_ = r.Response.WriteJsonExit(nil)
}
glog.Info(requestId, info)
bark := "https://api.day.app/{xxxxxxxxxxxx}"
body := gconv.String(g.Map{
"device_key": "xxxxxxxxxxxxx",
"body": gconv.String(info),
"title": "商品信息",
"ext_params": g.Map{"url": info.Url},
})
glog.Info(requestId, body)
if _, err := g.Client().Post(bark, body); err != nil{
glog.Error(err)
}
})
s.Run()
} 查看全部
文章采集api(優(yōu)采云采集器官網(wǎng)-網(wǎng)頁(yè)抓取工具優(yōu)采云采集器免費網(wǎng)站采集軟件
)
免責聲明:本教程沒(méi)有任何盈利目的,僅供學(xué)習使用,不會(huì )對網(wǎng)站的操作造成負擔。請不要將其用于任何商業(yè)目的。
優(yōu)采云簡(jiǎn)介
優(yōu)采云采集器官網(wǎng)-網(wǎng)頁(yè)抓取工具優(yōu)采云采集器免費網(wǎng)站采集軟件
優(yōu)采云采集器,專(zhuān)業(yè)的互聯(lián)網(wǎng)數據采集、處理、分析、挖掘軟件,可以靈活快速的抓取網(wǎng)頁(yè)上零散的數據信息,并通過(guò)一系列的分析處理,精準挖掘出來(lái)所需的數據。優(yōu)采云采集器歷經(jīng)十二年的升級更新,積累了大量的用戶(hù)和良好的口碑,是目前最受歡迎的網(wǎng)絡(luò )數據采集軟件。
簡(jiǎn)單來(lái)說(shuō),就是用軟件來(lái)簡(jiǎn)化我們的爬取過(guò)程。整個(gè)過(guò)程無(wú)需編寫(xiě)代碼即可實(shí)現爬蟲(chóng)邏輯。
示例爬取任務(wù)
需要爬取分頁(yè)中的所有頁(yè)面,并進(jìn)一步爬取頁(yè)面上所有有趣條目的二級URL
新任務(wù) 添加任務(wù)

URL采集規則 - URL 獲取

URL采集規則-分頁(yè)設置

分頁(yè)規則主要設置在這里,也就是說(shuō)不僅要抓取當前頁(yè)面,還需要抓取所有頁(yè)面。
內容采集規則

這里設置了將URL中的內容提取到前面的采集的規則,即每個(gè)商品詳情頁(yè)的內容
內容發(fā)布規則
用于指定如何處理采集發(fā)送的內容,這里設置為發(fā)送到一個(gè)api

單擊 + 號以添加規則

新發(fā)布模塊

這里指定要發(fā)送給api的參數,其中name為[Content 采集Rule]部分獲取的信息,參數為規則名稱(chēng)。
您可以保存其他設置而不更改它們。

然后填寫(xiě)請求的主機
其他設置

以下是一些常用設置,可選。
查看爬取的數據

計劃任務(wù)設置

這里可以指定任務(wù)重復運行的規則
發(fā)送通知
可以使用ios軟件bark來(lái)接受通知,其內容就是爬取的規則。在這里,使用 Golang 簡(jiǎn)單地創(chuàng )建了一個(gè)新的 api。當軟件爬取完成后,將信息發(fā)送到api【在內容發(fā)布規則中設置】,然后將消息發(fā)送到api。推送到ios
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package main
import (
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/net/ghttp"
"github.com/gogf/gf/os/glog"
"github.com/gogf/gf/util/gconv"
"github.com/gogf/gf/util/grand"
)
type Info struct {
Url string `json:"url"`
Name string `json:"name"`
TaskType string `json:"task_type"`
}
func main() {
s := g.Server()
s.SetPort(8080)
_ = glog.SetConfigWithMap(g.Map{
"path": "log",
"level": "all",
"file": "{Y-m-d}.log",
"flags": glog.F_TIME_DATE | glog.F_TIME_MILLI | glog.F_FILE_LONG,
})
s.BindHandler("/send_info", func(r *ghttp.Request){
requestId := grand.Letters(16)
var info Info
if err := r.ParseForm(&info); err != nil {
glog.Error(requestId, err)
_ = r.Response.WriteJsonExit(nil)
}
glog.Info(requestId, info)
bark := "https://api.day.app/{xxxxxxxxxxxx}"
body := gconv.String(g.Map{
"device_key": "xxxxxxxxxxxxx",
"body": gconv.String(info),
"title": "商品信息",
"ext_params": g.Map{"url": info.Url},
})
glog.Info(requestId, body)
if _, err := g.Client().Post(bark, body); err != nil{
glog.Error(err)
}
})
s.Run()
}
文章采集api(優(yōu)采云采集支持調用5118一鍵智能換詞API接口(組圖) )
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 203 次瀏覽 ? 2022-01-25 04:20
)
優(yōu)采云采集 支持調用5118一鍵智能換字API接口,處理采集的數據標題和內容等,可處理文章@ > 對搜索引擎更有吸引力;
具體步驟如下
1. 5118 一鍵智能換詞API接口配置 I,API配置入口:
點(diǎn)擊控制臺左側列表中的【第三方服務(wù)配置】==點(diǎn)擊【第三方內容API接入】==點(diǎn)擊【第三方API配置管理】==最后點(diǎn)擊[+5118 一鍵智能原創(chuàng )API]創(chuàng )建接口配置;
二。配置API接口信息:
【API-Key值】是從5118后端獲取的一鍵智能換詞API對應的key值,填寫(xiě)后記得保存;
2. 創(chuàng )建 API 處理規則
API處理規則,可以通過(guò)調用API接口設置處理哪些字段的內容;
一、API處理規則入口:
點(diǎn)擊控制臺左側列表中的【第三方服務(wù)配置】==點(diǎn)擊【第三方內容API接入】==進(jìn)入【API處理規則管理】頁(yè)面,最后點(diǎn)擊[+添加API處理規則]創(chuàng )建API處理規則;
二、API處理規則配置:
規則名稱(chēng):用戶(hù)可以命名;
字段名稱(chēng):填寫(xiě)的字段名稱(chēng)內容將由API接口處理,默認為標題和內容字段,可修改、添加或刪除字段;
API used:選擇配置的API接口配置,執行時(shí)會(huì )調用該接口,不同的字段可以選擇不同的API接口配置;
處理順序:執行順序按照數量從小到大執行;
3.API處理規則使用
API處理規則有兩種使用方式:手動(dòng)執行和自動(dòng)執行:
手動(dòng)執行:數據采集后,使用[Result Data & Release]中的第三方API執行;
自動(dòng)執行:配置自動(dòng)化后,任務(wù)采集數據完成后,系統會(huì )自動(dòng)執行指定的API處理規則,無(wú)需人工操作。
我。手動(dòng)執行API處理規則:
點(diǎn)擊采集任務(wù)的【結果數據&發(fā)布】選項卡中的【SEO&API&翻譯等工具】按鈕==選擇【第三方API執行】欄==選擇對應的API處理規則== "Execute;
二。自動(dòng)執行API處理規則:
啟用 API 處理的自動(dòng)執行。任務(wù)完成后采集會(huì )自動(dòng)執行API處理。一般配合定時(shí)采集和自動(dòng)發(fā)布功能使用非常方便;
在任務(wù)的【自動(dòng)化:發(fā)布&SEO&翻譯】選項卡【自動(dòng)執行第三方API配置】==勾選【采集,自動(dòng)執行API】選項==選擇執行的API處理rules=="選擇API接口處理的數據范圍(一般選擇‘待發(fā)布’,全部會(huì )導致所有數據重復執行),最后點(diǎn)擊保存;
4.API處理結果并發(fā)布 I,查看API接口處理結果:
API接口處理后的內容會(huì )保存為新字段,如:標題處理后的新字段:title_5118,內容處理后的新字段:content_5118,可在【結果數據&發(fā)布】中查看和數據預覽界面。
二。發(fā)布API接口處理后的內容:
發(fā)布前文章@>修改發(fā)布目標第二步的映射字段,重新選擇標題和內容作為API接口處理后添加的對應字段title_5118和content_5118;
查看全部
文章采集api(優(yōu)采云采集支持調用5118一鍵智能換詞API接口(組圖)
)
優(yōu)采云采集 支持調用5118一鍵智能換字API接口,處理采集的數據標題和內容等,可處理文章@ > 對搜索引擎更有吸引力;
具體步驟如下
1. 5118 一鍵智能換詞API接口配置 I,API配置入口:
點(diǎn)擊控制臺左側列表中的【第三方服務(wù)配置】==點(diǎn)擊【第三方內容API接入】==點(diǎn)擊【第三方API配置管理】==最后點(diǎn)擊[+5118 一鍵智能原創(chuàng )API]創(chuàng )建接口配置;
二。配置API接口信息:
【API-Key值】是從5118后端獲取的一鍵智能換詞API對應的key值,填寫(xiě)后記得保存;
2. 創(chuàng )建 API 處理規則
API處理規則,可以通過(guò)調用API接口設置處理哪些字段的內容;
一、API處理規則入口:
點(diǎn)擊控制臺左側列表中的【第三方服務(wù)配置】==點(diǎn)擊【第三方內容API接入】==進(jìn)入【API處理規則管理】頁(yè)面,最后點(diǎn)擊[+添加API處理規則]創(chuàng )建API處理規則;
二、API處理規則配置:
規則名稱(chēng):用戶(hù)可以命名;
字段名稱(chēng):填寫(xiě)的字段名稱(chēng)內容將由API接口處理,默認為標題和內容字段,可修改、添加或刪除字段;
API used:選擇配置的API接口配置,執行時(shí)會(huì )調用該接口,不同的字段可以選擇不同的API接口配置;
處理順序:執行順序按照數量從小到大執行;
3.API處理規則使用
API處理規則有兩種使用方式:手動(dòng)執行和自動(dòng)執行:
手動(dòng)執行:數據采集后,使用[Result Data & Release]中的第三方API執行;
自動(dòng)執行:配置自動(dòng)化后,任務(wù)采集數據完成后,系統會(huì )自動(dòng)執行指定的API處理規則,無(wú)需人工操作。
我。手動(dòng)執行API處理規則:
點(diǎn)擊采集任務(wù)的【結果數據&發(fā)布】選項卡中的【SEO&API&翻譯等工具】按鈕==選擇【第三方API執行】欄==選擇對應的API處理規則== "Execute;
二。自動(dòng)執行API處理規則:
啟用 API 處理的自動(dòng)執行。任務(wù)完成后采集會(huì )自動(dòng)執行API處理。一般配合定時(shí)采集和自動(dòng)發(fā)布功能使用非常方便;
在任務(wù)的【自動(dòng)化:發(fā)布&SEO&翻譯】選項卡【自動(dòng)執行第三方API配置】==勾選【采集,自動(dòng)執行API】選項==選擇執行的API處理rules=="選擇API接口處理的數據范圍(一般選擇‘待發(fā)布’,全部會(huì )導致所有數據重復執行),最后點(diǎn)擊保存;
4.API處理結果并發(fā)布 I,查看API接口處理結果:
API接口處理后的內容會(huì )保存為新字段,如:標題處理后的新字段:title_5118,內容處理后的新字段:content_5118,可在【結果數據&發(fā)布】中查看和數據預覽界面。
二。發(fā)布API接口處理后的內容:
發(fā)布前文章@>修改發(fā)布目標第二步的映射字段,重新選擇標題和內容作為API接口處理后添加的對應字段title_5118和content_5118;
文章采集api( 如何查詢(xún)prometheus采集job中指標下數據量的情況過(guò)濾?)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 153 次瀏覽 ? 2022-01-22 12:25
如何查詢(xún)prometheus采集job中指標下數據量的情況過(guò)濾?)
如何在普羅米修斯中過(guò)濾不需要的指標
在prometheus的采集中,你會(huì )發(fā)現一個(gè)job可能收錄幾十個(gè)甚至上百個(gè)指標,每個(gè)指標下的數據量也非常大。在生產(chǎn)環(huán)境中,我們實(shí)際上可能只用到了幾十個(gè)指標,而那些我們沒(méi)有用過(guò)的指標,prometheus采集就成了浪費部署資源的罪魁禍首。
這時(shí)候就需要考慮過(guò)濾prometheus采集的job中的指標了。
如何查詢(xún)指標下的數據量
1
2
3
4
5
# 展現數據量前50的指標
topk(50, count by (__name__, job)({__name__=~".+"}))
# prometheus中的指標數據量
sum(count by (__name__, job)({__name__=~".+"}))
在 prometheus 采集Job 上過(guò)濾指標
以下是 cadvice采集job 的示例。目前使用metric_relabel_configs下的drop操作丟棄不需要的指標(感覺(jué)不是特別方便)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
- job_name: kubernetes-cadvisor
kubernetes_sd_configs:
- role: node
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
- target_label: __address__
replacement: kubernetes.default.svc:443
- source_labels: [__meta_kubernetes_node_name]
regex: (.+)
target_label: __metrics_path__
replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
metric_relabel_configs:
- action: replace
source_labels: [id]
regex: '^/machine\.slice/machine-rkt\\x2d([^\\]+)\\.+/([^/]+)\.service$'
target_label: rkt_container_name
replacement: '${2}-${1}'
- action: replace
source_labels: [id]
regex: '^/system\.slice/(.+)\.service$'
target_label: systemd_service_name
replacement: '${1}'
# 丟棄掉container_network_tcp_usage_total指標
- action: drop
source_labels: [__name__]
regex: 'container_network_tcp_usage_total'
- action: drop
source_labels: [__name__]
regex: 'container_tasks_state'
- action: drop
source_labels: [__name__]
regex: 'container_network_udp_usage_total'
- action: drop
source_labels: [__name__]
regex: 'container_memory_failures_total'
在 prometheus-opretor 中過(guò)濾 Servicemonit 配置的作業(yè)指標
在使用prometheus-opretor部署監控環(huán)境時(shí),會(huì )發(fā)現很多監控作業(yè)都是使用Servicemonit定義的。您還可以在 Servicemonit 中配置 drop to drop 指示器。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
serviceMonitors:
- name: foundation-prometheus
namespaceSelector:
matchNames:
- monitoring
selector:
matchLabels:
cluster: foundation
endpoints:
- port: foundation-port
honorLabels: true
path: /federate
params:
'match[]':
- '{__name__=~".+"}'
# 配置丟棄container_memory_failures_total指標
metricRelabelings:
- action: drop
source_labels: [__name__]
regex: 'container_memory_failures_total'
在每個(gè) 采集export 中配置不需要的指標
最好的處理方法是在prometheus采集指標之前控制每個(gè)export提供的指標,只給prometheus提供我們需要監控的指標。我們以節點(diǎn)導出為例。在 node-export 中,有一個(gè)應用程序的官方描述。您可以使用--no-collector。用于控制不需要 采集 的模塊的標志 查看全部
文章采集api(
如何查詢(xún)prometheus采集job中指標下數據量的情況過(guò)濾?)
如何在普羅米修斯中過(guò)濾不需要的指標
在prometheus的采集中,你會(huì )發(fā)現一個(gè)job可能收錄幾十個(gè)甚至上百個(gè)指標,每個(gè)指標下的數據量也非常大。在生產(chǎn)環(huán)境中,我們實(shí)際上可能只用到了幾十個(gè)指標,而那些我們沒(méi)有用過(guò)的指標,prometheus采集就成了浪費部署資源的罪魁禍首。
這時(shí)候就需要考慮過(guò)濾prometheus采集的job中的指標了。
如何查詢(xún)指標下的數據量
1
2
3
4
5
# 展現數據量前50的指標
topk(50, count by (__name__, job)({__name__=~".+"}))
# prometheus中的指標數據量
sum(count by (__name__, job)({__name__=~".+"}))
在 prometheus 采集Job 上過(guò)濾指標
以下是 cadvice采集job 的示例。目前使用metric_relabel_configs下的drop操作丟棄不需要的指標(感覺(jué)不是特別方便)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
- job_name: kubernetes-cadvisor
kubernetes_sd_configs:
- role: node
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
- target_label: __address__
replacement: kubernetes.default.svc:443
- source_labels: [__meta_kubernetes_node_name]
regex: (.+)
target_label: __metrics_path__
replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
metric_relabel_configs:
- action: replace
source_labels: [id]
regex: '^/machine\.slice/machine-rkt\\x2d([^\\]+)\\.+/([^/]+)\.service$'
target_label: rkt_container_name
replacement: '${2}-${1}'
- action: replace
source_labels: [id]
regex: '^/system\.slice/(.+)\.service$'
target_label: systemd_service_name
replacement: '${1}'
# 丟棄掉container_network_tcp_usage_total指標
- action: drop
source_labels: [__name__]
regex: 'container_network_tcp_usage_total'
- action: drop
source_labels: [__name__]
regex: 'container_tasks_state'
- action: drop
source_labels: [__name__]
regex: 'container_network_udp_usage_total'
- action: drop
source_labels: [__name__]
regex: 'container_memory_failures_total'
在 prometheus-opretor 中過(guò)濾 Servicemonit 配置的作業(yè)指標
在使用prometheus-opretor部署監控環(huán)境時(shí),會(huì )發(fā)現很多監控作業(yè)都是使用Servicemonit定義的。您還可以在 Servicemonit 中配置 drop to drop 指示器。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
serviceMonitors:
- name: foundation-prometheus
namespaceSelector:
matchNames:
- monitoring
selector:
matchLabels:
cluster: foundation
endpoints:
- port: foundation-port
honorLabels: true
path: /federate
params:
'match[]':
- '{__name__=~".+"}'
# 配置丟棄container_memory_failures_total指標
metricRelabelings:
- action: drop
source_labels: [__name__]
regex: 'container_memory_failures_total'
在每個(gè) 采集export 中配置不需要的指標
最好的處理方法是在prometheus采集指標之前控制每個(gè)export提供的指標,只給prometheus提供我們需要監控的指標。我們以節點(diǎn)導出為例。在 node-export 中,有一個(gè)應用程序的官方描述。您可以使用--no-collector。用于控制不需要 采集 的模塊的標志
文章采集api( 傳cookie )
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 138 次瀏覽 ? 2022-01-21 21:15
傳cookie
)
在api采集的過(guò)程中,有些接口不通過(guò)cookie就不能讓你訪(fǎng)問(wèn)該接口。然后我們需要把cookie帶入到cookie傳遞的地方。
cookie 的來(lái)源,例如訪(fǎng)問(wèn)或登錄。當服務(wù)器響應時(shí),它會(huì )為你生成。
卷曲方法:
// 初始化CURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
// 獲取頭部信息
curl_setopt($ch, CURLOPT_HEADER, 1);
// 返回原生的(Raw)輸出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 執行并獲取返回結果
$content = curl_exec($ch);
// 關(guān)閉CURL
curl_close($ch);
// 解析HTTP數據流
list($header, $body) = explode("\r\n\r\n", $content);
// 解析COOKIE
preg_match("/set\-cookie:([^\r\n]*)/i", $header, $matches);
// 后面用CURL提交的時(shí)候可以直接使用
// curl_setopt($ch, CURLOPT_COOKIE, $cookie);
$cookie = $matches[1];
// 初始化CURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url2);
// 獲取頭部信息
curl_setopt($ch, CURLOPT_HEADER, 1);
// 返回原生的(Raw)輸出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIE, $cookie);//設置cookie
// 執行并獲取返回結果
$content = curl_exec($ch);
// 關(guān)閉CURL
curl_close($ch); 查看全部
文章采集api(
傳cookie
)
在api采集的過(guò)程中,有些接口不通過(guò)cookie就不能讓你訪(fǎng)問(wèn)該接口。然后我們需要把cookie帶入到cookie傳遞的地方。
cookie 的來(lái)源,例如訪(fǎng)問(wèn)或登錄。當服務(wù)器響應時(shí),它會(huì )為你生成。
卷曲方法:
// 初始化CURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
// 獲取頭部信息
curl_setopt($ch, CURLOPT_HEADER, 1);
// 返回原生的(Raw)輸出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 執行并獲取返回結果
$content = curl_exec($ch);
// 關(guān)閉CURL
curl_close($ch);
// 解析HTTP數據流
list($header, $body) = explode("\r\n\r\n", $content);
// 解析COOKIE
preg_match("/set\-cookie:([^\r\n]*)/i", $header, $matches);
// 后面用CURL提交的時(shí)候可以直接使用
// curl_setopt($ch, CURLOPT_COOKIE, $cookie);
$cookie = $matches[1];
// 初始化CURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url2);
// 獲取頭部信息
curl_setopt($ch, CURLOPT_HEADER, 1);
// 返回原生的(Raw)輸出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIE, $cookie);//設置cookie
// 執行并獲取返回結果
$content = curl_exec($ch);
// 關(guān)閉CURL
curl_close($ch);
文章采集api(一個(gè)博客小站來(lái)說(shuō)的收錄方式文章目錄資源前言)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 142 次瀏覽 ? 2022-03-01 01:25
typechoSEO網(wǎng)站收錄插件推薦百度提交
文章目錄
資源前言
我們在建一個(gè)小站點(diǎn)的時(shí)候,可能會(huì )遇到如何讓搜索引擎抓取我們的文章的問(wèn)題,當然你可以選擇不讓搜索引擎抓取你的站點(diǎn)。這時(shí)候,你就需要SEO(“搜索引擎優(yōu)化”)。其實(shí)涉及的內容很多,但作為我這種小博客網(wǎng)站,沒(méi)必要。無(wú)非就是讓你的網(wǎng)站在搜索引擎中的排名更高,讓運維來(lái)做。在這篇文章中,我主要講一下我在SEO方面采取的一些做法,主要是百度收錄,其他搜索引擎的收錄方法類(lèi)似,大家可以自行搜索理解
安裝
把下載好的插件解壓到typecho主目錄下的插件目錄下,一般是/usr/plugins
然后就可以在typecho的后臺插件中看到了
百度站長(cháng)網(wǎng)站設置
百度搜索引擎提供了站長(cháng)網(wǎng)站,這樣我們就可以主動(dòng)讓百度去收錄自己的站點(diǎn),下面是傳送門(mén)
門(mén)戶(hù)網(wǎng)站
他提供了幾種不同的收錄方法,比如quick收錄,可以讓你主動(dòng)提供你網(wǎng)站的一些資源,比如sitemap等,縮短搜索引擎爬蟲(chóng)爬取你的時(shí)間地點(diǎn)。具體方法有API提交、站點(diǎn)地圖、手動(dòng)提交。這次推薦的插件主要是API提交。
API 提交
推送接口、推送實(shí)例、推送反饋如上所示。我們只需要關(guān)注推送接口即可。后兩者在實(shí)現代碼時(shí)需要注意。顯然,插件作者已經(jīng)做到了這一點(diǎn)。以下是API接口的樣式。
http://data.zz.baidu.com/urls?site={您的站點(diǎn)}&token={驗證token,相當于密碼}
網(wǎng)站地圖
要提交站點(diǎn)地圖,您可以使用 txt 或 xml 格式。這里可以直接使用這個(gè)插件生成的xml文件,大部分搜索引擎都識別sitemaps(我不知道),比如你可以看一下我的站點(diǎn)自動(dòng)生成的xml。文檔
如果您熟悉 XML,很容易發(fā)現大部分站點(diǎn)地圖實(shí)際上是由這些多個(gè) url 元素組成的。
所以我們可以填寫(xiě)對應的
不僅可以在這里使用站點(diǎn)的路徑,而且在這里這樣做更方便。另外,這個(gè)站點(diǎn)地圖一天最多只能推送十次。
手動(dòng)提交
也就是提交你網(wǎng)站上寫(xiě)的文章的鏈接,也就是把sitemap.xml內容中的url鏈接一個(gè)一個(gè)提交,這個(gè)方法可以保證你的一個(gè)文章可以很好收錄(不一定,還是看百度吧),自己決定
百度站長(cháng)其他工具
喜歡什么移動(dòng)適配,死鏈接提交可以自己看懂,什么都寫(xiě)清楚了哈哈
插件介紹功能使用
很簡(jiǎn)單,直接填一個(gè)api,發(fā)布的時(shí)候會(huì )自動(dòng)提交類(lèi)似這個(gè)api的更新文章
機器人文件
使用爬蟲(chóng)的人應該對此非常熟悉。簡(jiǎn)而言之,是爬蟲(chóng)的“君子協(xié)定”。雖然我們平時(shí)不遵守君子協(xié)定,但百度、搜狗、谷歌等大搜索引擎還是會(huì )遵守的。是的,這個(gè)約束只是對它們的約束。哈哈,由于這個(gè)插件沒(méi)有自動(dòng)生成robots.txt的功能,所以需要我們自己創(chuàng )建。方法也很簡(jiǎn)單。步驟如下
創(chuàng )建一個(gè)名為 robots.txt 的新文件
輸入內容
User-agent: *
Allow: /
Disallow: /admin/
Disallow: /install/
Sitemap: https://你的網(wǎng)站地址/sitemap.xml
這個(gè)語(yǔ)法很簡(jiǎn)單,可以根據自己網(wǎng)站的需要進(jìn)行修改
保存并上傳文件到 網(wǎng)站 根目錄
最后,訪(fǎng)問(wèn)自己 網(wǎng)站 進(jìn)行驗證
好的,你完成了
查看您的網(wǎng)站是否被 收錄 阻止
最常用的方法是在搜索引擎上搜索您的一篇文章文章。如果你找到了,說(shuō)明你已經(jīng)收錄
這里推薦一個(gè)查看你整個(gè)站點(diǎn)的收錄情況的方法(使用搜索語(yǔ)法site:xxx),具體示例如下
可以看到百度收錄已經(jīng)添加了我以前的站點(diǎn),所以這里有一點(diǎn)你可以知道的是,百度收錄并不是你提交資源后就可以立即更新的東西,他會(huì )是定期更新,可能是一周或一個(gè)月(廢話(huà))
總結
其實(shí)搜索引擎的收錄只需要提交一個(gè)鏈接,搜索引擎就會(huì )自動(dòng)抓取你的鏈接。這個(gè)插件自動(dòng)生成sitemap.xml文件,可以很方便的讓其他搜索引擎收錄,所以一個(gè)sitemap插件就夠了。下面我將給出各大搜索引擎站長(cháng)的網(wǎng)站地址。你可以直接寫(xiě)你的網(wǎng)站地址,讓他們自己爬。, 收錄不會(huì )馬上成功的。這主要取決于不同的搜索引擎,以及您網(wǎng)站的各種結果,其中涉及到 SEO 問(wèn)題。我對此一無(wú)所知。問(wèn)運維老板。. 最后,祝你折騰網(wǎng)站開(kāi)心! 查看全部
文章采集api(一個(gè)博客小站來(lái)說(shuō)的收錄方式文章目錄資源前言)
typechoSEO網(wǎng)站收錄插件推薦百度提交
文章目錄
資源前言
我們在建一個(gè)小站點(diǎn)的時(shí)候,可能會(huì )遇到如何讓搜索引擎抓取我們的文章的問(wèn)題,當然你可以選擇不讓搜索引擎抓取你的站點(diǎn)。這時(shí)候,你就需要SEO(“搜索引擎優(yōu)化”)。其實(shí)涉及的內容很多,但作為我這種小博客網(wǎng)站,沒(méi)必要。無(wú)非就是讓你的網(wǎng)站在搜索引擎中的排名更高,讓運維來(lái)做。在這篇文章中,我主要講一下我在SEO方面采取的一些做法,主要是百度收錄,其他搜索引擎的收錄方法類(lèi)似,大家可以自行搜索理解
安裝
把下載好的插件解壓到typecho主目錄下的插件目錄下,一般是/usr/plugins

然后就可以在typecho的后臺插件中看到了

百度站長(cháng)網(wǎng)站設置
百度搜索引擎提供了站長(cháng)網(wǎng)站,這樣我們就可以主動(dòng)讓百度去收錄自己的站點(diǎn),下面是傳送門(mén)
門(mén)戶(hù)網(wǎng)站

他提供了幾種不同的收錄方法,比如quick收錄,可以讓你主動(dòng)提供你網(wǎng)站的一些資源,比如sitemap等,縮短搜索引擎爬蟲(chóng)爬取你的時(shí)間地點(diǎn)。具體方法有API提交、站點(diǎn)地圖、手動(dòng)提交。這次推薦的插件主要是API提交。
API 提交
推送接口、推送實(shí)例、推送反饋如上所示。我們只需要關(guān)注推送接口即可。后兩者在實(shí)現代碼時(shí)需要注意。顯然,插件作者已經(jīng)做到了這一點(diǎn)。以下是API接口的樣式。
http://data.zz.baidu.com/urls?site={您的站點(diǎn)}&token={驗證token,相當于密碼}
網(wǎng)站地圖

要提交站點(diǎn)地圖,您可以使用 txt 或 xml 格式。這里可以直接使用這個(gè)插件生成的xml文件,大部分搜索引擎都識別sitemaps(我不知道),比如你可以看一下我的站點(diǎn)自動(dòng)生成的xml。文檔


如果您熟悉 XML,很容易發(fā)現大部分站點(diǎn)地圖實(shí)際上是由這些多個(gè) url 元素組成的。
所以我們可以填寫(xiě)對應的

不僅可以在這里使用站點(diǎn)的路徑,而且在這里這樣做更方便。另外,這個(gè)站點(diǎn)地圖一天最多只能推送十次。
手動(dòng)提交

也就是提交你網(wǎng)站上寫(xiě)的文章的鏈接,也就是把sitemap.xml內容中的url鏈接一個(gè)一個(gè)提交,這個(gè)方法可以保證你的一個(gè)文章可以很好收錄(不一定,還是看百度吧),自己決定
百度站長(cháng)其他工具
喜歡什么移動(dòng)適配,死鏈接提交可以自己看懂,什么都寫(xiě)清楚了哈哈
插件介紹功能使用

很簡(jiǎn)單,直接填一個(gè)api,發(fā)布的時(shí)候會(huì )自動(dòng)提交類(lèi)似這個(gè)api的更新文章
機器人文件
使用爬蟲(chóng)的人應該對此非常熟悉。簡(jiǎn)而言之,是爬蟲(chóng)的“君子協(xié)定”。雖然我們平時(shí)不遵守君子協(xié)定,但百度、搜狗、谷歌等大搜索引擎還是會(huì )遵守的。是的,這個(gè)約束只是對它們的約束。哈哈,由于這個(gè)插件沒(méi)有自動(dòng)生成robots.txt的功能,所以需要我們自己創(chuàng )建。方法也很簡(jiǎn)單。步驟如下
創(chuàng )建一個(gè)名為 robots.txt 的新文件
輸入內容
User-agent: *
Allow: /
Disallow: /admin/
Disallow: /install/
Sitemap: https://你的網(wǎng)站地址/sitemap.xml
這個(gè)語(yǔ)法很簡(jiǎn)單,可以根據自己網(wǎng)站的需要進(jìn)行修改
保存并上傳文件到 網(wǎng)站 根目錄

最后,訪(fǎng)問(wèn)自己 網(wǎng)站 進(jìn)行驗證

好的,你完成了
查看您的網(wǎng)站是否被 收錄 阻止
最常用的方法是在搜索引擎上搜索您的一篇文章文章。如果你找到了,說(shuō)明你已經(jīng)收錄
這里推薦一個(gè)查看你整個(gè)站點(diǎn)的收錄情況的方法(使用搜索語(yǔ)法site:xxx),具體示例如下

可以看到百度收錄已經(jīng)添加了我以前的站點(diǎn),所以這里有一點(diǎn)你可以知道的是,百度收錄并不是你提交資源后就可以立即更新的東西,他會(huì )是定期更新,可能是一周或一個(gè)月(廢話(huà))
總結
其實(shí)搜索引擎的收錄只需要提交一個(gè)鏈接,搜索引擎就會(huì )自動(dòng)抓取你的鏈接。這個(gè)插件自動(dòng)生成sitemap.xml文件,可以很方便的讓其他搜索引擎收錄,所以一個(gè)sitemap插件就夠了。下面我將給出各大搜索引擎站長(cháng)的網(wǎng)站地址。你可以直接寫(xiě)你的網(wǎng)站地址,讓他們自己爬。, 收錄不會(huì )馬上成功的。這主要取決于不同的搜索引擎,以及您網(wǎng)站的各種結果,其中涉及到 SEO 問(wèn)題。我對此一無(wú)所知。問(wèn)運維老板。. 最后,祝你折騰網(wǎng)站開(kāi)心!
文章采集api(如何用R調用API,提取和整理你需要的免費Web數據)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 179 次瀏覽 ? 2022-02-27 00:28
API是獲取Web數據的重要方式之一。想了解如何使用 R 調用 API 來(lái)提取和組織您需要的免費 Web 數據嗎?本文將逐步向您展示操作過(guò)程。
交易
俗話(huà)說(shuō),“聰明的女人,沒(méi)有飯難煮”。就算你掌握了數據分析十八門(mén)武功,沒(méi)有數據也是一件麻煩的事情?!鞍蔚抖?,茫然不知所措”,大概就是這樣。
有很多數據來(lái)源。Web 數據是數量龐大且相對容易獲取的類(lèi)型之一。更好的是,很多網(wǎng)絡(luò )數據都是免費的。
在這個(gè)所謂的大數據時(shí)代,如何獲取網(wǎng)絡(luò )數據?
許多人使用由他人編譯和發(fā)布的數據集。
他們很幸運,他們的工作可以建立在其他人的基礎上。這是最有效的。
但并不是每個(gè)人都這么幸運。如果您需要的數據從未被組織和發(fā)布過(guò)怎么辦?
事實(shí)上,這樣的數據量更大。我們是否對他們視而不見(jiàn)?
如果您考慮爬行動(dòng)物,那么您的想法是正確的。爬蟲(chóng)可以為您獲取幾乎所有可見(jiàn)(甚至不可見(jiàn))的網(wǎng)絡(luò )數據。然而,編寫(xiě)和使用爬蟲(chóng)的成本很高。包括時(shí)間資源、技術(shù)能力等。如果你遇到任何網(wǎng)絡(luò )數據獲取問(wèn)題,你不要想“大錘”,有時(shí)可能是“刀槍不入”。
在“別人準備的數據”和“需要自己爬取的數據”之間,還有一個(gè)廣闊的領(lǐng)域,這就是API的世界。
什么是 API?
它是應用程序編程接口的縮寫(xiě)。具體來(lái)說(shuō),某個(gè)網(wǎng)站的數據在不斷的積累和變化。如果對這些數據進(jìn)行整理,不僅費時(shí),而且占用空間,而且還有剛整理完就過(guò)時(shí)的危險。大多數人需要的數據其實(shí)只是其中的一小部分,但時(shí)效性要求可能非常強。因此,組織存儲并將其提供給公眾以供下載是不經(jīng)濟的。
但是,如果數據不能以某種方式打通,就會(huì )面臨無(wú)數爬蟲(chóng)的騷擾。這會(huì )對網(wǎng)站的正常運行造成很大的困擾。折衷方案是 網(wǎng)站 主動(dòng)提供通道。當你需要某部分數據時(shí),雖然沒(méi)有現成的數據集,但你只需要用這個(gè)通道描述你想要的數據,然后網(wǎng)站審核后(一般是自動(dòng)化的,瞬間完成),認為我可以給你,我會(huì )立即發(fā)送你明確要求的數據。雙方都很高興。
以后在找數據的時(shí)候,不妨看看目標網(wǎng)站有沒(méi)有提供API,避免無(wú)用的努力。
在這個(gè)github項目中,有一個(gè)非常詳細的列表,涵蓋了當前常見(jiàn)的主流網(wǎng)站API資源狀況。作者還在整理和修改中,大家可以采集起來(lái)慢慢看。
如果我們知道某個(gè)網(wǎng)站提供了API,通過(guò)查看文檔知道我們需要的數據在那里,那么問(wèn)題就變成了——如何通過(guò)API獲取數據?
下面我們用一個(gè)實(shí)際的例子來(lái)向您展示整個(gè)操作步驟。
資源
我們正在尋找的例子是維基百科。
有關(guān) Wikipedia API 的概述,請參閱此頁(yè)面。
假設我們關(guān)心特定時(shí)間段內對指定維基百科 文章 頁(yè)面的訪(fǎng)問(wèn)次數。
維基百科為我們提供了一種稱(chēng)為指標的數據,它涵蓋了頁(yè)面訪(fǎng)問(wèn)的關(guān)鍵價(jià)值。對應API的介紹頁(yè)面在這里。
頁(yè)面上有一個(gè)示例。假設需要獲取2015年10月愛(ài)因斯坦入口頁(yè)面的訪(fǎng)問(wèn)次數,可以這樣調用:
GET http://wikimedia.org/api/rest_ ... %3Bbr style="box-sizing:border-box;margin:0px;padding:0px;" />
我們可以在瀏覽器的地址欄中輸入GET后的一長(cháng)串URL,然后回車(chē)看看我們得到了什么結果。
在瀏覽器中,我們看到了上圖中的一長(cháng)串文字。您可能想知道 - 這是什么?
恭喜,這是我們需要得到的數據。但是,它使用一種稱(chēng)為 JSON 的特殊數據格式。
JSON是互聯(lián)網(wǎng)上數據交互的主流格式之一。如果你想了解 JSON 的含義和用法,可以參考這篇教程。
在瀏覽器中,我們最初只能看到數據的第一部分。但它已經(jīng)收錄了有價(jià)值的內容:
{"items":[{"project":"en.wikipedia","article":"Albert_Einstein","granularity":"daily","timestamp":"2015100100","access":"all-access","agent":"all-agents","views":18860}<br style="box-sizing:border-box;margin:0px;padding:0px;" />
在本段中,我們看到項目名稱(chēng)(en.wikipedia)、文章 標題(Albert Einstein)、統計粒度(天)、時(shí)間戳(10/1/2015)、訪(fǎng)問(wèn)類(lèi)型(全部)、終端類(lèi)型(全部) 和訪(fǎng)問(wèn)次數 (18860).
我們使用滑塊將返回的文本拖到最后,我們會(huì )看到如下信息:
{"project":"en.wikipedia","article":"Albert_Einstein","granularity":"daily","timestamp":"2015103100","access":"all-access","agent":"all-agents","views":16380}]}<br style="box-sizing:border-box;margin:0px;padding:0px;" />
與 10 月 1 日的數據相比,只有時(shí)間戳(2015 年 10 月 31 日)和訪(fǎng)問(wèn)次數(16380))發(fā)生了變化。
在中間,我們跳過(guò)了 10 月 2 日至 10 月 30 日之間的數據。存儲格式相同,只是日期和訪(fǎng)問(wèn)次數的數據值在變化。
您需要的所有數據都在這里,您只需提取相應的信息即可。但是如果手動(dòng)進(jìn)行(比如將需要的項目復制粘貼到Excel中),顯然效率低下,容易出錯。讓我們展示如何使用 R 編程環(huán)境自動(dòng)化這個(gè)過(guò)程。
準備
在正式用 R 調用 API 之前,我們需要做一些必要的準備工作。
首先是安裝R。
請到本網(wǎng)站下載R基礎安裝包。
R的下載位置比較多,建議選擇清華鏡像,下載速度比較快。
請根據您的操作系統平臺選擇對應的版本進(jìn)行下載。我正在使用 macOS 版本。
下載 pkg 文件。雙擊安裝。
安裝完基礎包后,我們繼續安裝集成開(kāi)發(fā)環(huán)境RStudio。它可以幫助您輕松和交互式地與 R 進(jìn)行交流。RStudio的下載地址在這里。
根據你的操作系統,選擇對應的安裝包。macOS 安裝包是一個(gè) dmg 文件。雙擊打開(kāi)后,將RStudio.app圖標拖到Applications文件夾下,安裝完成。
下面我們雙擊從應用程序目錄運行RStudio。
我們先在 RStudio 的 Console 中運行以下語(yǔ)句來(lái)安裝一些需要的包:
install.packages("tidyverse")<br style="box-sizing:border-box;margin:0px;padding:0px;" />install.packages("rlist")<br style="box-sizing:border-box;margin:0px;padding:0px;" />
安裝完成后,在菜單中選擇File->New,在如下界面中選擇R Notebook。
R Notebook 默認為我們提供了一個(gè)帶有一些基本使用說(shuō)明的模板。
讓我們嘗試在編輯區域(左)的代碼部分(灰色)中單擊運行按鈕。
情節的結果可以立即看到。
我們點(diǎn)擊菜單欄上的Preview按鈕來(lái)查看整個(gè)代碼的效果。操作的結果將以帶有圖片和文本的 HTML 文件的形式顯示。
現在我們已經(jīng)熟悉了環(huán)境,是時(shí)候實(shí)際運行我們的代碼了。我們把編輯區的開(kāi)頭描述區保留在左邊,刪除其余的,把文件名改成有意義的web-data-api-with-R。
至此,準備工作就緒?,F在我們要開(kāi)始實(shí)際操作了。
操作
在實(shí)際操作過(guò)程中,我們以維基百科的另一個(gè)wiki文章為例來(lái)證明這種操作方法的通用性。選中的文章就是我們介紹詞云制作時(shí)使用的那個(gè),叫做“Yes, Minisiter”。這是一部 1980 年代的英國喜劇。
我們先在瀏覽器中試一下,看看能否修改 API 示例中的參數,獲取“是,部長(cháng)”文章 的訪(fǎng)問(wèn)統計信息。作為測試,我們僅采集 2017 年 10 月 1 日至 2017 年 10 月 3 日 3 天的數據。
與示例相反,我們需要替換的內容包括開(kāi)始和結束時(shí)間以及 文章 標題。
我們在瀏覽器的地址欄中輸入:
https://wikimedia.org/api/rest ... %3Bbr style="box-sizing:border-box;margin:0px;padding:0px;" />
返回結果如下:
數據可以正常返回。接下來(lái),我們使用語(yǔ)句方法在 RStudio 中調用。
請注意,在下面的代碼中,程序的輸出部分會(huì )在開(kāi)頭帶有## 標記,以區別于執行代碼本身。
啟動(dòng)后,我們需要設置時(shí)區。否則,您稍后在處理時(shí)間數據時(shí)會(huì )遇到錯誤。
Sys.setenv(TZ="Asia/Shanghai")<br style="box-sizing:border-box;margin:0px;padding:0px;" />
然后,我們調用 tidyverse 包,它是一個(gè)可以同時(shí)加載許多函數的集合,我們稍后會(huì )用到。
library(tidyverse)<br style="box-sizing:border-box;margin:0px;padding:0px;" /><br style="box-sizing:border-box;margin:0px;padding:0px;" />## Loading tidyverse: ggplot2<br style="box-sizing:border-box;margin:0px;padding:0px;" />## Loading tidyverse: tibble<br style="box-sizing:border-box;margin:0px;padding:0px;" />## Loading tidyverse: tidyr<br style="box-sizing:border-box;margin:0px;padding:0px;" />## Loading tidyverse: readr<br style="box-sizing:border-box;margin:0px;padding:0px;" />## Loading tidyverse: purrr<br style="box-sizing:border-box;margin:0px;padding:0px;" />## Loading tidyverse: dplyr<br style="box-sizing:border-box;margin:0px;padding:0px;" /><br style="box-sizing:border-box;margin:0px;padding:0px;" />## Conflicts with tidy packages ----------------------------------------------<br style="box-sizing:border-box;margin:0px;padding:0px;" /><br style="box-sizing:border-box;margin:0px;padding:0px;" />## filter(): dplyr, stats<br style="box-sizing:border-box;margin:0px;padding:0px;" />## lag(): ? ?dplyr, stats<br style="box-sizing:border-box;margin:0px;padding:0px;" />
這里可能有一些警告,請忽略它們。它對我們的運營(yíng)沒(méi)有影響。
根據前面的例子,我們定義要查詢(xún)的時(shí)間跨度,并指定要查找的wiki文章的名稱(chēng)。
請注意,與 Python 不同,在 R 中,賦值采用標記,而不是 =。不過(guò),R 語(yǔ)言其實(shí)很容易上手。如果你堅持使用=,它也能識別,不會(huì )報錯。
<p>starting 查看全部
文章采集api(如何用R調用API,提取和整理你需要的免費Web數據)
API是獲取Web數據的重要方式之一。想了解如何使用 R 調用 API 來(lái)提取和組織您需要的免費 Web 數據嗎?本文將逐步向您展示操作過(guò)程。

交易
俗話(huà)說(shuō),“聰明的女人,沒(méi)有飯難煮”。就算你掌握了數據分析十八門(mén)武功,沒(méi)有數據也是一件麻煩的事情?!鞍蔚抖?,茫然不知所措”,大概就是這樣。
有很多數據來(lái)源。Web 數據是數量龐大且相對容易獲取的類(lèi)型之一。更好的是,很多網(wǎng)絡(luò )數據都是免費的。
在這個(gè)所謂的大數據時(shí)代,如何獲取網(wǎng)絡(luò )數據?
許多人使用由他人編譯和發(fā)布的數據集。
他們很幸運,他們的工作可以建立在其他人的基礎上。這是最有效的。
但并不是每個(gè)人都這么幸運。如果您需要的數據從未被組織和發(fā)布過(guò)怎么辦?
事實(shí)上,這樣的數據量更大。我們是否對他們視而不見(jiàn)?
如果您考慮爬行動(dòng)物,那么您的想法是正確的。爬蟲(chóng)可以為您獲取幾乎所有可見(jiàn)(甚至不可見(jiàn))的網(wǎng)絡(luò )數據。然而,編寫(xiě)和使用爬蟲(chóng)的成本很高。包括時(shí)間資源、技術(shù)能力等。如果你遇到任何網(wǎng)絡(luò )數據獲取問(wèn)題,你不要想“大錘”,有時(shí)可能是“刀槍不入”。
在“別人準備的數據”和“需要自己爬取的數據”之間,還有一個(gè)廣闊的領(lǐng)域,這就是API的世界。
什么是 API?
它是應用程序編程接口的縮寫(xiě)。具體來(lái)說(shuō),某個(gè)網(wǎng)站的數據在不斷的積累和變化。如果對這些數據進(jìn)行整理,不僅費時(shí),而且占用空間,而且還有剛整理完就過(guò)時(shí)的危險。大多數人需要的數據其實(shí)只是其中的一小部分,但時(shí)效性要求可能非常強。因此,組織存儲并將其提供給公眾以供下載是不經(jīng)濟的。
但是,如果數據不能以某種方式打通,就會(huì )面臨無(wú)數爬蟲(chóng)的騷擾。這會(huì )對網(wǎng)站的正常運行造成很大的困擾。折衷方案是 網(wǎng)站 主動(dòng)提供通道。當你需要某部分數據時(shí),雖然沒(méi)有現成的數據集,但你只需要用這個(gè)通道描述你想要的數據,然后網(wǎng)站審核后(一般是自動(dòng)化的,瞬間完成),認為我可以給你,我會(huì )立即發(fā)送你明確要求的數據。雙方都很高興。
以后在找數據的時(shí)候,不妨看看目標網(wǎng)站有沒(méi)有提供API,避免無(wú)用的努力。
在這個(gè)github項目中,有一個(gè)非常詳細的列表,涵蓋了當前常見(jiàn)的主流網(wǎng)站API資源狀況。作者還在整理和修改中,大家可以采集起來(lái)慢慢看。

如果我們知道某個(gè)網(wǎng)站提供了API,通過(guò)查看文檔知道我們需要的數據在那里,那么問(wèn)題就變成了——如何通過(guò)API獲取數據?
下面我們用一個(gè)實(shí)際的例子來(lái)向您展示整個(gè)操作步驟。
資源
我們正在尋找的例子是維基百科。
有關(guān) Wikipedia API 的概述,請參閱此頁(yè)面。

假設我們關(guān)心特定時(shí)間段內對指定維基百科 文章 頁(yè)面的訪(fǎng)問(wèn)次數。
維基百科為我們提供了一種稱(chēng)為指標的數據,它涵蓋了頁(yè)面訪(fǎng)問(wèn)的關(guān)鍵價(jià)值。對應API的介紹頁(yè)面在這里。

頁(yè)面上有一個(gè)示例。假設需要獲取2015年10月愛(ài)因斯坦入口頁(yè)面的訪(fǎng)問(wèn)次數,可以這樣調用:
GET http://wikimedia.org/api/rest_ ... %3Bbr style="box-sizing:border-box;margin:0px;padding:0px;" />
我們可以在瀏覽器的地址欄中輸入GET后的一長(cháng)串URL,然后回車(chē)看看我們得到了什么結果。

在瀏覽器中,我們看到了上圖中的一長(cháng)串文字。您可能想知道 - 這是什么?
恭喜,這是我們需要得到的數據。但是,它使用一種稱(chēng)為 JSON 的特殊數據格式。
JSON是互聯(lián)網(wǎng)上數據交互的主流格式之一。如果你想了解 JSON 的含義和用法,可以參考這篇教程。
在瀏覽器中,我們最初只能看到數據的第一部分。但它已經(jīng)收錄了有價(jià)值的內容:
{"items":[{"project":"en.wikipedia","article":"Albert_Einstein","granularity":"daily","timestamp":"2015100100","access":"all-access","agent":"all-agents","views":18860}<br style="box-sizing:border-box;margin:0px;padding:0px;" />
在本段中,我們看到項目名稱(chēng)(en.wikipedia)、文章 標題(Albert Einstein)、統計粒度(天)、時(shí)間戳(10/1/2015)、訪(fǎng)問(wèn)類(lèi)型(全部)、終端類(lèi)型(全部) 和訪(fǎng)問(wèn)次數 (18860).
我們使用滑塊將返回的文本拖到最后,我們會(huì )看到如下信息:
{"project":"en.wikipedia","article":"Albert_Einstein","granularity":"daily","timestamp":"2015103100","access":"all-access","agent":"all-agents","views":16380}]}<br style="box-sizing:border-box;margin:0px;padding:0px;" />
與 10 月 1 日的數據相比,只有時(shí)間戳(2015 年 10 月 31 日)和訪(fǎng)問(wèn)次數(16380))發(fā)生了變化。
在中間,我們跳過(guò)了 10 月 2 日至 10 月 30 日之間的數據。存儲格式相同,只是日期和訪(fǎng)問(wèn)次數的數據值在變化。
您需要的所有數據都在這里,您只需提取相應的信息即可。但是如果手動(dòng)進(jìn)行(比如將需要的項目復制粘貼到Excel中),顯然效率低下,容易出錯。讓我們展示如何使用 R 編程環(huán)境自動(dòng)化這個(gè)過(guò)程。
準備
在正式用 R 調用 API 之前,我們需要做一些必要的準備工作。
首先是安裝R。
請到本網(wǎng)站下載R基礎安裝包。

R的下載位置比較多,建議選擇清華鏡像,下載速度比較快。

請根據您的操作系統平臺選擇對應的版本進(jìn)行下載。我正在使用 macOS 版本。
下載 pkg 文件。雙擊安裝。
安裝完基礎包后,我們繼續安裝集成開(kāi)發(fā)環(huán)境RStudio。它可以幫助您輕松和交互式地與 R 進(jìn)行交流。RStudio的下載地址在這里。

根據你的操作系統,選擇對應的安裝包。macOS 安裝包是一個(gè) dmg 文件。雙擊打開(kāi)后,將RStudio.app圖標拖到Applications文件夾下,安裝完成。

下面我們雙擊從應用程序目錄運行RStudio。

我們先在 RStudio 的 Console 中運行以下語(yǔ)句來(lái)安裝一些需要的包:
install.packages("tidyverse")<br style="box-sizing:border-box;margin:0px;padding:0px;" />install.packages("rlist")<br style="box-sizing:border-box;margin:0px;padding:0px;" />
安裝完成后,在菜單中選擇File->New,在如下界面中選擇R Notebook。

R Notebook 默認為我們提供了一個(gè)帶有一些基本使用說(shuō)明的模板。

讓我們嘗試在編輯區域(左)的代碼部分(灰色)中單擊運行按鈕。

情節的結果可以立即看到。
我們點(diǎn)擊菜單欄上的Preview按鈕來(lái)查看整個(gè)代碼的效果。操作的結果將以帶有圖片和文本的 HTML 文件的形式顯示。

現在我們已經(jīng)熟悉了環(huán)境,是時(shí)候實(shí)際運行我們的代碼了。我們把編輯區的開(kāi)頭描述區保留在左邊,刪除其余的,把文件名改成有意義的web-data-api-with-R。

至此,準備工作就緒?,F在我們要開(kāi)始實(shí)際操作了。
操作
在實(shí)際操作過(guò)程中,我們以維基百科的另一個(gè)wiki文章為例來(lái)證明這種操作方法的通用性。選中的文章就是我們介紹詞云制作時(shí)使用的那個(gè),叫做“Yes, Minisiter”。這是一部 1980 年代的英國喜劇。

我們先在瀏覽器中試一下,看看能否修改 API 示例中的參數,獲取“是,部長(cháng)”文章 的訪(fǎng)問(wèn)統計信息。作為測試,我們僅采集 2017 年 10 月 1 日至 2017 年 10 月 3 日 3 天的數據。
與示例相反,我們需要替換的內容包括開(kāi)始和結束時(shí)間以及 文章 標題。
我們在瀏覽器的地址欄中輸入:
https://wikimedia.org/api/rest ... %3Bbr style="box-sizing:border-box;margin:0px;padding:0px;" />
返回結果如下:

數據可以正常返回。接下來(lái),我們使用語(yǔ)句方法在 RStudio 中調用。
請注意,在下面的代碼中,程序的輸出部分會(huì )在開(kāi)頭帶有## 標記,以區別于執行代碼本身。
啟動(dòng)后,我們需要設置時(shí)區。否則,您稍后在處理時(shí)間數據時(shí)會(huì )遇到錯誤。
Sys.setenv(TZ="Asia/Shanghai")<br style="box-sizing:border-box;margin:0px;padding:0px;" />
然后,我們調用 tidyverse 包,它是一個(gè)可以同時(shí)加載許多函數的集合,我們稍后會(huì )用到。
library(tidyverse)<br style="box-sizing:border-box;margin:0px;padding:0px;" /><br style="box-sizing:border-box;margin:0px;padding:0px;" />## Loading tidyverse: ggplot2<br style="box-sizing:border-box;margin:0px;padding:0px;" />## Loading tidyverse: tibble<br style="box-sizing:border-box;margin:0px;padding:0px;" />## Loading tidyverse: tidyr<br style="box-sizing:border-box;margin:0px;padding:0px;" />## Loading tidyverse: readr<br style="box-sizing:border-box;margin:0px;padding:0px;" />## Loading tidyverse: purrr<br style="box-sizing:border-box;margin:0px;padding:0px;" />## Loading tidyverse: dplyr<br style="box-sizing:border-box;margin:0px;padding:0px;" /><br style="box-sizing:border-box;margin:0px;padding:0px;" />## Conflicts with tidy packages ----------------------------------------------<br style="box-sizing:border-box;margin:0px;padding:0px;" /><br style="box-sizing:border-box;margin:0px;padding:0px;" />## filter(): dplyr, stats<br style="box-sizing:border-box;margin:0px;padding:0px;" />## lag(): ? ?dplyr, stats<br style="box-sizing:border-box;margin:0px;padding:0px;" />
這里可能有一些警告,請忽略它們。它對我們的運營(yíng)沒(méi)有影響。
根據前面的例子,我們定義要查詢(xún)的時(shí)間跨度,并指定要查找的wiki文章的名稱(chēng)。
請注意,與 Python 不同,在 R 中,賦值采用標記,而不是 =。不過(guò),R 語(yǔ)言其實(shí)很容易上手。如果你堅持使用=,它也能識別,不會(huì )報錯。
<p>starting
文章采集api(在之前的文章中Python實(shí)現“維基百科六度分隔理論”)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 134 次瀏覽 ? 2022-02-24 21:13
在之前的文章 Python實(shí)現“維基百科六度分離理論”基礎爬蟲(chóng)中,我們實(shí)現了一個(gè)網(wǎng)站隨機從一個(gè)鏈接到另一個(gè)鏈接,但是如果我們需要系統對整個(gè)< @網(wǎng)站 分類(lèi),或者要搜索 網(wǎng)站 上的每一頁(yè),我們該怎么辦?我們需要采集整個(gè)網(wǎng)站,但這是一個(gè)非常占用內存的過(guò)程,尤其是在處理大的網(wǎng)站時(shí),更合適的工具是使用數據庫來(lái)存儲< @k11 資源為@>,之前也說(shuō)過(guò)。這是如何做到的。網(wǎng)站地圖站點(diǎn)地圖網(wǎng)站地圖,也稱(chēng)為站點(diǎn)地圖,是一個(gè)頁(yè)面,上面放置了網(wǎng)站上所有需要被搜索引擎抓取的頁(yè)面(注:不是所有頁(yè)面,所有 文章 鏈接。大多數人在 網(wǎng)站 上找不到所需信息時(shí),可能會(huì )求助于 網(wǎng)站 地圖。搜索引擎蜘蛛我非常喜歡 網(wǎng)站maps。對于 SEO,網(wǎng)站maps 的好處: 1. 為搜索引擎蜘蛛提供可以瀏覽整個(gè) 網(wǎng)站 的鏈接,簡(jiǎn)單地反映 網(wǎng)站 的整體框架 2. 為搜索引擎提供一些鏈接蜘蛛指向動(dòng)態(tài)頁(yè)面或其他方法更難訪(fǎng)問(wèn)的頁(yè)面;3、作為潛在的落地頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。當他們在 網(wǎng)站 上找不到他們需要的信息時(shí),地圖作為一種補救措施。搜索引擎蜘蛛我非常喜歡 網(wǎng)站maps。對于 SEO,網(wǎng)站maps 的好處: 1. 為搜索引擎蜘蛛提供可以瀏覽整個(gè) 網(wǎng)站 的鏈接,簡(jiǎn)單地反映 網(wǎng)站 的整體框架 2. 為搜索引擎提供一些鏈接蜘蛛指向動(dòng)態(tài)頁(yè)面或其他方法更難訪(fǎng)問(wèn)的頁(yè)面;3、作為潛在的落地頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。當他們在 網(wǎng)站 上找不到他們需要的信息時(shí),地圖作為一種補救措施。搜索引擎蜘蛛我非常喜歡 網(wǎng)站maps。對于 SEO,網(wǎng)站maps 的好處: 1. 為搜索引擎蜘蛛提供可以瀏覽整個(gè) 網(wǎng)站 的鏈接,簡(jiǎn)單地反映 網(wǎng)站 的整體框架 2. 為搜索引擎提供一些鏈接蜘蛛指向動(dòng)態(tài)頁(yè)面或其他方法更難訪(fǎng)問(wèn)的頁(yè)面;3、作為潛在的落地頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。@網(wǎng)站。搜索引擎蜘蛛我非常喜歡 網(wǎng)站maps。對于 SEO,網(wǎng)站maps 的好處: 1. 為搜索引擎蜘蛛提供可以瀏覽整個(gè) 網(wǎng)站 的鏈接,簡(jiǎn)單地反映 網(wǎng)站 的整體框架 2. 為搜索引擎提供一些鏈接蜘蛛指向動(dòng)態(tài)頁(yè)面或其他方法更難訪(fǎng)問(wèn)的頁(yè)面;3、作為潛在的落地頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。@網(wǎng)站。搜索引擎蜘蛛我非常喜歡 網(wǎng)站maps。對于 SEO,網(wǎng)站maps 的好處: 1. 為搜索引擎蜘蛛提供可以瀏覽整個(gè) 網(wǎng)站 的鏈接,簡(jiǎn)單地反映 網(wǎng)站 的整體框架 2. 為搜索引擎提供一些鏈接蜘蛛指向動(dòng)態(tài)頁(yè)面或其他方法更難訪(fǎng)問(wèn)的頁(yè)面;3、作為潛在的落地頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。為搜索引擎蜘蛛提供可以瀏覽整個(gè)網(wǎng)站的鏈接,簡(jiǎn)單反映網(wǎng)站的整體框架 2. 為搜索引擎蜘蛛提供一些鏈接,指向動(dòng)態(tài)頁(yè)面或更難到達的頁(yè)面其他方法;3、作為潛在的落地頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。為搜索引擎蜘蛛提供可以瀏覽整個(gè)網(wǎng)站的鏈接,簡(jiǎn)單反映網(wǎng)站的整體框架 2. 為搜索引擎蜘蛛提供一些鏈接,指向動(dòng)態(tài)頁(yè)面或更難到達的頁(yè)面其他方法;3、作為潛在的落地頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。作為一個(gè)潛在的著(zhù)陸頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。作為一個(gè)潛在的著(zhù)陸頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。
數據采集采集網(wǎng)站數據不難,但需要爬蟲(chóng)有足夠的深度。我們創(chuàng )建了一個(gè)爬蟲(chóng),它遞歸地遍歷每個(gè) 網(wǎng)站 并且只采集那些 網(wǎng)站 頁(yè)面上的數據。通常耗時(shí)的 網(wǎng)站采集 方法從頂層頁(yè)面(通常是 網(wǎng)站 主頁(yè))開(kāi)始,然后搜索頁(yè)面上的所有鏈接,形成一個(gè)列表,然后去到采集到這些鏈接的頁(yè)面,繼續采集到每個(gè)頁(yè)面的鏈接形成一個(gè)新列表,重復執行。顯然,這是一個(gè)復雜性迅速增長(cháng)的過(guò)程。每頁(yè)添加 10 個(gè)鏈接,在 網(wǎng)站 上添加 5 個(gè)頁(yè)面深度。如果采集 整個(gè)網(wǎng)站,則采集 頁(yè)的總數為105,即100,000 頁(yè)。因為很多網(wǎng)站的內部鏈接都是重復的,為了避免重復的采集,需要鏈接和去重。在 Python 中,最常用的去重方法是使用內置的集合采集方法。只有“新”鏈接是 采集??匆幌麓a示例: from urllib.request import urlopenfrom bs4 import BeautifulSoup import repages = set()def getLinks(pageurl):globalpageshtml= urlopen("" + pageurl)soup= BeautifulSoup(html)forlink in soup.findAll( "a", href=pile("^(/wiki/)")):if'href' in link.attrs:iflink.attrs['href'] not in pages:#這是一個(gè)新頁(yè)面 newPage= 鏈接。屬性[' @采集??匆幌麓a示例: from urllib.request import urlopenfrom bs4 import BeautifulSoup import repages = set()def getLinks(pageurl):globalpageshtml= urlopen("" + pageurl)soup= BeautifulSoup(html)forlink in soup.findAll( "a", href=pile("^(/wiki/)")):if'href' in link.attrs:iflink.attrs['href'] not in pages:#這是一個(gè)新頁(yè)面 newPage= 鏈接。屬性[' @采集??匆幌麓a示例: from urllib.request import urlopenfrom bs4 import BeautifulSoup import repages = set()def getLinks(pageurl):globalpageshtml= urlopen("" + pageurl)soup= BeautifulSoup(html)forlink in soup.findAll( "a", href=pile("^(/wiki/)")):if'href' in link.attrs:iflink.attrs['href'] not in pages:#這是一個(gè)新頁(yè)面 newPage= 鏈接。屬性['
遞歸警告:Python 的默認遞歸*為 1000 次,因為維基百科的鏈接太多,所以程序在達到遞歸*時(shí)停止。如果你不想讓它停止,你可以設置一個(gè)遞歸計數器或其他東西。采集整個(gè)網(wǎng)站數據為了有效地使用爬蟲(chóng),我們在使用爬蟲(chóng)時(shí)需要在頁(yè)面上做一些事情。讓我們創(chuàng )建一個(gè)爬蟲(chóng)來(lái)采集有關(guān)頁(yè)面標題、正文第一段和編輯頁(yè)面的鏈接(如果有的話(huà))的信息。第一步,我們需要在網(wǎng)站上觀(guān)察頁(yè)面,然后制定采集模式,通過(guò)F12(一般情況下)檢查元素,就可以看到頁(yè)面的構成了。查看維基百科頁(yè)面,包括入口和非入口頁(yè)面,例如隱私政策頁(yè)面,可以得出以下規則:所有標題都在h1→span標簽中,頁(yè)面上只有一個(gè)h1標簽。所有正文都在 div#bodyContent 標記中。如果要獲取第一段文字,可以使用div#mw-content-text→p。此規則適用于除文件頁(yè)面之外的所有頁(yè)面。編輯鏈接僅出現在入口頁(yè)面上。如果有編輯鏈接,則位于li#ca-edit標簽的li#ca-edit→span→a中。調整前面的代碼,我們可以構建一個(gè)爬蟲(chóng)和數據的組合程序采集,代碼如下: import redef getLinks(pageUrl):global pageshtml = urlopen("" + pageUrl)soup = BeautifulSoup(html)嘗試: print(soup.h1.get_text())print(soup.find(id="mw-content-text").findAll("p")[0])print(soup.find(id =" ca-edit").find("span").find("a").attrs['href' 并且頁(yè)面上只有一個(gè) h1 標簽。所有正文都在 div#bodyContent 標記中。如果要獲取第一段文字,可以使用div#mw-content-text→p。此規則適用于除文件頁(yè)面之外的所有頁(yè)面。編輯鏈接僅出現在入口頁(yè)面上。如果有編輯鏈接,則位于li#ca-edit標簽的li#ca-edit→span→a中。調整前面的代碼,我們可以構建一個(gè)爬蟲(chóng)和數據的組合程序采集,代碼如下: import redef getLinks(pageUrl):global pageshtml = urlopen("" + pageUrl)soup = BeautifulSoup(html)嘗試: print(soup.h1.get_text())print(soup.find(id="mw-content-text").findAll("p")[0])print(soup.find(id =" ca-edit").find("span").find("a").attrs['href' 并且頁(yè)面上只有一個(gè) h1 標簽。所有正文都在 div#bodyContent 標記中。如果要獲取第一段文字,可以使用div#mw-content-text→p。此規則適用于除文件頁(yè)面之外的所有頁(yè)面。編輯鏈接僅出現在入口頁(yè)面上。如果有編輯鏈接,則位于li#ca-edit標簽的li#ca-edit→span→a中。調整前面的代碼,我們可以構建一個(gè)爬蟲(chóng)和數據的組合程序采集,代碼如下: import redef getLinks(pageUrl):global pageshtml = urlopen("" + pageUrl)soup = BeautifulSoup(html)嘗試: print(soup.h1.get_text())print(soup.find(id="mw-content-text").findAll("p")[0])print(soup.find(id =" ca-edit").find("span").find("a").attrs['href' 所有正文都在 div#bodyContent 標記中。如果要獲取第一段文字,可以使用div#mw-content-text→p。此規則適用于除文件頁(yè)面之外的所有頁(yè)面。編輯鏈接僅出現在入口頁(yè)面上。如果有編輯鏈接,則位于li#ca-edit標簽的li#ca-edit→span→a中。調整前面的代碼,我們可以構建一個(gè)爬蟲(chóng)和數據的組合程序采集,代碼如下: import redef getLinks(pageUrl):global pageshtml = urlopen("" + pageUrl)soup = BeautifulSoup(html)嘗試: print(soup.h1.get_text())print(soup.find(id="mw-content-text").findAll("p")[0])print(soup.find(id =" ca-edit").find("span").find("a").attrs['href' 所有正文都在 div#bodyContent 標記中。如果要獲取第一段文字,可以使用div#mw-content-text→p。此規則適用于除文件頁(yè)面之外的所有頁(yè)面。編輯鏈接僅出現在入口頁(yè)面上。如果有編輯鏈接,則位于li#ca-edit標簽的li#ca-edit→span→a中。調整前面的代碼,我們可以構建一個(gè)爬蟲(chóng)和數據的組合程序采集,代碼如下: import redef getLinks(pageUrl):global pageshtml = urlopen("" + pageUrl)soup = BeautifulSoup(html)嘗試: print(soup.h1.get_text())print(soup.find(id="mw-content-text").findAll("p")[0])print(soup.find(id =" ca-edit").find("span").find("a").attrs['href' 此規則適用于除文件頁(yè)面之外的所有頁(yè)面。編輯鏈接僅出現在入口頁(yè)面上。如果有編輯鏈接,則位于li#ca-edit標簽的li#ca-edit→span→a中。調整前面的代碼,我們可以構建一個(gè)爬蟲(chóng)和數據的組合程序采集,代碼如下: import redef getLinks(pageUrl):global pageshtml = urlopen("" + pageUrl)soup = BeautifulSoup(html)嘗試: print(soup.h1.get_text())print(soup.find(id="mw-content-text").findAll("p")[0])print(soup.find(id =" ca-edit").find("span").find("a").attrs['href' 此規則適用于除文件頁(yè)面之外的所有頁(yè)面。編輯鏈接僅出現在入口頁(yè)面上。如果有編輯鏈接,則位于li#ca-edit標簽的li#ca-edit→span→a中。調整前面的代碼,我們可以構建一個(gè)爬蟲(chóng)和數據的組合程序采集,代碼如下: import redef getLinks(pageUrl):global pageshtml = urlopen("" + pageUrl)soup = BeautifulSoup(html)嘗試: print(soup.h1.get_text())print(soup.find(id="mw-content-text").findAll("p")[0])print(soup.find(id =" ca-edit").find("span").find("a").attrs['href'
<p>在數據存儲到 MySQL 之前,數據已經(jīng)被獲取。直接打印出來(lái)比較麻煩,所以我們可以直接存入MySQL。這里只存儲鏈接是沒(méi)有意義的,所以我們存儲頁(yè)面的標題和內容。我之前有兩篇文章 文章 介紹了如何在 MySQL 中存儲數據。數據表為pages,代碼如下: import reimport datetimeimport randomimport pymysqlconn = pymysql.connect(host = '127.< @0. 查看全部
文章采集api(在之前的文章中Python實(shí)現“維基百科六度分隔理論”)
在之前的文章 Python實(shí)現“維基百科六度分離理論”基礎爬蟲(chóng)中,我們實(shí)現了一個(gè)網(wǎng)站隨機從一個(gè)鏈接到另一個(gè)鏈接,但是如果我們需要系統對整個(gè)< @網(wǎng)站 分類(lèi),或者要搜索 網(wǎng)站 上的每一頁(yè),我們該怎么辦?我們需要采集整個(gè)網(wǎng)站,但這是一個(gè)非常占用內存的過(guò)程,尤其是在處理大的網(wǎng)站時(shí),更合適的工具是使用數據庫來(lái)存儲< @k11 資源為@>,之前也說(shuō)過(guò)。這是如何做到的。網(wǎng)站地圖站點(diǎn)地圖網(wǎng)站地圖,也稱(chēng)為站點(diǎn)地圖,是一個(gè)頁(yè)面,上面放置了網(wǎng)站上所有需要被搜索引擎抓取的頁(yè)面(注:不是所有頁(yè)面,所有 文章 鏈接。大多數人在 網(wǎng)站 上找不到所需信息時(shí),可能會(huì )求助于 網(wǎng)站 地圖。搜索引擎蜘蛛我非常喜歡 網(wǎng)站maps。對于 SEO,網(wǎng)站maps 的好處: 1. 為搜索引擎蜘蛛提供可以瀏覽整個(gè) 網(wǎng)站 的鏈接,簡(jiǎn)單地反映 網(wǎng)站 的整體框架 2. 為搜索引擎提供一些鏈接蜘蛛指向動(dòng)態(tài)頁(yè)面或其他方法更難訪(fǎng)問(wèn)的頁(yè)面;3、作為潛在的落地頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。當他們在 網(wǎng)站 上找不到他們需要的信息時(shí),地圖作為一種補救措施。搜索引擎蜘蛛我非常喜歡 網(wǎng)站maps。對于 SEO,網(wǎng)站maps 的好處: 1. 為搜索引擎蜘蛛提供可以瀏覽整個(gè) 網(wǎng)站 的鏈接,簡(jiǎn)單地反映 網(wǎng)站 的整體框架 2. 為搜索引擎提供一些鏈接蜘蛛指向動(dòng)態(tài)頁(yè)面或其他方法更難訪(fǎng)問(wèn)的頁(yè)面;3、作為潛在的落地頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。當他們在 網(wǎng)站 上找不到他們需要的信息時(shí),地圖作為一種補救措施。搜索引擎蜘蛛我非常喜歡 網(wǎng)站maps。對于 SEO,網(wǎng)站maps 的好處: 1. 為搜索引擎蜘蛛提供可以瀏覽整個(gè) 網(wǎng)站 的鏈接,簡(jiǎn)單地反映 網(wǎng)站 的整體框架 2. 為搜索引擎提供一些鏈接蜘蛛指向動(dòng)態(tài)頁(yè)面或其他方法更難訪(fǎng)問(wèn)的頁(yè)面;3、作為潛在的落地頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。@網(wǎng)站。搜索引擎蜘蛛我非常喜歡 網(wǎng)站maps。對于 SEO,網(wǎng)站maps 的好處: 1. 為搜索引擎蜘蛛提供可以瀏覽整個(gè) 網(wǎng)站 的鏈接,簡(jiǎn)單地反映 網(wǎng)站 的整體框架 2. 為搜索引擎提供一些鏈接蜘蛛指向動(dòng)態(tài)頁(yè)面或其他方法更難訪(fǎng)問(wèn)的頁(yè)面;3、作為潛在的落地頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。@網(wǎng)站。搜索引擎蜘蛛我非常喜歡 網(wǎng)站maps。對于 SEO,網(wǎng)站maps 的好處: 1. 為搜索引擎蜘蛛提供可以瀏覽整個(gè) 網(wǎng)站 的鏈接,簡(jiǎn)單地反映 網(wǎng)站 的整體框架 2. 為搜索引擎提供一些鏈接蜘蛛指向動(dòng)態(tài)頁(yè)面或其他方法更難訪(fǎng)問(wèn)的頁(yè)面;3、作為潛在的落地頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。為搜索引擎蜘蛛提供可以瀏覽整個(gè)網(wǎng)站的鏈接,簡(jiǎn)單反映網(wǎng)站的整體框架 2. 為搜索引擎蜘蛛提供一些鏈接,指向動(dòng)態(tài)頁(yè)面或更難到達的頁(yè)面其他方法;3、作為潛在的落地頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。為搜索引擎蜘蛛提供可以瀏覽整個(gè)網(wǎng)站的鏈接,簡(jiǎn)單反映網(wǎng)站的整體框架 2. 為搜索引擎蜘蛛提供一些鏈接,指向動(dòng)態(tài)頁(yè)面或更難到達的頁(yè)面其他方法;3、作為潛在的落地頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。作為一個(gè)潛在的著(zhù)陸頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。作為一個(gè)潛在的著(zhù)陸頁(yè),可以針對搜索流量進(jìn)行優(yōu)化;4. 如果您訪(fǎng)問(wèn)如果訪(fǎng)問(wèn)者試圖訪(fǎng)問(wèn)一個(gè)在 網(wǎng)站 域中不存在的 URL,訪(fǎng)問(wèn)者將被重定向到“找不到文件”錯誤頁(yè)面,并且 網(wǎng)站 映射可以用作該頁(yè)面的“準”內容。
數據采集采集網(wǎng)站數據不難,但需要爬蟲(chóng)有足夠的深度。我們創(chuàng )建了一個(gè)爬蟲(chóng),它遞歸地遍歷每個(gè) 網(wǎng)站 并且只采集那些 網(wǎng)站 頁(yè)面上的數據。通常耗時(shí)的 網(wǎng)站采集 方法從頂層頁(yè)面(通常是 網(wǎng)站 主頁(yè))開(kāi)始,然后搜索頁(yè)面上的所有鏈接,形成一個(gè)列表,然后去到采集到這些鏈接的頁(yè)面,繼續采集到每個(gè)頁(yè)面的鏈接形成一個(gè)新列表,重復執行。顯然,這是一個(gè)復雜性迅速增長(cháng)的過(guò)程。每頁(yè)添加 10 個(gè)鏈接,在 網(wǎng)站 上添加 5 個(gè)頁(yè)面深度。如果采集 整個(gè)網(wǎng)站,則采集 頁(yè)的總數為105,即100,000 頁(yè)。因為很多網(wǎng)站的內部鏈接都是重復的,為了避免重復的采集,需要鏈接和去重。在 Python 中,最常用的去重方法是使用內置的集合采集方法。只有“新”鏈接是 采集??匆幌麓a示例: from urllib.request import urlopenfrom bs4 import BeautifulSoup import repages = set()def getLinks(pageurl):globalpageshtml= urlopen("" + pageurl)soup= BeautifulSoup(html)forlink in soup.findAll( "a", href=pile("^(/wiki/)")):if'href' in link.attrs:iflink.attrs['href'] not in pages:#這是一個(gè)新頁(yè)面 newPage= 鏈接。屬性[' @采集??匆幌麓a示例: from urllib.request import urlopenfrom bs4 import BeautifulSoup import repages = set()def getLinks(pageurl):globalpageshtml= urlopen("" + pageurl)soup= BeautifulSoup(html)forlink in soup.findAll( "a", href=pile("^(/wiki/)")):if'href' in link.attrs:iflink.attrs['href'] not in pages:#這是一個(gè)新頁(yè)面 newPage= 鏈接。屬性[' @采集??匆幌麓a示例: from urllib.request import urlopenfrom bs4 import BeautifulSoup import repages = set()def getLinks(pageurl):globalpageshtml= urlopen("" + pageurl)soup= BeautifulSoup(html)forlink in soup.findAll( "a", href=pile("^(/wiki/)")):if'href' in link.attrs:iflink.attrs['href'] not in pages:#這是一個(gè)新頁(yè)面 newPage= 鏈接。屬性['
遞歸警告:Python 的默認遞歸*為 1000 次,因為維基百科的鏈接太多,所以程序在達到遞歸*時(shí)停止。如果你不想讓它停止,你可以設置一個(gè)遞歸計數器或其他東西。采集整個(gè)網(wǎng)站數據為了有效地使用爬蟲(chóng),我們在使用爬蟲(chóng)時(shí)需要在頁(yè)面上做一些事情。讓我們創(chuàng )建一個(gè)爬蟲(chóng)來(lái)采集有關(guān)頁(yè)面標題、正文第一段和編輯頁(yè)面的鏈接(如果有的話(huà))的信息。第一步,我們需要在網(wǎng)站上觀(guān)察頁(yè)面,然后制定采集模式,通過(guò)F12(一般情況下)檢查元素,就可以看到頁(yè)面的構成了。查看維基百科頁(yè)面,包括入口和非入口頁(yè)面,例如隱私政策頁(yè)面,可以得出以下規則:所有標題都在h1→span標簽中,頁(yè)面上只有一個(gè)h1標簽。所有正文都在 div#bodyContent 標記中。如果要獲取第一段文字,可以使用div#mw-content-text→p。此規則適用于除文件頁(yè)面之外的所有頁(yè)面。編輯鏈接僅出現在入口頁(yè)面上。如果有編輯鏈接,則位于li#ca-edit標簽的li#ca-edit→span→a中。調整前面的代碼,我們可以構建一個(gè)爬蟲(chóng)和數據的組合程序采集,代碼如下: import redef getLinks(pageUrl):global pageshtml = urlopen("" + pageUrl)soup = BeautifulSoup(html)嘗試: print(soup.h1.get_text())print(soup.find(id="mw-content-text").findAll("p")[0])print(soup.find(id =" ca-edit").find("span").find("a").attrs['href' 并且頁(yè)面上只有一個(gè) h1 標簽。所有正文都在 div#bodyContent 標記中。如果要獲取第一段文字,可以使用div#mw-content-text→p。此規則適用于除文件頁(yè)面之外的所有頁(yè)面。編輯鏈接僅出現在入口頁(yè)面上。如果有編輯鏈接,則位于li#ca-edit標簽的li#ca-edit→span→a中。調整前面的代碼,我們可以構建一個(gè)爬蟲(chóng)和數據的組合程序采集,代碼如下: import redef getLinks(pageUrl):global pageshtml = urlopen("" + pageUrl)soup = BeautifulSoup(html)嘗試: print(soup.h1.get_text())print(soup.find(id="mw-content-text").findAll("p")[0])print(soup.find(id =" ca-edit").find("span").find("a").attrs['href' 并且頁(yè)面上只有一個(gè) h1 標簽。所有正文都在 div#bodyContent 標記中。如果要獲取第一段文字,可以使用div#mw-content-text→p。此規則適用于除文件頁(yè)面之外的所有頁(yè)面。編輯鏈接僅出現在入口頁(yè)面上。如果有編輯鏈接,則位于li#ca-edit標簽的li#ca-edit→span→a中。調整前面的代碼,我們可以構建一個(gè)爬蟲(chóng)和數據的組合程序采集,代碼如下: import redef getLinks(pageUrl):global pageshtml = urlopen("" + pageUrl)soup = BeautifulSoup(html)嘗試: print(soup.h1.get_text())print(soup.find(id="mw-content-text").findAll("p")[0])print(soup.find(id =" ca-edit").find("span").find("a").attrs['href' 所有正文都在 div#bodyContent 標記中。如果要獲取第一段文字,可以使用div#mw-content-text→p。此規則適用于除文件頁(yè)面之外的所有頁(yè)面。編輯鏈接僅出現在入口頁(yè)面上。如果有編輯鏈接,則位于li#ca-edit標簽的li#ca-edit→span→a中。調整前面的代碼,我們可以構建一個(gè)爬蟲(chóng)和數據的組合程序采集,代碼如下: import redef getLinks(pageUrl):global pageshtml = urlopen("" + pageUrl)soup = BeautifulSoup(html)嘗試: print(soup.h1.get_text())print(soup.find(id="mw-content-text").findAll("p")[0])print(soup.find(id =" ca-edit").find("span").find("a").attrs['href' 所有正文都在 div#bodyContent 標記中。如果要獲取第一段文字,可以使用div#mw-content-text→p。此規則適用于除文件頁(yè)面之外的所有頁(yè)面。編輯鏈接僅出現在入口頁(yè)面上。如果有編輯鏈接,則位于li#ca-edit標簽的li#ca-edit→span→a中。調整前面的代碼,我們可以構建一個(gè)爬蟲(chóng)和數據的組合程序采集,代碼如下: import redef getLinks(pageUrl):global pageshtml = urlopen("" + pageUrl)soup = BeautifulSoup(html)嘗試: print(soup.h1.get_text())print(soup.find(id="mw-content-text").findAll("p")[0])print(soup.find(id =" ca-edit").find("span").find("a").attrs['href' 此規則適用于除文件頁(yè)面之外的所有頁(yè)面。編輯鏈接僅出現在入口頁(yè)面上。如果有編輯鏈接,則位于li#ca-edit標簽的li#ca-edit→span→a中。調整前面的代碼,我們可以構建一個(gè)爬蟲(chóng)和數據的組合程序采集,代碼如下: import redef getLinks(pageUrl):global pageshtml = urlopen("" + pageUrl)soup = BeautifulSoup(html)嘗試: print(soup.h1.get_text())print(soup.find(id="mw-content-text").findAll("p")[0])print(soup.find(id =" ca-edit").find("span").find("a").attrs['href' 此規則適用于除文件頁(yè)面之外的所有頁(yè)面。編輯鏈接僅出現在入口頁(yè)面上。如果有編輯鏈接,則位于li#ca-edit標簽的li#ca-edit→span→a中。調整前面的代碼,我們可以構建一個(gè)爬蟲(chóng)和數據的組合程序采集,代碼如下: import redef getLinks(pageUrl):global pageshtml = urlopen("" + pageUrl)soup = BeautifulSoup(html)嘗試: print(soup.h1.get_text())print(soup.find(id="mw-content-text").findAll("p")[0])print(soup.find(id =" ca-edit").find("span").find("a").attrs['href'
<p>在數據存儲到 MySQL 之前,數據已經(jīng)被獲取。直接打印出來(lái)比較麻煩,所以我們可以直接存入MySQL。這里只存儲鏈接是沒(méi)有意義的,所以我們存儲頁(yè)面的標題和內容。我之前有兩篇文章 文章 介紹了如何在 MySQL 中存儲數據。數據表為pages,代碼如下: import reimport datetimeimport randomimport pymysqlconn = pymysql.connect(host = '127.< @0.
文章采集api(大數據搜集體系有哪些分類(lèi)?搜集日志數據分類(lèi))
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 136 次瀏覽 ? 2022-02-24 21:11
【摘要】大數據采集技術(shù)對數據進(jìn)行ETL運算,提取、轉換、加載數據,最終挖掘數據的潛在價(jià)值,進(jìn)而為用戶(hù)提供解決方案或決策參考。那么,大數據采集系統的分類(lèi)有哪些呢?今天就和小編一起來(lái)了解一下吧!
1、系統日志采集系統
采集和采集日志數據信息,然后進(jìn)行數據分析,挖掘日志數據在公司交易渠道中的潛在價(jià)值??傊?,采集日志數據提供了離線(xiàn)和在線(xiàn)的實(shí)時(shí)分析應用。目前常用的開(kāi)源日志采集系統是 Flume。
2、網(wǎng)絡(luò )數據采集系統
通過(guò)網(wǎng)絡(luò )爬蟲(chóng)和一些網(wǎng)站渠道提供的公共API(如推特和新浪微博API)從網(wǎng)站獲取數據。它可以從網(wǎng)頁(yè)中提取非結構化數據和半結構化數據的網(wǎng)頁(yè)數據,提取、清洗并轉換為結構化數據,并存儲為一致的本地文件數據。
目前常用的網(wǎng)絡(luò )爬蟲(chóng)系統包括Apache Nutch、Crawler4j、Scrapy等結構。
3、數據庫采集系統
數據庫采集系統直接與企業(yè)事務(wù)后臺服務(wù)器結合后,在企業(yè)事務(wù)后臺每時(shí)每刻都將大量事務(wù)記錄寫(xiě)入數據庫,最終由特定的處理系統對系統進(jìn)行分析。
目前,存儲數據常用MySQL、Oracle等關(guān)系型數據庫,采集數據也常用Redis、MongoDB等NoSQL數據庫。
關(guān)于大數據采集系統的分類(lèi),青騰小編就在這里跟大家分享一下。如果你對大數據工程有濃厚的興趣,希望這篇文章可以幫助到你。如果想了解更多數據分析師和大數據工程師的技能和資料,可以點(diǎn)擊本站其他文章進(jìn)行學(xué)習。 查看全部
文章采集api(大數據搜集體系有哪些分類(lèi)?搜集日志數據分類(lèi))
【摘要】大數據采集技術(shù)對數據進(jìn)行ETL運算,提取、轉換、加載數據,最終挖掘數據的潛在價(jià)值,進(jìn)而為用戶(hù)提供解決方案或決策參考。那么,大數據采集系統的分類(lèi)有哪些呢?今天就和小編一起來(lái)了解一下吧!

1、系統日志采集系統
采集和采集日志數據信息,然后進(jìn)行數據分析,挖掘日志數據在公司交易渠道中的潛在價(jià)值??傊?,采集日志數據提供了離線(xiàn)和在線(xiàn)的實(shí)時(shí)分析應用。目前常用的開(kāi)源日志采集系統是 Flume。
2、網(wǎng)絡(luò )數據采集系統
通過(guò)網(wǎng)絡(luò )爬蟲(chóng)和一些網(wǎng)站渠道提供的公共API(如推特和新浪微博API)從網(wǎng)站獲取數據。它可以從網(wǎng)頁(yè)中提取非結構化數據和半結構化數據的網(wǎng)頁(yè)數據,提取、清洗并轉換為結構化數據,并存儲為一致的本地文件數據。
目前常用的網(wǎng)絡(luò )爬蟲(chóng)系統包括Apache Nutch、Crawler4j、Scrapy等結構。
3、數據庫采集系統
數據庫采集系統直接與企業(yè)事務(wù)后臺服務(wù)器結合后,在企業(yè)事務(wù)后臺每時(shí)每刻都將大量事務(wù)記錄寫(xiě)入數據庫,最終由特定的處理系統對系統進(jìn)行分析。
目前,存儲數據常用MySQL、Oracle等關(guān)系型數據庫,采集數據也常用Redis、MongoDB等NoSQL數據庫。
關(guān)于大數據采集系統的分類(lèi),青騰小編就在這里跟大家分享一下。如果你對大數據工程有濃厚的興趣,希望這篇文章可以幫助到你。如果想了解更多數據分析師和大數據工程師的技能和資料,可以點(diǎn)擊本站其他文章進(jìn)行學(xué)習。
文章采集api(Scrapy一個(gè) )
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 152 次瀏覽 ? 2022-02-23 07:17
)
內容
架構介紹
Scrapy 是一個(gè)開(kāi)源和協(xié)作框架,最初是為頁(yè)面抓?。ǜ鼫蚀_地說(shuō)是網(wǎng)頁(yè)抓?。┒O計的,它允許您以快速、簡(jiǎn)單和可擴展的方式從所需數據中提取所有信息。但目前,Scrapy 的用途非常廣泛,例如數據挖掘、監控和自動(dòng)化測試,也可以用來(lái)獲取 API(例如 Amazon Associates Web Services)或一般網(wǎng)絡(luò )爬蟲(chóng)返回的數據。
Scrapy 是基于 twisted 框架開(kāi)發(fā)的,這是一個(gè)流行的事件驅動(dòng)的 Python 網(wǎng)絡(luò )框架。所以 Scrapy 使用非阻塞(又名異步)代碼來(lái)實(shí)現并發(fā)。整體結構大致如下
IO多路復用
# 引擎(EGINE)(大總管)
引擎負責控制系統所有組件之間的數據流,并在某些動(dòng)作發(fā)生時(shí)觸發(fā)事件。有關(guān)詳細信息,請參見(jiàn)上面的數據流部分。
# 調度器(SCHEDULER)
用來(lái)接受引擎發(fā)過(guò)來(lái)的請求, 壓入隊列中, 并在引擎再次請求的時(shí)候返回. 可以想像成一個(gè)URL的優(yōu)先級隊列, 由它來(lái)決定下一個(gè)要抓取的網(wǎng)址是什么, 同時(shí)去除重復的網(wǎng)址
# 下載器(DOWLOADER)
用于下載網(wǎng)頁(yè)內容, 并將網(wǎng)頁(yè)內容返回給EGINE,下載器是建立在twisted這個(gè)高效的異步模型上的
# 爬蟲(chóng)(SPIDERS)
SPIDERS是開(kāi)發(fā)人員自定義的類(lèi),用來(lái)解析responses,并且提取items,或者發(fā)送新的請求
# 項目管道(ITEM PIPLINES)
在items被提取后負責處理它們,主要包括清理、驗證、持久化(比如存到數據庫)等操作
# 兩個(gè)中間件
-爬蟲(chóng)中間件
-下載中間件(用的最多,加頭,加代理,加cookie,集成selenium)
安裝創(chuàng )建和啟動(dòng)
# 1 框架 不是 模塊
# 2 號稱(chēng)爬蟲(chóng)界的django(你會(huì )發(fā)現,跟django很多地方一樣)
# 3 安裝
-mac,linux平臺:pip3 install scrapy
-windows平臺:pip3 install scrapy(大部分人可以)
- 如果失?。?br /> 1、pip3 install wheel #安裝后,便支持通過(guò)wheel文件安裝軟件,wheel文件官網(wǎng):https://www.lfd.uci.edu/~gohlke/pythonlibs
3、pip3 install lxml
4、pip3 install pyopenssl
5、下載并安裝pywin32:https://sourceforge.net/projec ... in32/
6、下載twisted的wheel文件:http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
7、執行pip3 install 下載目錄\Twisted-17.9.0-cp36-cp36m-win_amd64.whl
8、pip3 install scrapy
# 4 在script文件夾下會(huì )有scrapy.exe可執行文件
-創(chuàng )建scrapy項目:scrapy startproject 項目名 (django創(chuàng )建項目)
-創(chuàng )建爬蟲(chóng):scrapy genspider 爬蟲(chóng)名 要爬取的網(wǎng)站地址 # 可以創(chuàng )建多個(gè)爬蟲(chóng)
# 5 命令啟動(dòng)爬蟲(chóng)
-scrapy crawl 爬蟲(chóng)名字
-scrapy crawl 爬蟲(chóng)名字 --nolog # 沒(méi)有日志輸出啟動(dòng)
# 6 文件執行爬蟲(chóng)(推薦使用)
-在項目路徑下創(chuàng )建一個(gè)main.py,右鍵執行即可
from scrapy.cmdline import execute
# execute(['scrapy','crawl','chouti','--nolog']) # 沒(méi)有設置日志級別
execute(['scrapy','crawl','chouti']) # 設置了日志級別
配置文件目錄介紹
-crawl_chouti # 項目名
-crawl_chouti # 跟項目一個(gè)名,文件夾
-spiders # spiders:放著(zhù)爬蟲(chóng) genspider生成的爬蟲(chóng),都放在這下面
-__init__.py
-chouti.py # 抽屜爬蟲(chóng)
-cnblogs.py # cnblogs 爬蟲(chóng)
-items.py # 對比django中的models.py文件 ,寫(xiě)一個(gè)個(gè)的模型類(lèi)
-middlewares.py # 中間件(爬蟲(chóng)中間件,下載中間件),中間件寫(xiě)在這
-pipelines.py # 寫(xiě)持久化的地方(持久化到文件,mysql,redis,mongodb)
-settings.py # 配置文件
-scrapy.cfg # 不用關(guān)注,上線(xiàn)相關(guān)的
# 配置文件settings.py
ROBOTSTXT_OBEY = False # 是否遵循爬蟲(chóng)協(xié)議,強行運行
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36' # 請求頭中的ua,去瀏覽器復制,或者用ua池拿
LOG_LEVEL='ERROR' # 這樣配置,程序錯誤信息才會(huì )打印,
#啟動(dòng)爬蟲(chóng)直接 scrapy crawl 爬蟲(chóng)名 就沒(méi)有日志輸出
# scrapy crawl 爬蟲(chóng)名 --nolog # 配置了就不需要這樣啟動(dòng)了
# 爬蟲(chóng)文件
class ChoutiSpider(scrapy.Spider):
name = 'chouti' # 爬蟲(chóng)名字
allowed_domains = ['https://dig.chouti.com/'] # 允許爬取的域,想要多爬就注釋掉
start_urls = ['https://dig.chouti.com/'] # 起始爬取的位置,爬蟲(chóng)一啟動(dòng),會(huì )先向它發(fā)請求
def parse(self, response): # 解析,請求回來(lái),自動(dòng)執行parser,在這個(gè)方法中做解析
print('---------------------------',response)
抓取數據并解析
# 1 解析,可以使用bs4解析
from bs4 import BeautifulSoup
soup=BeautifulSoup(response.text,'lxml')
soup.find_all() # bs4解析
soup.select() # css解析
# 2 內置的解析器
response.css
response.xpath
# 內置解析
# 所有用css或者xpath選擇出來(lái)的都放在列表中
# 取第一個(gè):extract_first()
# 取出所有extract()
# css選擇器取文本和屬性:
# .link-title::text # 取文本,數據都在data中
# .link-title::attr(href) # 取屬性,數據都在data中
# xpath選擇器取文本和屬性
# .//a[contains(@class,"link-title")/text()]
#.//a[contains(@class,"link-title")/@href]
# 內置css選擇期,取所有
div_list = response.css('.link-con .link-item')
for div in div_list:
content = div.css('.link-title').extract()
print(content)
數據持久化
# 方式一(不推薦)
-1 parser解析函數,return 列表,列表套字典
# 命令 (支持:('json', 'jsonlines', 'jl', 'csv', 'xml', 'marshal', 'pickle')
# 數據到aa.json文件中
-2 scrapy crawl chouti -o aa.json
# 代碼:
lis = []
for div in div_list:
content = div.select('.link-title')[0].text
lis.append({'title':content})
return lis
# 方式二 pipline的方式(管道)
-1 在items.py中創(chuàng )建模型類(lèi)
-2 在爬蟲(chóng)中chouti.py,引入,把解析的數據放到item對象中(要用中括號)
-3 yield item對象
-4 配置文件配置管道
ITEM_PIPELINES = {
# 數字表示優(yōu)先級(數字越小,優(yōu)先級越大)
'crawl_chouti.pipelines.CrawlChoutiPipeline': 300,
'crawl_chouti.pipelines.CrawlChoutiRedisPipeline': 301,
}
-5 pipline.py中寫(xiě)持久化的類(lèi)
spider_open # 方法,一開(kāi)始就打開(kāi)文件
process_item # 方法,寫(xiě)入文件
spider_close # 方法,關(guān)閉文件
保存到文件
# choutiaa.py 爬蟲(chóng)文件
import scrapy
from chouti.items import ChoutiItem # 導入模型類(lèi)
class ChoutiaaSpider(scrapy.Spider):
name = 'choutiaa'
# allowed_domains = ['https://dig.chouti.com/'] # 允許爬取的域
start_urls = ['https://dig.chouti.com//'] # 起始爬取位置
# 解析,請求回來(lái),自動(dòng)執行parse,在這個(gè)方法中解析
def parse(self, response):
print('----------------',response)
from bs4 import BeautifulSoup
soup = BeautifulSoup(response.text,'lxml')
div_list = soup.select('.link-con .link-item')
for div in div_list:
content = div.select('.link-title')[0].text
href = div.select('.link-title')[0].attrs['href']
item = ChoutiItem() # 生成模型對象
item['content'] = content # 添加值
item['href'] = href
yield item # 必須用yield
# items.py 模型類(lèi)文件
import scrapy
class ChoutiItem(scrapy.Item):
content = scrapy.Field()
href = scrapy.Field()
# pipelines.py 數據持久化文件
class ChoutiPipeline(object):
def open_spider(self, spider):
# 一開(kāi)始就打開(kāi)文件
self.f = open('a.txt', 'w', encoding='utf-8')
def process_item(self, item, spider):
# print(item)
# 寫(xiě)入文件的操作 查看全部
文章采集api(Scrapy一個(gè)
)
內容
架構介紹
Scrapy 是一個(gè)開(kāi)源和協(xié)作框架,最初是為頁(yè)面抓?。ǜ鼫蚀_地說(shuō)是網(wǎng)頁(yè)抓?。┒O計的,它允許您以快速、簡(jiǎn)單和可擴展的方式從所需數據中提取所有信息。但目前,Scrapy 的用途非常廣泛,例如數據挖掘、監控和自動(dòng)化測試,也可以用來(lái)獲取 API(例如 Amazon Associates Web Services)或一般網(wǎng)絡(luò )爬蟲(chóng)返回的數據。
Scrapy 是基于 twisted 框架開(kāi)發(fā)的,這是一個(gè)流行的事件驅動(dòng)的 Python 網(wǎng)絡(luò )框架。所以 Scrapy 使用非阻塞(又名異步)代碼來(lái)實(shí)現并發(fā)。整體結構大致如下
IO多路復用
# 引擎(EGINE)(大總管)
引擎負責控制系統所有組件之間的數據流,并在某些動(dòng)作發(fā)生時(shí)觸發(fā)事件。有關(guān)詳細信息,請參見(jiàn)上面的數據流部分。
# 調度器(SCHEDULER)
用來(lái)接受引擎發(fā)過(guò)來(lái)的請求, 壓入隊列中, 并在引擎再次請求的時(shí)候返回. 可以想像成一個(gè)URL的優(yōu)先級隊列, 由它來(lái)決定下一個(gè)要抓取的網(wǎng)址是什么, 同時(shí)去除重復的網(wǎng)址
# 下載器(DOWLOADER)
用于下載網(wǎng)頁(yè)內容, 并將網(wǎng)頁(yè)內容返回給EGINE,下載器是建立在twisted這個(gè)高效的異步模型上的
# 爬蟲(chóng)(SPIDERS)
SPIDERS是開(kāi)發(fā)人員自定義的類(lèi),用來(lái)解析responses,并且提取items,或者發(fā)送新的請求
# 項目管道(ITEM PIPLINES)
在items被提取后負責處理它們,主要包括清理、驗證、持久化(比如存到數據庫)等操作
# 兩個(gè)中間件
-爬蟲(chóng)中間件
-下載中間件(用的最多,加頭,加代理,加cookie,集成selenium)
安裝創(chuàng )建和啟動(dòng)
# 1 框架 不是 模塊
# 2 號稱(chēng)爬蟲(chóng)界的django(你會(huì )發(fā)現,跟django很多地方一樣)
# 3 安裝
-mac,linux平臺:pip3 install scrapy
-windows平臺:pip3 install scrapy(大部分人可以)
- 如果失?。?br /> 1、pip3 install wheel #安裝后,便支持通過(guò)wheel文件安裝軟件,wheel文件官網(wǎng):https://www.lfd.uci.edu/~gohlke/pythonlibs
3、pip3 install lxml
4、pip3 install pyopenssl
5、下載并安裝pywin32:https://sourceforge.net/projec ... in32/
6、下載twisted的wheel文件:http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
7、執行pip3 install 下載目錄\Twisted-17.9.0-cp36-cp36m-win_amd64.whl
8、pip3 install scrapy
# 4 在script文件夾下會(huì )有scrapy.exe可執行文件
-創(chuàng )建scrapy項目:scrapy startproject 項目名 (django創(chuàng )建項目)
-創(chuàng )建爬蟲(chóng):scrapy genspider 爬蟲(chóng)名 要爬取的網(wǎng)站地址 # 可以創(chuàng )建多個(gè)爬蟲(chóng)
# 5 命令啟動(dòng)爬蟲(chóng)
-scrapy crawl 爬蟲(chóng)名字
-scrapy crawl 爬蟲(chóng)名字 --nolog # 沒(méi)有日志輸出啟動(dòng)
# 6 文件執行爬蟲(chóng)(推薦使用)
-在項目路徑下創(chuàng )建一個(gè)main.py,右鍵執行即可
from scrapy.cmdline import execute
# execute(['scrapy','crawl','chouti','--nolog']) # 沒(méi)有設置日志級別
execute(['scrapy','crawl','chouti']) # 設置了日志級別
配置文件目錄介紹
-crawl_chouti # 項目名
-crawl_chouti # 跟項目一個(gè)名,文件夾
-spiders # spiders:放著(zhù)爬蟲(chóng) genspider生成的爬蟲(chóng),都放在這下面
-__init__.py
-chouti.py # 抽屜爬蟲(chóng)
-cnblogs.py # cnblogs 爬蟲(chóng)
-items.py # 對比django中的models.py文件 ,寫(xiě)一個(gè)個(gè)的模型類(lèi)
-middlewares.py # 中間件(爬蟲(chóng)中間件,下載中間件),中間件寫(xiě)在這
-pipelines.py # 寫(xiě)持久化的地方(持久化到文件,mysql,redis,mongodb)
-settings.py # 配置文件
-scrapy.cfg # 不用關(guān)注,上線(xiàn)相關(guān)的
# 配置文件settings.py
ROBOTSTXT_OBEY = False # 是否遵循爬蟲(chóng)協(xié)議,強行運行
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36' # 請求頭中的ua,去瀏覽器復制,或者用ua池拿
LOG_LEVEL='ERROR' # 這樣配置,程序錯誤信息才會(huì )打印,
#啟動(dòng)爬蟲(chóng)直接 scrapy crawl 爬蟲(chóng)名 就沒(méi)有日志輸出
# scrapy crawl 爬蟲(chóng)名 --nolog # 配置了就不需要這樣啟動(dòng)了
# 爬蟲(chóng)文件
class ChoutiSpider(scrapy.Spider):
name = 'chouti' # 爬蟲(chóng)名字
allowed_domains = ['https://dig.chouti.com/'] # 允許爬取的域,想要多爬就注釋掉
start_urls = ['https://dig.chouti.com/'] # 起始爬取的位置,爬蟲(chóng)一啟動(dòng),會(huì )先向它發(fā)請求
def parse(self, response): # 解析,請求回來(lái),自動(dòng)執行parser,在這個(gè)方法中做解析
print('---------------------------',response)
抓取數據并解析
# 1 解析,可以使用bs4解析
from bs4 import BeautifulSoup
soup=BeautifulSoup(response.text,'lxml')
soup.find_all() # bs4解析
soup.select() # css解析
# 2 內置的解析器
response.css
response.xpath
# 內置解析
# 所有用css或者xpath選擇出來(lái)的都放在列表中
# 取第一個(gè):extract_first()
# 取出所有extract()
# css選擇器取文本和屬性:
# .link-title::text # 取文本,數據都在data中
# .link-title::attr(href) # 取屬性,數據都在data中
# xpath選擇器取文本和屬性
# .//a[contains(@class,"link-title")/text()]
#.//a[contains(@class,"link-title")/@href]
# 內置css選擇期,取所有
div_list = response.css('.link-con .link-item')
for div in div_list:
content = div.css('.link-title').extract()
print(content)
數據持久化
# 方式一(不推薦)
-1 parser解析函數,return 列表,列表套字典
# 命令 (支持:('json', 'jsonlines', 'jl', 'csv', 'xml', 'marshal', 'pickle')
# 數據到aa.json文件中
-2 scrapy crawl chouti -o aa.json
# 代碼:
lis = []
for div in div_list:
content = div.select('.link-title')[0].text
lis.append({'title':content})
return lis
# 方式二 pipline的方式(管道)
-1 在items.py中創(chuàng )建模型類(lèi)
-2 在爬蟲(chóng)中chouti.py,引入,把解析的數據放到item對象中(要用中括號)
-3 yield item對象
-4 配置文件配置管道
ITEM_PIPELINES = {
# 數字表示優(yōu)先級(數字越小,優(yōu)先級越大)
'crawl_chouti.pipelines.CrawlChoutiPipeline': 300,
'crawl_chouti.pipelines.CrawlChoutiRedisPipeline': 301,
}
-5 pipline.py中寫(xiě)持久化的類(lèi)
spider_open # 方法,一開(kāi)始就打開(kāi)文件
process_item # 方法,寫(xiě)入文件
spider_close # 方法,關(guān)閉文件
保存到文件
# choutiaa.py 爬蟲(chóng)文件
import scrapy
from chouti.items import ChoutiItem # 導入模型類(lèi)
class ChoutiaaSpider(scrapy.Spider):
name = 'choutiaa'
# allowed_domains = ['https://dig.chouti.com/'] # 允許爬取的域
start_urls = ['https://dig.chouti.com//'] # 起始爬取位置
# 解析,請求回來(lái),自動(dòng)執行parse,在這個(gè)方法中解析
def parse(self, response):
print('----------------',response)
from bs4 import BeautifulSoup
soup = BeautifulSoup(response.text,'lxml')
div_list = soup.select('.link-con .link-item')
for div in div_list:
content = div.select('.link-title')[0].text
href = div.select('.link-title')[0].attrs['href']
item = ChoutiItem() # 生成模型對象
item['content'] = content # 添加值
item['href'] = href
yield item # 必須用yield
# items.py 模型類(lèi)文件
import scrapy
class ChoutiItem(scrapy.Item):
content = scrapy.Field()
href = scrapy.Field()
# pipelines.py 數據持久化文件
class ChoutiPipeline(object):
def open_spider(self, spider):
# 一開(kāi)始就打開(kāi)文件
self.f = open('a.txt', 'w', encoding='utf-8')
def process_item(self, item, spider):
# print(item)
# 寫(xiě)入文件的操作
文章采集api( 爬蟲(chóng)海外網(wǎng)站獲取ip之前,請檢查是否添加白名單?)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 151 次瀏覽 ? 2022-02-21 19:03
爬蟲(chóng)海外網(wǎng)站獲取ip之前,請檢查是否添加白名單?)
海外網(wǎng)站如何使用代理IP采集?
我們在做爬蟲(chóng)的時(shí)候,經(jīng)常會(huì )遇到這種情況。爬蟲(chóng)第一次運行時(shí),可以正常獲取數據,一切看起來(lái)都是那么美好。但是過(guò)一會(huì )可能會(huì )出現403 Forbidden,然后你會(huì )打開(kāi)網(wǎng)站查看一下,你可能會(huì )看到“你的IP訪(fǎng)問(wèn)頻率太高,請稍后再試”。遇到這種情況,通常這種情況下,我們會(huì )使用代理IP隱藏自己的IP,實(shí)現大量爬取。國內代理常用的產(chǎn)品有幾十種,而我們需要在海外爬的時(shí)候網(wǎng)站這些代理都用不上,所以我們今天用的是Ipidea全球代理。
用法與國內相差不大??梢愿鶕枰x擇在指定國家或全球播放,通過(guò)api接口調用,指定提取次數,也可以指定接口返回數據格式,如txt、json、html、等等,這里以全局混合和json格式為例,獲取一個(gè)代理,一次一個(gè),python代碼如下:
import requestsurl = "http://tiqu.linksocket.com:81/ ... Bresp = requests.get(url)# 成功獲取到的數據為:{'code': 0, 'data': [{'ip': '47.74.232.57', 'port': 21861}], 'msg': '0', 'success': True}data = resp.json().get('data')[0]proxy = { "http": "http://%s:%d" % (data.get("ip"), data.get("port")), "https": "https://%s:%d" % (data.get("ip"), data.get("port"))}
在獲取IP之前,我們需要通過(guò)個(gè)人中心設置IP白名單,否則無(wú)法獲取數據。
只需填寫(xiě)你本地的公網(wǎng)并保存即可(官方界面也提供了添加或刪除白名單的界面)。如果不知道公網(wǎng)IP是什么,可以通過(guò)百度搜索IP。
爬蟲(chóng)演示如下。以下是六度新聞的示例:
import requestsurl = "http://tiqu.linksocket.com:81/ ... 3Bdef get_proxy(): """ 獲取代理 """ resp = requests.get(url) data = resp.json().get('data')[0] proxy = { "http": "http://%s:%d" % (data.get("ip"), data.get("port")), "https": "https://%s:%d" % (data.get("ip"), data.get("port")) } return proxydef download_html(url): """ 獲取url接口數據 """ resp = requests.get(url,proxies=get_proxy()) return resp.json()def run(): """ 主程序 :return: """ url = "https://6do.news/api/tag/114?page=1" content = download_html(url) # 數據處理略if __name__ == '__main__': run()
數據如圖:
前后端分離的界面對爬蟲(chóng)比較友好,提取數據也比較方便。這里不需要做太多處理,可以根據需要提取數據。
如果代理不能掛在爬蟲(chóng)中,請檢查是否添加白名單。
本次海外網(wǎng)站的采集教程到此結束,詳細交流請聯(lián)系我。
本文章僅供交流分享,【未經(jīng)許可,請拒絕轉載】 查看全部
文章采集api(
爬蟲(chóng)海外網(wǎng)站獲取ip之前,請檢查是否添加白名單?)
海外網(wǎng)站如何使用代理IP采集?
我們在做爬蟲(chóng)的時(shí)候,經(jīng)常會(huì )遇到這種情況。爬蟲(chóng)第一次運行時(shí),可以正常獲取數據,一切看起來(lái)都是那么美好。但是過(guò)一會(huì )可能會(huì )出現403 Forbidden,然后你會(huì )打開(kāi)網(wǎng)站查看一下,你可能會(huì )看到“你的IP訪(fǎng)問(wèn)頻率太高,請稍后再試”。遇到這種情況,通常這種情況下,我們會(huì )使用代理IP隱藏自己的IP,實(shí)現大量爬取。國內代理常用的產(chǎn)品有幾十種,而我們需要在海外爬的時(shí)候網(wǎng)站這些代理都用不上,所以我們今天用的是Ipidea全球代理。
用法與國內相差不大??梢愿鶕枰x擇在指定國家或全球播放,通過(guò)api接口調用,指定提取次數,也可以指定接口返回數據格式,如txt、json、html、等等,這里以全局混合和json格式為例,獲取一個(gè)代理,一次一個(gè),python代碼如下:
import requestsurl = "http://tiqu.linksocket.com:81/ ... Bresp = requests.get(url)# 成功獲取到的數據為:{'code': 0, 'data': [{'ip': '47.74.232.57', 'port': 21861}], 'msg': '0', 'success': True}data = resp.json().get('data')[0]proxy = { "http": "http://%s:%d" % (data.get("ip"), data.get("port")), "https": "https://%s:%d" % (data.get("ip"), data.get("port"))}
在獲取IP之前,我們需要通過(guò)個(gè)人中心設置IP白名單,否則無(wú)法獲取數據。

只需填寫(xiě)你本地的公網(wǎng)并保存即可(官方界面也提供了添加或刪除白名單的界面)。如果不知道公網(wǎng)IP是什么,可以通過(guò)百度搜索IP。
爬蟲(chóng)演示如下。以下是六度新聞的示例:
import requestsurl = "http://tiqu.linksocket.com:81/ ... 3Bdef get_proxy(): """ 獲取代理 """ resp = requests.get(url) data = resp.json().get('data')[0] proxy = { "http": "http://%s:%d" % (data.get("ip"), data.get("port")), "https": "https://%s:%d" % (data.get("ip"), data.get("port")) } return proxydef download_html(url): """ 獲取url接口數據 """ resp = requests.get(url,proxies=get_proxy()) return resp.json()def run(): """ 主程序 :return: """ url = "https://6do.news/api/tag/114?page=1" content = download_html(url) # 數據處理略if __name__ == '__main__': run()
數據如圖:

前后端分離的界面對爬蟲(chóng)比較友好,提取數據也比較方便。這里不需要做太多處理,可以根據需要提取數據。
如果代理不能掛在爬蟲(chóng)中,請檢查是否添加白名單。
本次海外網(wǎng)站的采集教程到此結束,詳細交流請聯(lián)系我。
本文章僅供交流分享,【未經(jīng)許可,請拒絕轉載】
文章采集api(如何通過(guò)MySQL存儲采集到的數據)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 133 次瀏覽 ? 2022-02-21 06:08
MySQL是目前最流行的開(kāi)源關(guān)系數據庫管理系統。令人驚訝的是,一個(gè)開(kāi)源項目的競爭力如此之強,以至于它的受歡迎程度不斷接近另外兩個(gè)閉源商業(yè)數據庫系統:微軟的 SQL Server 和甲骨文的甲骨文數據庫(MySQL 于 2010 年被甲骨文收購)。)。
它的受歡迎程度不辜負它的名字。對于大多數應用程序,MySQL 是顯而易見(jiàn)的選擇。它是一個(gè)非常靈活、穩定、功能齊全的 DBMS,許多頂級 網(wǎng)站 都在使用它:Youtube、Twitter、Facebook 等。
由于使用廣泛、免費、開(kāi)箱即用,是web data采集項目中常用的數據庫,在此文章我們介紹如何存儲數據采集 通過(guò) MySQL。
安裝 MySQL
如果您是 MySQL 新手,您可能會(huì )覺(jué)得它有點(diǎn)麻煩。其實(shí)安裝方法和安裝其他軟件一樣簡(jiǎn)單。歸根結底,MySQL 是由一系列數據文件組成的,存儲在你的遠程服務(wù)器或本地計算機上,其中收錄了存儲在數據庫中的所有信息。
在Windows上安裝MySQL,在Ubuntu上安裝MySQL,在MAC上安裝MySQL具體步驟在這里:在所有平臺上安裝MySQL
此處無(wú)需過(guò)多解釋?zhuān)凑找曨l操作即可。
基本命令
MySQL服務(wù)器啟動(dòng)后,與數據庫服務(wù)器交互的方式有很多種。因為許多工具都是圖形界面,所以您可以不使用 MySQL 的命令行(或很少使用)來(lái)管理數據庫。phpMyAdmin 和 MySQL Workbench 等工具可以輕松查看、排序和創(chuàng )建數據庫。但是,掌握命令行操作數據庫還是很重要的。
除了用戶(hù)定義的變量名,MySQL 不區分大小寫(xiě)。例如,SELECT 與 select 相同,但習慣上所有 MySQL 關(guān)鍵詞 的 MySQL 語(yǔ)句都以大寫(xiě)形式編寫(xiě)。大多數開(kāi)發(fā)人員還喜歡使用小寫(xiě)字母作為數據庫和數據表名稱(chēng)。
首次登錄 MySQL 數據庫時(shí),沒(méi)有數據庫來(lái)存儲數據。我們需要創(chuàng )建一個(gè)數據庫:
CREATE DATABASE scraping_article DEFAULT CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI;
因為每個(gè) MySQL 實(shí)例可以有多個(gè)數據庫,所以在使用數據庫之前需要指定數據庫名稱(chēng):
使用scraping_article
從現在開(kāi)始(直到關(guān)閉 MySQL 鏈接或切換到另一個(gè)數據庫),所有命令都在這個(gè)新的“scraping_article”數據庫中運行。
所有的操作看起來(lái)都很簡(jiǎn)單。那么在數據庫中新建表的操作方法應該也差不多吧?我們在庫中新建一個(gè)表來(lái)存儲采集的網(wǎng)頁(yè)文章的數據:
創(chuàng )建表文章;
結果顯示錯誤:
錯誤 1113 (42000): 一個(gè)表必須至少有 1 列
與數據庫不同,MySQL 數據表必須有列,否則無(wú)法創(chuàng )建。要在 MySQL 中定義字段(數據列),我們還必須將字段定義放在 CREATE TABLE 語(yǔ)句之后的帶括號的逗號分隔列表中:
create table articles
(
id int auto_increment
primary key,
title varchar(64) null,
body text null,
summary varchar(256) null,
body_html text null,
create_time datetime default CURRENT_TIMESTAMP null,
time_updated datetime null,
link_text varchar(128) null
);
每個(gè)字段定義由三部分組成:
在字段定義列表的最后,還定義了一個(gè)“主鍵”(key)。MySQL使用這個(gè)主鍵來(lái)組織表的內容,方便以后快速查詢(xún)。以后文章會(huì )介紹如何通過(guò)這些主鍵來(lái)提高數據庫的查詢(xún)速度,不過(guò)目前我們可以使用表的id列作為主鍵。
語(yǔ)句執行完畢后,我們可以使用DESCRIBE查看數據表的結構:
+--------------+--------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+-------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| title | varchar(64) | YES | | NULL | |
| body | text | YES | | NULL | |
| summary | varchar(256) | YES | | NULL | |
| body_html | text | YES | | NULL | |
| create_time | datetime | YES | | CURRENT_TIMESTAMP | |
| time_updated | datetime | YES | | NULL | |
| link_text | varchar(128) | YES | | NULL | |
+--------------+--------------+------+-----+-------------------+----------------+
8 rows in set (0.03 sec)
現在這張表是空表,我們插入數據看看,如下圖:
INSERT INTO articles(title,body,summary,body_html,link_text) VALUES ("Test page title","Test page body.","Test page summary.","<p>Test page body.","test-page");</p>
這里需要注意,雖然articles表有8個(gè)字段(id、title、body、summary、body_html、create_time、time_update、link_text),但實(shí)際上我們只插入了5個(gè)字段(title、body、summary、body_html、link_text) ) ) 數據。因為id字段是自動(dòng)遞增的(MySQL每次插入數據時(shí)默認遞增1),一般不需要處理。另外create_time字段的類(lèi)型是current_timestamp,時(shí)間戳是通過(guò)插入的默認。
當然,我們也可以自定義字段內容來(lái)插入數據:
INSERT INTO articles(id,title,body,summary,body_html,create_time,link_text) VALUES (4,"Test page title","Test page body.","Test page summary.","<p>Test page body.","2021-11-20 15:51:45","test-page");</p>
只要你定義的整數不在數據表的id字段中,就可以插入到數據表中。但是,這非常糟糕;除非絕對必要(比如程序中缺少一行數據),否則讓 MySQL 自己處理 id 和 timestamp 字段。
現在表中有一些數據,我們可以通過(guò)多種方式查詢(xún)這些數據。以下是 SELECT 語(yǔ)句的一些示例:
SELECT * FROM articles WHERE id=1;
該語(yǔ)句告訴 MySQL “從文章表中選擇 id 等于 2 的所有數據”。此星號 (*) 是通配符,表示所有字段。這行語(yǔ)句將顯示所有滿(mǎn)足條件的字段(其中 id=1))。如果沒(méi)有 id 等于 1 的行,它將返回一個(gè)空集。例如,以下不區分大小寫(xiě)的查詢(xún)將返回標題字段中收錄“test”的所有行的所有字段(% 符號表示 MySQL 字符串通配符):
SELECT * FROM articles WHERE title LIKE "%test%";
但是如果你有很多字段并且你只想返回其中的一部分呢?您可以使用以下命令代替星號:
SELECT title, body FROM articles WHERE body LIKE "%test%";
這將只返回正文內容收錄“test”的所有行的標題和正文字段。
DELETE 語(yǔ)句的語(yǔ)法類(lèi)似于 SELECT 語(yǔ)句:
DELETE FROM articles WHERE id=1;
由于數據庫的數據刪除無(wú)法恢復,建議在執行DELETE語(yǔ)句前使用SELECT確認要刪除的數據(上述刪除語(yǔ)句可以使用SELECT * FROM文章WHERE id=1;查看),以及然后將 SELECT * 替換為 DELETE 就可以了,這是一個(gè)好習慣。很多程序員都有過(guò) DELETE 誤操作的悲慘故事,也有一些恐怖的故事是有人驚慌失措的忘記在語(yǔ)句中輸入 WHERE,結果所有客戶(hù)數據都被刪除了。不要讓這種事情發(fā)生在你身上!
要介紹的另一件事是 UPDATE 語(yǔ)句:
UPDATE articles SET title="A new title", body="Some new body." WHERE id=4;
以上只使用了最基本的 MySQL 語(yǔ)句來(lái)做一些簡(jiǎn)單的數據查詢(xún)、創(chuàng )建和更新。
與 Python 集成
Python 沒(méi)有對 MySQL 的內置支持。但是,有很多開(kāi)源的可以用來(lái)和 MySQL 交互,Python 2.x 和 Python 3.x 版本都支持。最著(zhù)名的一個(gè)是 PyMySQL。
我們可以使用pip來(lái)安裝,執行如下命令:
python3 -m pip 安裝 PyMySQL
安裝完成后,我們就可以使用 PyMySQL 包了。如果您的 MySQL 服務(wù)器正在運行,您應該能夠成功執行以下命令:
import pymysql
import os
from dotenv import load_dotenv
class DataSaveToMySQL(object):
def __init__(self):
# loading env config file
dotenv_path = os.path.join(os.getcwd(), '.env')
if os.path.exists(dotenv_path):
load_dotenv(dotenv_path)
conn = pymysql.connect(host=os.environ.get('MYSQL_HOST'), port=os.environ.get('MYSQL_PORT'),
user=os.environ.get('MYSQL_USER'), password=os.environ.get('MYSQL_PASSWORD'),
db=os.environ.get('MYSQL_DATABASES'))
cur = conn.cursor()
cur.execute("SELECT * FROM articles WHERE id=4;")
print(cur.fetchone())
cur.close()
conn.close()
這個(gè)程序有兩個(gè)對象:一個(gè)連接對象(conn)和一個(gè)游標對象(cur)。
連接/游標模式是數據庫編程中常用的模式。當您不熟悉數據庫時(shí),有時(shí)很難區分這兩種模式之間的區別。連接方式除了連接數據庫外,還發(fā)送數據庫信息,處理回滾操作(當一個(gè)查詢(xún)或一組查詢(xún)中斷時(shí),數據庫需要回到初始狀態(tài),一般使用事務(wù)來(lái)實(shí)現狀態(tài)回滾),創(chuàng )建新游標等
一個(gè)連接可以有很多游標,一個(gè)游標跟蹤一種狀態(tài)信息,比如跟蹤數據庫的使用狀態(tài)。如果您有多個(gè)數據庫,并且需要寫(xiě)入所有數據庫,則需要多個(gè)游標來(lái)處理。游標還可以收錄上次查詢(xún)執行的結果。查詢(xún)結果可以通過(guò)調用cur.fetchone()等游標函數獲得。
請記住在使用完連接和游標后關(guān)閉它們。如果不關(guān)閉,會(huì )導致連接泄漏(connection leak),造成連接關(guān)閉現象,即連接不再使用,但是數據庫無(wú)法關(guān)閉,因為數據庫不確定是否你想繼續使用它。這種現象會(huì )一直消耗數據庫資源,所以使用數據庫后記得關(guān)閉連接!
剛開(kāi)始時(shí),您要做的就是將 采集 的數據保存到數據庫中。我們繼續采集blog文章的例子來(lái)演示如何實(shí)現數據存儲。
import pymysql
import os
from dotenv import load_dotenv
from config import logger_config
from utils import connection_util
class DataSaveToMySQL(object):
def __init__(self):
# loading env config file
dotenv_path = os.path.join(os.getcwd(), '.env')
if os.path.exists(dotenv_path):
load_dotenv(dotenv_path)
# MySQL config
self._host = os.environ.get('MYSQL_HOST')
self._port = int(os.environ.get('MYSQL_PORT'))
self._user = os.environ.get('MYSQL_USER')
self._password = os.environ.get('MYSQL_PASSWORD')
self._db = os.environ.get('MYSQL_DATABASES')
self._target_url = 'https://www.scrapingbee.com/blog/'
self._baseUrl = 'https://www.scrapingbee.com'
self._init_connection = connection_util.ProcessConnection()
logging_name = 'store_mysql'
init_logging = logger_config.LoggingConfig()
self._logging = init_logging.init_logging(logging_name)
def scrape_data(self):
get_content = self._init_connection.init_connection(self._target_url)
if get_content:
parent = get_content.findAll("section", {"class": "section-sm"})[0]
get_row = parent.findAll("div", {"class": "col-lg-12 mb-5 mb-lg-0"})[0]
get_child_item = get_row.findAll("div", {"class": "col-md-4 mb-4"})
for item in get_child_item:
# 獲取標題文字
get_title = item.find("a", {"class": "h5 d-block mb-3 post-title"}).get_text()
# 獲取發(fā)布時(shí)間
get_release_date = item.find("div", {"class": "mb-3 mt-2"}).findAll("span")[1].get_text()
# 獲取文章描述
get_description = item.find("p", {"class": "card-text post-description"}).get_text()
self.article_save_mysql(title=get_title, description=get_description, release_date=get_release_date)
else:
self._logging.warning('未獲取到文章任何內容,請檢查!')
def article_save_mysql(self, title, description, release_date):
connection = pymysql.connect(host=self._host, port=self._port, user=self._user, password=self._password,
db=self._db, charset='utf-8')
with connection.cursor() as cursor:
# Create a new record
sql = "INSERT INTO articles (title,summary,create_time) VALUES (%s,%s,%s);"
cursor.execute(sql, (title, description, release_date))
# connection is not autocommit by default. So you must commit to save
# your changes.
connection.commit()
這里需要注意幾點(diǎn):首先,將 charset='utf-8' 添加到連接字符串中。這是為了讓conn把所有發(fā)送到數據庫的信息都當作utf-8編碼格式(當然前提是數據庫默認編碼設置為UTF-8)。
然后需要注意article_save_mysql函數。它有3個(gè)參數:title、description和release_date,并將這兩個(gè)參數添加到INSERT語(yǔ)句中并用游標執行,然后用游標確認。這是將光標與連接分開(kāi)的一個(gè)很好的例子;當游標存儲一些數據庫和數據庫上下文信息時(shí),需要通過(guò)連接確認才能將信息傳遞到數據庫中,然后再將信息插入到數據庫中。
上述代碼沒(méi)有使用 try...finally 語(yǔ)句關(guān)閉數據庫,而是使用 with() 關(guān)閉數據庫連接。在上一期中,我們也使用了 with() 來(lái)關(guān)閉 CSV 文件。
PyMySQL的規模雖然不大,但里面有一些非常實(shí)用的功能,在本文章中就不演示了。具體請參考 Python DBAPI 標準文檔。
以上是關(guān)于將采集的內容保存到MySQL。本示例的所有代碼都托管在 github 上。
github: 查看全部
文章采集api(如何通過(guò)MySQL存儲采集到的數據)
MySQL是目前最流行的開(kāi)源關(guān)系數據庫管理系統。令人驚訝的是,一個(gè)開(kāi)源項目的競爭力如此之強,以至于它的受歡迎程度不斷接近另外兩個(gè)閉源商業(yè)數據庫系統:微軟的 SQL Server 和甲骨文的甲骨文數據庫(MySQL 于 2010 年被甲骨文收購)。)。
它的受歡迎程度不辜負它的名字。對于大多數應用程序,MySQL 是顯而易見(jiàn)的選擇。它是一個(gè)非常靈活、穩定、功能齊全的 DBMS,許多頂級 網(wǎng)站 都在使用它:Youtube、Twitter、Facebook 等。
由于使用廣泛、免費、開(kāi)箱即用,是web data采集項目中常用的數據庫,在此文章我們介紹如何存儲數據采集 通過(guò) MySQL。
安裝 MySQL
如果您是 MySQL 新手,您可能會(huì )覺(jué)得它有點(diǎn)麻煩。其實(shí)安裝方法和安裝其他軟件一樣簡(jiǎn)單。歸根結底,MySQL 是由一系列數據文件組成的,存儲在你的遠程服務(wù)器或本地計算機上,其中收錄了存儲在數據庫中的所有信息。
在Windows上安裝MySQL,在Ubuntu上安裝MySQL,在MAC上安裝MySQL具體步驟在這里:在所有平臺上安裝MySQL
此處無(wú)需過(guò)多解釋?zhuān)凑找曨l操作即可。
基本命令
MySQL服務(wù)器啟動(dòng)后,與數據庫服務(wù)器交互的方式有很多種。因為許多工具都是圖形界面,所以您可以不使用 MySQL 的命令行(或很少使用)來(lái)管理數據庫。phpMyAdmin 和 MySQL Workbench 等工具可以輕松查看、排序和創(chuàng )建數據庫。但是,掌握命令行操作數據庫還是很重要的。
除了用戶(hù)定義的變量名,MySQL 不區分大小寫(xiě)。例如,SELECT 與 select 相同,但習慣上所有 MySQL 關(guān)鍵詞 的 MySQL 語(yǔ)句都以大寫(xiě)形式編寫(xiě)。大多數開(kāi)發(fā)人員還喜歡使用小寫(xiě)字母作為數據庫和數據表名稱(chēng)。
首次登錄 MySQL 數據庫時(shí),沒(méi)有數據庫來(lái)存儲數據。我們需要創(chuàng )建一個(gè)數據庫:
CREATE DATABASE scraping_article DEFAULT CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI;
因為每個(gè) MySQL 實(shí)例可以有多個(gè)數據庫,所以在使用數據庫之前需要指定數據庫名稱(chēng):
使用scraping_article
從現在開(kāi)始(直到關(guān)閉 MySQL 鏈接或切換到另一個(gè)數據庫),所有命令都在這個(gè)新的“scraping_article”數據庫中運行。
所有的操作看起來(lái)都很簡(jiǎn)單。那么在數據庫中新建表的操作方法應該也差不多吧?我們在庫中新建一個(gè)表來(lái)存儲采集的網(wǎng)頁(yè)文章的數據:
創(chuàng )建表文章;
結果顯示錯誤:
錯誤 1113 (42000): 一個(gè)表必須至少有 1 列
與數據庫不同,MySQL 數據表必須有列,否則無(wú)法創(chuàng )建。要在 MySQL 中定義字段(數據列),我們還必須將字段定義放在 CREATE TABLE 語(yǔ)句之后的帶括號的逗號分隔列表中:
create table articles
(
id int auto_increment
primary key,
title varchar(64) null,
body text null,
summary varchar(256) null,
body_html text null,
create_time datetime default CURRENT_TIMESTAMP null,
time_updated datetime null,
link_text varchar(128) null
);
每個(gè)字段定義由三部分組成:
在字段定義列表的最后,還定義了一個(gè)“主鍵”(key)。MySQL使用這個(gè)主鍵來(lái)組織表的內容,方便以后快速查詢(xún)。以后文章會(huì )介紹如何通過(guò)這些主鍵來(lái)提高數據庫的查詢(xún)速度,不過(guò)目前我們可以使用表的id列作為主鍵。
語(yǔ)句執行完畢后,我們可以使用DESCRIBE查看數據表的結構:
+--------------+--------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+-------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| title | varchar(64) | YES | | NULL | |
| body | text | YES | | NULL | |
| summary | varchar(256) | YES | | NULL | |
| body_html | text | YES | | NULL | |
| create_time | datetime | YES | | CURRENT_TIMESTAMP | |
| time_updated | datetime | YES | | NULL | |
| link_text | varchar(128) | YES | | NULL | |
+--------------+--------------+------+-----+-------------------+----------------+
8 rows in set (0.03 sec)
現在這張表是空表,我們插入數據看看,如下圖:
INSERT INTO articles(title,body,summary,body_html,link_text) VALUES ("Test page title","Test page body.","Test page summary.","<p>Test page body.","test-page");</p>
這里需要注意,雖然articles表有8個(gè)字段(id、title、body、summary、body_html、create_time、time_update、link_text),但實(shí)際上我們只插入了5個(gè)字段(title、body、summary、body_html、link_text) ) ) 數據。因為id字段是自動(dòng)遞增的(MySQL每次插入數據時(shí)默認遞增1),一般不需要處理。另外create_time字段的類(lèi)型是current_timestamp,時(shí)間戳是通過(guò)插入的默認。
當然,我們也可以自定義字段內容來(lái)插入數據:
INSERT INTO articles(id,title,body,summary,body_html,create_time,link_text) VALUES (4,"Test page title","Test page body.","Test page summary.","<p>Test page body.","2021-11-20 15:51:45","test-page");</p>
只要你定義的整數不在數據表的id字段中,就可以插入到數據表中。但是,這非常糟糕;除非絕對必要(比如程序中缺少一行數據),否則讓 MySQL 自己處理 id 和 timestamp 字段。
現在表中有一些數據,我們可以通過(guò)多種方式查詢(xún)這些數據。以下是 SELECT 語(yǔ)句的一些示例:
SELECT * FROM articles WHERE id=1;
該語(yǔ)句告訴 MySQL “從文章表中選擇 id 等于 2 的所有數據”。此星號 (*) 是通配符,表示所有字段。這行語(yǔ)句將顯示所有滿(mǎn)足條件的字段(其中 id=1))。如果沒(méi)有 id 等于 1 的行,它將返回一個(gè)空集。例如,以下不區分大小寫(xiě)的查詢(xún)將返回標題字段中收錄“test”的所有行的所有字段(% 符號表示 MySQL 字符串通配符):
SELECT * FROM articles WHERE title LIKE "%test%";
但是如果你有很多字段并且你只想返回其中的一部分呢?您可以使用以下命令代替星號:
SELECT title, body FROM articles WHERE body LIKE "%test%";
這將只返回正文內容收錄“test”的所有行的標題和正文字段。
DELETE 語(yǔ)句的語(yǔ)法類(lèi)似于 SELECT 語(yǔ)句:
DELETE FROM articles WHERE id=1;
由于數據庫的數據刪除無(wú)法恢復,建議在執行DELETE語(yǔ)句前使用SELECT確認要刪除的數據(上述刪除語(yǔ)句可以使用SELECT * FROM文章WHERE id=1;查看),以及然后將 SELECT * 替換為 DELETE 就可以了,這是一個(gè)好習慣。很多程序員都有過(guò) DELETE 誤操作的悲慘故事,也有一些恐怖的故事是有人驚慌失措的忘記在語(yǔ)句中輸入 WHERE,結果所有客戶(hù)數據都被刪除了。不要讓這種事情發(fā)生在你身上!
要介紹的另一件事是 UPDATE 語(yǔ)句:
UPDATE articles SET title="A new title", body="Some new body." WHERE id=4;
以上只使用了最基本的 MySQL 語(yǔ)句來(lái)做一些簡(jiǎn)單的數據查詢(xún)、創(chuàng )建和更新。
與 Python 集成
Python 沒(méi)有對 MySQL 的內置支持。但是,有很多開(kāi)源的可以用來(lái)和 MySQL 交互,Python 2.x 和 Python 3.x 版本都支持。最著(zhù)名的一個(gè)是 PyMySQL。
我們可以使用pip來(lái)安裝,執行如下命令:
python3 -m pip 安裝 PyMySQL
安裝完成后,我們就可以使用 PyMySQL 包了。如果您的 MySQL 服務(wù)器正在運行,您應該能夠成功執行以下命令:
import pymysql
import os
from dotenv import load_dotenv
class DataSaveToMySQL(object):
def __init__(self):
# loading env config file
dotenv_path = os.path.join(os.getcwd(), '.env')
if os.path.exists(dotenv_path):
load_dotenv(dotenv_path)
conn = pymysql.connect(host=os.environ.get('MYSQL_HOST'), port=os.environ.get('MYSQL_PORT'),
user=os.environ.get('MYSQL_USER'), password=os.environ.get('MYSQL_PASSWORD'),
db=os.environ.get('MYSQL_DATABASES'))
cur = conn.cursor()
cur.execute("SELECT * FROM articles WHERE id=4;")
print(cur.fetchone())
cur.close()
conn.close()
這個(gè)程序有兩個(gè)對象:一個(gè)連接對象(conn)和一個(gè)游標對象(cur)。
連接/游標模式是數據庫編程中常用的模式。當您不熟悉數據庫時(shí),有時(shí)很難區分這兩種模式之間的區別。連接方式除了連接數據庫外,還發(fā)送數據庫信息,處理回滾操作(當一個(gè)查詢(xún)或一組查詢(xún)中斷時(shí),數據庫需要回到初始狀態(tài),一般使用事務(wù)來(lái)實(shí)現狀態(tài)回滾),創(chuàng )建新游標等
一個(gè)連接可以有很多游標,一個(gè)游標跟蹤一種狀態(tài)信息,比如跟蹤數據庫的使用狀態(tài)。如果您有多個(gè)數據庫,并且需要寫(xiě)入所有數據庫,則需要多個(gè)游標來(lái)處理。游標還可以收錄上次查詢(xún)執行的結果。查詢(xún)結果可以通過(guò)調用cur.fetchone()等游標函數獲得。
請記住在使用完連接和游標后關(guān)閉它們。如果不關(guān)閉,會(huì )導致連接泄漏(connection leak),造成連接關(guān)閉現象,即連接不再使用,但是數據庫無(wú)法關(guān)閉,因為數據庫不確定是否你想繼續使用它。這種現象會(huì )一直消耗數據庫資源,所以使用數據庫后記得關(guān)閉連接!
剛開(kāi)始時(shí),您要做的就是將 采集 的數據保存到數據庫中。我們繼續采集blog文章的例子來(lái)演示如何實(shí)現數據存儲。
import pymysql
import os
from dotenv import load_dotenv
from config import logger_config
from utils import connection_util
class DataSaveToMySQL(object):
def __init__(self):
# loading env config file
dotenv_path = os.path.join(os.getcwd(), '.env')
if os.path.exists(dotenv_path):
load_dotenv(dotenv_path)
# MySQL config
self._host = os.environ.get('MYSQL_HOST')
self._port = int(os.environ.get('MYSQL_PORT'))
self._user = os.environ.get('MYSQL_USER')
self._password = os.environ.get('MYSQL_PASSWORD')
self._db = os.environ.get('MYSQL_DATABASES')
self._target_url = 'https://www.scrapingbee.com/blog/'
self._baseUrl = 'https://www.scrapingbee.com'
self._init_connection = connection_util.ProcessConnection()
logging_name = 'store_mysql'
init_logging = logger_config.LoggingConfig()
self._logging = init_logging.init_logging(logging_name)
def scrape_data(self):
get_content = self._init_connection.init_connection(self._target_url)
if get_content:
parent = get_content.findAll("section", {"class": "section-sm"})[0]
get_row = parent.findAll("div", {"class": "col-lg-12 mb-5 mb-lg-0"})[0]
get_child_item = get_row.findAll("div", {"class": "col-md-4 mb-4"})
for item in get_child_item:
# 獲取標題文字
get_title = item.find("a", {"class": "h5 d-block mb-3 post-title"}).get_text()
# 獲取發(fā)布時(shí)間
get_release_date = item.find("div", {"class": "mb-3 mt-2"}).findAll("span")[1].get_text()
# 獲取文章描述
get_description = item.find("p", {"class": "card-text post-description"}).get_text()
self.article_save_mysql(title=get_title, description=get_description, release_date=get_release_date)
else:
self._logging.warning('未獲取到文章任何內容,請檢查!')
def article_save_mysql(self, title, description, release_date):
connection = pymysql.connect(host=self._host, port=self._port, user=self._user, password=self._password,
db=self._db, charset='utf-8')
with connection.cursor() as cursor:
# Create a new record
sql = "INSERT INTO articles (title,summary,create_time) VALUES (%s,%s,%s);"
cursor.execute(sql, (title, description, release_date))
# connection is not autocommit by default. So you must commit to save
# your changes.
connection.commit()
這里需要注意幾點(diǎn):首先,將 charset='utf-8' 添加到連接字符串中。這是為了讓conn把所有發(fā)送到數據庫的信息都當作utf-8編碼格式(當然前提是數據庫默認編碼設置為UTF-8)。
然后需要注意article_save_mysql函數。它有3個(gè)參數:title、description和release_date,并將這兩個(gè)參數添加到INSERT語(yǔ)句中并用游標執行,然后用游標確認。這是將光標與連接分開(kāi)的一個(gè)很好的例子;當游標存儲一些數據庫和數據庫上下文信息時(shí),需要通過(guò)連接確認才能將信息傳遞到數據庫中,然后再將信息插入到數據庫中。
上述代碼沒(méi)有使用 try...finally 語(yǔ)句關(guān)閉數據庫,而是使用 with() 關(guān)閉數據庫連接。在上一期中,我們也使用了 with() 來(lái)關(guān)閉 CSV 文件。
PyMySQL的規模雖然不大,但里面有一些非常實(shí)用的功能,在本文章中就不演示了。具體請參考 Python DBAPI 標準文檔。
以上是關(guān)于將采集的內容保存到MySQL。本示例的所有代碼都托管在 github 上。
github:
文章采集api(【干貨】Kubernetes日志采集難點(diǎn)分析(一)——Kubernetes)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 119 次瀏覽 ? 2022-02-21 06:02
前言
上一期主要介紹了Kubernetes日志輸出的一些注意事項。日志輸出的最終目的是做統一的采集和分析。在 Kubernetes 中,記錄采集的方式與普通虛擬機有很大不同,相對實(shí)現難度和部署成本也略高。但是,如果使用得當,可以實(shí)現比傳統方式更高的自動(dòng)化程度和更低的運維成本。
Kubernetes 日志采集 難點(diǎn)
在 Kubernetes 中,log采集 比傳統的虛擬機和物理機要復雜得多。最根本的原因是Kubernetes屏蔽了底層異常,提供了更細粒度的資源調度,向上提供了一個(gè)穩定動(dòng)態(tài)的環(huán)境。因此,日志采集面臨著(zhù)更豐富、更動(dòng)態(tài)的環(huán)境,需要考慮的點(diǎn)也更多。
例如:
對于一個(gè)運行時(shí)間很短的Job應用,從啟動(dòng)到停止只需要幾秒,如何保證日志采集的實(shí)時(shí)性能跟得上,數據不丟失?K8s 一般推薦使用大型節點(diǎn)。每個(gè)節點(diǎn)可以運行 10-100+ 個(gè)容器。如何以盡可能低的資源消耗采集100+ 個(gè)容器?在K8s中,應用以yaml的形式部署,日志采集主要是手動(dòng)配置文件的形式。日志采集如何以K8s的方式部署?
Kubernetes傳統日志類(lèi)型文件、stdout、host文件、journal文件、journal日志源業(yè)務(wù)容器、系統組件、宿主業(yè)務(wù)、宿主采集方法代理(Sidecar、DaemonSet)、直寫(xiě)(DockerEngine、業(yè)務(wù))代理、直接-write 單機應用號 10-1001-10 應用動(dòng)態(tài)高低 節點(diǎn)動(dòng)態(tài)高低 采集 部署方式手動(dòng)、Yaml手動(dòng)、自定義
采集模式:主動(dòng)或被動(dòng)
日志采集方法有兩種:被動(dòng)采集和主動(dòng)推送。在K8s中,被動(dòng)采集一般分為Sidecar和DaemonSet兩種方式。主動(dòng)推送包括 DockerEngine 推送和業(yè)務(wù)直推。寫(xiě)兩種方式。
總結:DockerEngine直接寫(xiě)一般不推薦;日志量大的場(chǎng)景推薦業(yè)務(wù)直寫(xiě);DaemonSet 一般用于中小型集群;建議在非常大的集群中使用 Sidecar。各種采集方法的詳細對比如下:
DockerEngine業(yè)務(wù)直接寫(xiě)入DaemonSet方法Sidecar方法采集日志類(lèi)型標準輸出業(yè)務(wù)日志標準輸出+部分文件文件部署運維低,原生支持低,只需要維護配置文件正常,需要為了維護 DaemonSet 高,每個(gè)需要 采集 日志的 POD 都需要部署一個(gè) sidecar 容器。日志分類(lèi)和存儲無(wú)法實(shí)現業(yè)務(wù)無(wú)關(guān)的配置。一般來(lái)說(shuō),每個(gè)POD都可以通過(guò)容器/路徑映射來(lái)單獨配置,靈活性高,多租戶(hù)隔離性較弱。日志直寫(xiě)一般會(huì )和業(yè)務(wù)邏輯競爭資源。只能通過(guò)強配置隔離,通過(guò)容器隔離,資源可獨立分配,支持集群規模無(wú)限本地存儲。如果使用 syslog 和 fluentd,根據配置會(huì )有單點(diǎn)限制和無(wú)限制。無(wú)限資源數量低,dockerengine提供整體最低,節省采集的成本,每個(gè)節點(diǎn)運行一個(gè)容器高,每個(gè)POD運行一個(gè)容器,查詢(xún)便利性低,只有g(shù)rep raw日志高,可根據業(yè)務(wù)特點(diǎn)定制高,可定制查詢(xún),高統計,可根據業(yè)務(wù)特點(diǎn)定制低高可定制性,可自由擴展低高,每個(gè)POD單獨配置高耦合,并且強綁定 DockerEngine 固定,修改需要重啟 DockerEngine 高,<
日志輸出:標準輸出或文件
與虛擬機/物理機不同,K8s 容器提供標準輸出和文件。在容器中,標準輸出直接將日志輸出到stdout或stderr,DockerEngine接管stdout和stderr文件描述符,收到日志后根據DockerEngine配置的LogDriver規則進(jìn)行處理;日志打印到文件的方式與虛擬機/物理機不同?;绢?lèi)似,只是日志可以使用不同的存儲方式,比如默認存儲、EmptyDir、HostVolume、NFS等。
雖然 Docker 官方推薦使用 Stdout 打印日志,但需要注意的是,這個(gè)推薦是基于容器僅作為簡(jiǎn)單應用使用的場(chǎng)景。在實(shí)際業(yè)務(wù)場(chǎng)景中,我們還是建議大家盡量使用文件方式。主要原因如下。觀(guān)點(diǎn):
stdout性能問(wèn)題,從應用輸出stdout到服務(wù)器,會(huì )有幾個(gè)過(guò)程(比如常用的JSON LogDriver):應用stdout -> DockerEngine -> LogDriver -> 序列化成JSON -> 保存到文件 -> Agent< @采集文件 -> 解析 JSON -> 上傳服務(wù)器。整個(gè)過(guò)程需要比文件更多的開(kāi)銷(xiāo)。壓力測試時(shí),每秒輸出 10 萬(wàn)行日志會(huì )占用 DockerEngine 的額外 CPU 內核。stdout 不支持分類(lèi),即所有輸出混合在一個(gè)流中,不能像文件一樣分類(lèi)輸出。通常,一個(gè)應用程序包括AccessLog、ErrorLog、InterfaceLog(調用外部接口的日志)、TraceLog等。這些日志的格式和用途不,會(huì )很難采集 如果在同一流中混合,則進(jìn)行分析。stdout 只支持容器主程序的輸出。如果是 daemon/fork 模式下運行的程序,則無(wú)法使用 stdout。文件轉儲方式支持多種策略,如同步/異步寫(xiě)入、緩存大小、文件輪換策略、壓縮策略、清除策略等,相對更加靈活。
因此,我們建議在線(xiàn)應用使用文件輸出日志,而Stdout僅用于功能單一或部分K8s系統/運維組件的應用。
CICD 集成:日志記錄操作員
Kubernetes提供了標準化的業(yè)務(wù)部署方式,可以通過(guò)yaml(K8s API)聲明路由規則、暴露服務(wù)、掛載存儲、運行業(yè)務(wù)、定義伸縮規則等,因此Kubernetes很容易與CICD系統集成。日志采集也是運維監控過(guò)程的重要組成部分。必須實(shí)時(shí)采集業(yè)務(wù)上線(xiàn)后的所有日志。
原來(lái)的方法是在發(fā)布后手動(dòng)部署log采集的邏輯。這種方式需要人工干預,違背了CICD自動(dòng)化的目的;為了實(shí)現自動(dòng)化,已經(jīng)有人開(kāi)始基于日志包裝API/SDK采集一個(gè)自動(dòng)部署的服務(wù),發(fā)布后通過(guò)CICD的webhook觸發(fā)調用,但是這種方式開(kāi)發(fā)成本高。
在 Kubernetes 中,集成日志最標準的方式是在 Kubernetes 系統中注冊一個(gè)新資源,并以 Operator(CRD)的形式對其進(jìn)行管理和維護。這樣CICD系統就不需要額外開(kāi)發(fā),部署到Kubernetes系統時(shí)只需要附加日志相關(guān)的配置即可。
Kubernetes 日志采集 方案
早在 Kubernetes 出現之前,我們就開(kāi)始為容器環(huán)境開(kāi)發(fā) log采集 解決方案。隨著(zhù)K8s的逐漸穩定,我們開(kāi)始將很多業(yè)務(wù)遷移到K8s平臺上,所以我們也在之前的基礎上開(kāi)發(fā)了一套。K8s 上的 log采集 方案。主要功能有:
支持各種數據的實(shí)時(shí)采集,包括容器文件、容器Stdout、宿主文件、Journal、Event等;支持多種采集部署方式,包括DaemonSet、Sidecar、DockerEngine LogDriver等;日志數據豐富,包括Namespace、Pod、Container、Image、Node等附加信息;穩定高可靠,基于阿里巴巴自研Logtail采集Agent實(shí)現。目前,全網(wǎng)部署實(shí)例數以百萬(wàn)計。; 基于CRD擴展,日志采集規則可以以Kubernetes部署發(fā)布的方式部署,與CICD完美集成。
安裝日志采集組件
目前,這個(gè)采集解決方案已經(jīng)對外開(kāi)放。我們提供 Helm 安裝包,收錄 Logtail 的 DaemonSet、AliyunlogConfig 的 CRD 聲明和 CRD Controller。安裝后直接使用DaemonS優(yōu)采云采集器即可,CRD配置完畢。安裝方法如下:
阿里云Kubernetes集群在激活的時(shí)候就可以安裝,這樣在創(chuàng )建集群的時(shí)候會(huì )自動(dòng)安裝以上的組件。如果激活的時(shí)候沒(méi)有安裝,可以手動(dòng)安裝。如果是自建Kubernetes,無(wú)論是自建在阿里云上還是在其他云上還是離線(xiàn),都可以使用這個(gè)采集方案。具體安裝方法請參考【自建Kubernetes安裝】()。
上述組件安裝完成后,Logtail和對應的Controller會(huì )在集群中運行,但默認這些組件不會(huì )采集任何日志,需要配置日志采集規則為采集@ > 指定各種日志的Pod。
采集規則配置:環(huán)境變量或CRD
除了在日志服務(wù)控制臺手動(dòng)配置外,Kubernetes 還支持另外兩種配置方式:環(huán)境變量和 CRD。
環(huán)境變量是自swarm時(shí)代以來(lái)一直使用的配置方式。你只需要在你想要采集的容器環(huán)境變量上聲明需要采集的數據地址,Logtail會(huì )自動(dòng)采集這個(gè)數據>到服務(wù)器。該方法部署簡(jiǎn)單,學(xué)習成本低,易于使用;但是可以支持的配置規則很少,很多高級配置(如解析方式、過(guò)濾方式、黑白名單等)都不支持,而且這種聲明方式也不支持修改/刪除,每個(gè)修改實(shí)際上創(chuàng )建了一個(gè)新的 采集 配置。歷史采集配置需要手動(dòng)清理,否則會(huì )造成資源浪費。
CRD的配置方式非常符合Kubernetes官方推薦的標準擴展方式,允許采集配置以K8s資源的形式進(jìn)行管理,通過(guò)部署特殊的CRD資源AliyunLogConfig到Kubernetes來(lái)聲明數據這需要 采集。例如,下面的例子是部署一個(gè)容器的標準輸出采集,其中定義需要Stdout和Stderr 采集,并且排除環(huán)境變量收錄COLLEXT_STDOUT_FLAG: false的容器?;贑RD的配置方式以Kubernetes標準擴展資源的方式進(jìn)行管理,支持配置的完整語(yǔ)義的增刪改查,支持各種高級配置。
采集推薦的規則配置方式
在實(shí)際應用場(chǎng)景中,一般使用 DaemonSet 或者 DaemonSet 和 Sidecar 的混合。DaemonSet 的優(yōu)點(diǎn)是資源利用率高。但是存在一個(gè)問(wèn)題,DaemonSet的所有Logtail共享全局配置,單個(gè)Logtail有配置支持上限。因此,它無(wú)法支持具有大量應用程序的集群。以上是我們給出的推薦配置方式。核心思想是:
一個(gè)盡可能多的采集相似數據的配置,減少了配置的數量,減輕了DaemonSet的壓力;核心應用 采集 需要獲得足夠的資源,并且可以使用 Sidecar 方法;配置方式盡量使用CRD方式;Sidecar 由于每個(gè)Logtail都是獨立配置的,所以配置數量沒(méi)有限制,適用于非常大的集群。
練習 1 - 中小型集群
大多數 Kubernetes 集群都是中小型的。中小企業(yè)沒(méi)有明確的定義。一般應用數量小于500,節點(diǎn)規模小于1000。沒(méi)有功能清晰的Kubernetes平臺運維。這個(gè)場(chǎng)景的應用數量不是特別多,DaemonSet可以支持所有的采集配置:
大部分業(yè)務(wù)應用的數據使用DaemonS優(yōu)采云采集器方式,核心應用(對于可靠性要求較高的采集,如訂單/交易系統)單獨使用Sidecar方式采集 @>
練習 2 - 大型集群
對于一些用作PAAS平臺的大型/超大型集群,一般業(yè)務(wù)在1000以上,節點(diǎn)規模也在1000以上。有專(zhuān)門(mén)的Kubernetes平臺運維人員。這種場(chǎng)景下應用的數量沒(méi)有限制,DaemonSet 無(wú)法支持。因此,必須使用 Sidecar 方法??傮w規劃如下:
Kubernetes平臺的系統組件日志和內核日志的類(lèi)型是比較固定的。這部分日志使用了DaemonS優(yōu)采云采集器,主要為平臺的運維人員提供服務(wù);每個(gè)業(yè)務(wù)的日志使用Sidecar方式采集,每個(gè)業(yè)務(wù)可以獨立設置Sidecar的采集目的地址,為業(yè)務(wù)的DevOps人員提供了足夠的靈活性。 查看全部
文章采集api(【干貨】Kubernetes日志采集難點(diǎn)分析(一)——Kubernetes)
前言
上一期主要介紹了Kubernetes日志輸出的一些注意事項。日志輸出的最終目的是做統一的采集和分析。在 Kubernetes 中,記錄采集的方式與普通虛擬機有很大不同,相對實(shí)現難度和部署成本也略高。但是,如果使用得當,可以實(shí)現比傳統方式更高的自動(dòng)化程度和更低的運維成本。
Kubernetes 日志采集 難點(diǎn)
在 Kubernetes 中,log采集 比傳統的虛擬機和物理機要復雜得多。最根本的原因是Kubernetes屏蔽了底層異常,提供了更細粒度的資源調度,向上提供了一個(gè)穩定動(dòng)態(tài)的環(huán)境。因此,日志采集面臨著(zhù)更豐富、更動(dòng)態(tài)的環(huán)境,需要考慮的點(diǎn)也更多。
例如:
對于一個(gè)運行時(shí)間很短的Job應用,從啟動(dòng)到停止只需要幾秒,如何保證日志采集的實(shí)時(shí)性能跟得上,數據不丟失?K8s 一般推薦使用大型節點(diǎn)。每個(gè)節點(diǎn)可以運行 10-100+ 個(gè)容器。如何以盡可能低的資源消耗采集100+ 個(gè)容器?在K8s中,應用以yaml的形式部署,日志采集主要是手動(dòng)配置文件的形式。日志采集如何以K8s的方式部署?
Kubernetes傳統日志類(lèi)型文件、stdout、host文件、journal文件、journal日志源業(yè)務(wù)容器、系統組件、宿主業(yè)務(wù)、宿主采集方法代理(Sidecar、DaemonSet)、直寫(xiě)(DockerEngine、業(yè)務(wù))代理、直接-write 單機應用號 10-1001-10 應用動(dòng)態(tài)高低 節點(diǎn)動(dòng)態(tài)高低 采集 部署方式手動(dòng)、Yaml手動(dòng)、自定義
采集模式:主動(dòng)或被動(dòng)
日志采集方法有兩種:被動(dòng)采集和主動(dòng)推送。在K8s中,被動(dòng)采集一般分為Sidecar和DaemonSet兩種方式。主動(dòng)推送包括 DockerEngine 推送和業(yè)務(wù)直推。寫(xiě)兩種方式。
總結:DockerEngine直接寫(xiě)一般不推薦;日志量大的場(chǎng)景推薦業(yè)務(wù)直寫(xiě);DaemonSet 一般用于中小型集群;建議在非常大的集群中使用 Sidecar。各種采集方法的詳細對比如下:
DockerEngine業(yè)務(wù)直接寫(xiě)入DaemonSet方法Sidecar方法采集日志類(lèi)型標準輸出業(yè)務(wù)日志標準輸出+部分文件文件部署運維低,原生支持低,只需要維護配置文件正常,需要為了維護 DaemonSet 高,每個(gè)需要 采集 日志的 POD 都需要部署一個(gè) sidecar 容器。日志分類(lèi)和存儲無(wú)法實(shí)現業(yè)務(wù)無(wú)關(guān)的配置。一般來(lái)說(shuō),每個(gè)POD都可以通過(guò)容器/路徑映射來(lái)單獨配置,靈活性高,多租戶(hù)隔離性較弱。日志直寫(xiě)一般會(huì )和業(yè)務(wù)邏輯競爭資源。只能通過(guò)強配置隔離,通過(guò)容器隔離,資源可獨立分配,支持集群規模無(wú)限本地存儲。如果使用 syslog 和 fluentd,根據配置會(huì )有單點(diǎn)限制和無(wú)限制。無(wú)限資源數量低,dockerengine提供整體最低,節省采集的成本,每個(gè)節點(diǎn)運行一個(gè)容器高,每個(gè)POD運行一個(gè)容器,查詢(xún)便利性低,只有g(shù)rep raw日志高,可根據業(yè)務(wù)特點(diǎn)定制高,可定制查詢(xún),高統計,可根據業(yè)務(wù)特點(diǎn)定制低高可定制性,可自由擴展低高,每個(gè)POD單獨配置高耦合,并且強綁定 DockerEngine 固定,修改需要重啟 DockerEngine 高,<
日志輸出:標準輸出或文件
與虛擬機/物理機不同,K8s 容器提供標準輸出和文件。在容器中,標準輸出直接將日志輸出到stdout或stderr,DockerEngine接管stdout和stderr文件描述符,收到日志后根據DockerEngine配置的LogDriver規則進(jìn)行處理;日志打印到文件的方式與虛擬機/物理機不同?;绢?lèi)似,只是日志可以使用不同的存儲方式,比如默認存儲、EmptyDir、HostVolume、NFS等。
雖然 Docker 官方推薦使用 Stdout 打印日志,但需要注意的是,這個(gè)推薦是基于容器僅作為簡(jiǎn)單應用使用的場(chǎng)景。在實(shí)際業(yè)務(wù)場(chǎng)景中,我們還是建議大家盡量使用文件方式。主要原因如下。觀(guān)點(diǎn):
stdout性能問(wèn)題,從應用輸出stdout到服務(wù)器,會(huì )有幾個(gè)過(guò)程(比如常用的JSON LogDriver):應用stdout -> DockerEngine -> LogDriver -> 序列化成JSON -> 保存到文件 -> Agent< @采集文件 -> 解析 JSON -> 上傳服務(wù)器。整個(gè)過(guò)程需要比文件更多的開(kāi)銷(xiāo)。壓力測試時(shí),每秒輸出 10 萬(wàn)行日志會(huì )占用 DockerEngine 的額外 CPU 內核。stdout 不支持分類(lèi),即所有輸出混合在一個(gè)流中,不能像文件一樣分類(lèi)輸出。通常,一個(gè)應用程序包括AccessLog、ErrorLog、InterfaceLog(調用外部接口的日志)、TraceLog等。這些日志的格式和用途不,會(huì )很難采集 如果在同一流中混合,則進(jìn)行分析。stdout 只支持容器主程序的輸出。如果是 daemon/fork 模式下運行的程序,則無(wú)法使用 stdout。文件轉儲方式支持多種策略,如同步/異步寫(xiě)入、緩存大小、文件輪換策略、壓縮策略、清除策略等,相對更加靈活。
因此,我們建議在線(xiàn)應用使用文件輸出日志,而Stdout僅用于功能單一或部分K8s系統/運維組件的應用。
CICD 集成:日志記錄操作員
Kubernetes提供了標準化的業(yè)務(wù)部署方式,可以通過(guò)yaml(K8s API)聲明路由規則、暴露服務(wù)、掛載存儲、運行業(yè)務(wù)、定義伸縮規則等,因此Kubernetes很容易與CICD系統集成。日志采集也是運維監控過(guò)程的重要組成部分。必須實(shí)時(shí)采集業(yè)務(wù)上線(xiàn)后的所有日志。
原來(lái)的方法是在發(fā)布后手動(dòng)部署log采集的邏輯。這種方式需要人工干預,違背了CICD自動(dòng)化的目的;為了實(shí)現自動(dòng)化,已經(jīng)有人開(kāi)始基于日志包裝API/SDK采集一個(gè)自動(dòng)部署的服務(wù),發(fā)布后通過(guò)CICD的webhook觸發(fā)調用,但是這種方式開(kāi)發(fā)成本高。
在 Kubernetes 中,集成日志最標準的方式是在 Kubernetes 系統中注冊一個(gè)新資源,并以 Operator(CRD)的形式對其進(jìn)行管理和維護。這樣CICD系統就不需要額外開(kāi)發(fā),部署到Kubernetes系統時(shí)只需要附加日志相關(guān)的配置即可。
Kubernetes 日志采集 方案
早在 Kubernetes 出現之前,我們就開(kāi)始為容器環(huán)境開(kāi)發(fā) log采集 解決方案。隨著(zhù)K8s的逐漸穩定,我們開(kāi)始將很多業(yè)務(wù)遷移到K8s平臺上,所以我們也在之前的基礎上開(kāi)發(fā)了一套。K8s 上的 log采集 方案。主要功能有:
支持各種數據的實(shí)時(shí)采集,包括容器文件、容器Stdout、宿主文件、Journal、Event等;支持多種采集部署方式,包括DaemonSet、Sidecar、DockerEngine LogDriver等;日志數據豐富,包括Namespace、Pod、Container、Image、Node等附加信息;穩定高可靠,基于阿里巴巴自研Logtail采集Agent實(shí)現。目前,全網(wǎng)部署實(shí)例數以百萬(wàn)計。; 基于CRD擴展,日志采集規則可以以Kubernetes部署發(fā)布的方式部署,與CICD完美集成。
安裝日志采集組件
目前,這個(gè)采集解決方案已經(jīng)對外開(kāi)放。我們提供 Helm 安裝包,收錄 Logtail 的 DaemonSet、AliyunlogConfig 的 CRD 聲明和 CRD Controller。安裝后直接使用DaemonS優(yōu)采云采集器即可,CRD配置完畢。安裝方法如下:
阿里云Kubernetes集群在激活的時(shí)候就可以安裝,這樣在創(chuàng )建集群的時(shí)候會(huì )自動(dòng)安裝以上的組件。如果激活的時(shí)候沒(méi)有安裝,可以手動(dòng)安裝。如果是自建Kubernetes,無(wú)論是自建在阿里云上還是在其他云上還是離線(xiàn),都可以使用這個(gè)采集方案。具體安裝方法請參考【自建Kubernetes安裝】()。
上述組件安裝完成后,Logtail和對應的Controller會(huì )在集群中運行,但默認這些組件不會(huì )采集任何日志,需要配置日志采集規則為采集@ > 指定各種日志的Pod。
采集規則配置:環(huán)境變量或CRD
除了在日志服務(wù)控制臺手動(dòng)配置外,Kubernetes 還支持另外兩種配置方式:環(huán)境變量和 CRD。
環(huán)境變量是自swarm時(shí)代以來(lái)一直使用的配置方式。你只需要在你想要采集的容器環(huán)境變量上聲明需要采集的數據地址,Logtail會(huì )自動(dòng)采集這個(gè)數據>到服務(wù)器。該方法部署簡(jiǎn)單,學(xué)習成本低,易于使用;但是可以支持的配置規則很少,很多高級配置(如解析方式、過(guò)濾方式、黑白名單等)都不支持,而且這種聲明方式也不支持修改/刪除,每個(gè)修改實(shí)際上創(chuàng )建了一個(gè)新的 采集 配置。歷史采集配置需要手動(dòng)清理,否則會(huì )造成資源浪費。
CRD的配置方式非常符合Kubernetes官方推薦的標準擴展方式,允許采集配置以K8s資源的形式進(jìn)行管理,通過(guò)部署特殊的CRD資源AliyunLogConfig到Kubernetes來(lái)聲明數據這需要 采集。例如,下面的例子是部署一個(gè)容器的標準輸出采集,其中定義需要Stdout和Stderr 采集,并且排除環(huán)境變量收錄COLLEXT_STDOUT_FLAG: false的容器?;贑RD的配置方式以Kubernetes標準擴展資源的方式進(jìn)行管理,支持配置的完整語(yǔ)義的增刪改查,支持各種高級配置。
采集推薦的規則配置方式
在實(shí)際應用場(chǎng)景中,一般使用 DaemonSet 或者 DaemonSet 和 Sidecar 的混合。DaemonSet 的優(yōu)點(diǎn)是資源利用率高。但是存在一個(gè)問(wèn)題,DaemonSet的所有Logtail共享全局配置,單個(gè)Logtail有配置支持上限。因此,它無(wú)法支持具有大量應用程序的集群。以上是我們給出的推薦配置方式。核心思想是:
一個(gè)盡可能多的采集相似數據的配置,減少了配置的數量,減輕了DaemonSet的壓力;核心應用 采集 需要獲得足夠的資源,并且可以使用 Sidecar 方法;配置方式盡量使用CRD方式;Sidecar 由于每個(gè)Logtail都是獨立配置的,所以配置數量沒(méi)有限制,適用于非常大的集群。
練習 1 - 中小型集群
大多數 Kubernetes 集群都是中小型的。中小企業(yè)沒(méi)有明確的定義。一般應用數量小于500,節點(diǎn)規模小于1000。沒(méi)有功能清晰的Kubernetes平臺運維。這個(gè)場(chǎng)景的應用數量不是特別多,DaemonSet可以支持所有的采集配置:
大部分業(yè)務(wù)應用的數據使用DaemonS優(yōu)采云采集器方式,核心應用(對于可靠性要求較高的采集,如訂單/交易系統)單獨使用Sidecar方式采集 @>
練習 2 - 大型集群
對于一些用作PAAS平臺的大型/超大型集群,一般業(yè)務(wù)在1000以上,節點(diǎn)規模也在1000以上。有專(zhuān)門(mén)的Kubernetes平臺運維人員。這種場(chǎng)景下應用的數量沒(méi)有限制,DaemonSet 無(wú)法支持。因此,必須使用 Sidecar 方法??傮w規劃如下:
Kubernetes平臺的系統組件日志和內核日志的類(lèi)型是比較固定的。這部分日志使用了DaemonS優(yōu)采云采集器,主要為平臺的運維人員提供服務(wù);每個(gè)業(yè)務(wù)的日志使用Sidecar方式采集,每個(gè)業(yè)務(wù)可以獨立設置Sidecar的采集目的地址,為業(yè)務(wù)的DevOps人員提供了足夠的靈活性。
文章采集api(來(lái)說(shuō)獲得用戶(hù)專(zhuān)欄文章的鏈接信息,此乃神器!)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 147 次瀏覽 ? 2022-02-17 05:24
目前還沒(méi)有官方API支持?;蛟S最有用的就是用戶(hù)的“個(gè)性化URL”(好別扭,以下簡(jiǎn)稱(chēng)UID),比如黃繼新老師的UID:jixin,不過(guò)可以用戶(hù)自己修改,但是每個(gè)用戶(hù)都必須是獨特的。
將對應的 UID 替換為 {{%UID}}。
1. 獲取用戶(hù)列條目:
URI: http://www.zhihu.com/people/{{%UID}}/posts GET/HTTP 1.1
XPATH: //div[@id='zh-profile-list-container']
通過(guò)解析上述內容,可以得到用戶(hù)的所有列入口地址。
2. 獲取列 文章 信息:
URI: http://zhuanlan.zhihu.com/api/columns/{{%UID}}/posts?limit={{%LIMIT}}&offset={{%OFFSET}} GET/HTTP 1.1
{{%LIMIT}}:表示本次GET請求獲取的數據項個(gè)數,即文章列信息的個(gè)數。我沒(méi)有具體測試過(guò)最大值是多少,但是可以設置大于默認值。默認值為 10。
{{%OFFSET}}:表示本次GET請求獲取的數據項的起始偏移量。
通過(guò)分析以上內容,可以得到每一列文章的信息,如標題、題圖、列文章摘要、發(fā)布時(shí)間、批準數等。請求返回JSON數據。
注意:解析該信息時(shí),可以得到該列文章的鏈接信息。
3. 獲取列 文章:
URI: http://zhuanlan.zhihu.com/api/columns/{{%UID}}/posts/{{%SLUG}} GET/HTTP 1.1
{{%SLUG}}:是2中得到的文章鏈接信息,目前是8位數字。
通過(guò)分析以上內容,可以得到文章欄的內容,以及文章的一些相關(guān)信息。請求返回 JSON 數據。
以上應該足以滿(mǎn)足題主的要求。最重要的是用好Chrome調試工具,這是神器!
* * * * * * * * * *
這里有一些零散的更新來(lái)記錄 知乎 爬蟲(chóng)的想法。當然,相關(guān)實(shí)現還是需要尊重ROBOTS協(xié)議,可以通過(guò)
/機器人.txt
檢查相關(guān)參數。
UID是用戶(hù)所有信息的入口。
雖然用戶(hù)信息有修改間隔限制(一般為幾個(gè)月不等),但考慮到即使是修改用戶(hù)名的操作也會(huì )導致UID發(fā)生變化,從而使之前的存儲失效。當然,這也可以破解:用戶(hù)哈希。這個(gè)哈希值是一個(gè) 32 位的字符串,對于每個(gè)賬戶(hù)來(lái)說(shuō)都是唯一且不變的。
通過(guò) UID 獲取哈希:
URI: http://www.zhihu.com/people/%{{UID}} GET/HTTP 1.1
XPATH: //body/div[@class='zg-wrap zu-main']//div[@class='zm-profile-header-op-btns clearfix']/button/@data-id
通過(guò)解析上面的內容,可以得到UID對應的hash值。(是的,該值存儲在“關(guān)注/取消關(guān)注”按鈕中。)這唯一地標識了用戶(hù)。
目前沒(méi)有辦法通過(guò)hash_id獲取UID,但是有間接方法可以參考:定期通過(guò)關(guān)注列表查看用戶(hù)信息是否發(fā)生變化,當然關(guān)注/取消關(guān)注操作也可以自動(dòng)化:
關(guān)注操作
URI: http://www.zhihu.com/node/MemberFollowBaseV2 POST/HTTP 1.1
Form Data
method: follow_member
params: {"hash_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}
_xsrf:
取消關(guān)注操作
URI: http://www.zhihu.com/node/MemberFollowBaseV2 POST/HTTP 1.1
Form Data
method: unfollow_member
params: {"hash_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}
_xsrf:
知乎爬蟲(chóng)需要一個(gè)UID列表才能正常運行,如何獲取這個(gè)列表是需要考慮的問(wèn)題。目前一個(gè)可行的思路是選擇幾個(gè)大V用戶(hù),批量爬取他們的關(guān)注列表。比如張老師目前跟隨著(zhù)58W+,通過(guò):
URI: http://www.zhihu.com/node/ProfileFollowersListV2 POST/HTTP 1.1
Form Data
method: next
params: {"offset": {{%OFFSET}}, "order_by": "hash_id", "hash_id": "{{%HASHID}}"}
_xsrf:
每次可以獲得20個(gè)關(guān)注者的用戶(hù)信息。此信息包括 hash_id、用戶(hù)名、UID、關(guān)注者/關(guān)注者數量、問(wèn)題數量、答案數量等。 查看全部
文章采集api(來(lái)說(shuō)獲得用戶(hù)專(zhuān)欄文章的鏈接信息,此乃神器!)
目前還沒(méi)有官方API支持?;蛟S最有用的就是用戶(hù)的“個(gè)性化URL”(好別扭,以下簡(jiǎn)稱(chēng)UID),比如黃繼新老師的UID:jixin,不過(guò)可以用戶(hù)自己修改,但是每個(gè)用戶(hù)都必須是獨特的。
將對應的 UID 替換為 {{%UID}}。
1. 獲取用戶(hù)列條目:
URI: http://www.zhihu.com/people/{{%UID}}/posts GET/HTTP 1.1
XPATH: //div[@id='zh-profile-list-container']
通過(guò)解析上述內容,可以得到用戶(hù)的所有列入口地址。
2. 獲取列 文章 信息:
URI: http://zhuanlan.zhihu.com/api/columns/{{%UID}}/posts?limit={{%LIMIT}}&offset={{%OFFSET}} GET/HTTP 1.1
{{%LIMIT}}:表示本次GET請求獲取的數據項個(gè)數,即文章列信息的個(gè)數。我沒(méi)有具體測試過(guò)最大值是多少,但是可以設置大于默認值。默認值為 10。
{{%OFFSET}}:表示本次GET請求獲取的數據項的起始偏移量。
通過(guò)分析以上內容,可以得到每一列文章的信息,如標題、題圖、列文章摘要、發(fā)布時(shí)間、批準數等。請求返回JSON數據。
注意:解析該信息時(shí),可以得到該列文章的鏈接信息。
3. 獲取列 文章:
URI: http://zhuanlan.zhihu.com/api/columns/{{%UID}}/posts/{{%SLUG}} GET/HTTP 1.1
{{%SLUG}}:是2中得到的文章鏈接信息,目前是8位數字。
通過(guò)分析以上內容,可以得到文章欄的內容,以及文章的一些相關(guān)信息。請求返回 JSON 數據。
以上應該足以滿(mǎn)足題主的要求。最重要的是用好Chrome調試工具,這是神器!
* * * * * * * * * *
這里有一些零散的更新來(lái)記錄 知乎 爬蟲(chóng)的想法。當然,相關(guān)實(shí)現還是需要尊重ROBOTS協(xié)議,可以通過(guò)
/機器人.txt
檢查相關(guān)參數。
UID是用戶(hù)所有信息的入口。
雖然用戶(hù)信息有修改間隔限制(一般為幾個(gè)月不等),但考慮到即使是修改用戶(hù)名的操作也會(huì )導致UID發(fā)生變化,從而使之前的存儲失效。當然,這也可以破解:用戶(hù)哈希。這個(gè)哈希值是一個(gè) 32 位的字符串,對于每個(gè)賬戶(hù)來(lái)說(shuō)都是唯一且不變的。
通過(guò) UID 獲取哈希:
URI: http://www.zhihu.com/people/%{{UID}} GET/HTTP 1.1
XPATH: //body/div[@class='zg-wrap zu-main']//div[@class='zm-profile-header-op-btns clearfix']/button/@data-id
通過(guò)解析上面的內容,可以得到UID對應的hash值。(是的,該值存儲在“關(guān)注/取消關(guān)注”按鈕中。)這唯一地標識了用戶(hù)。
目前沒(méi)有辦法通過(guò)hash_id獲取UID,但是有間接方法可以參考:定期通過(guò)關(guān)注列表查看用戶(hù)信息是否發(fā)生變化,當然關(guān)注/取消關(guān)注操作也可以自動(dòng)化:
關(guān)注操作
URI: http://www.zhihu.com/node/MemberFollowBaseV2 POST/HTTP 1.1
Form Data
method: follow_member
params: {"hash_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}
_xsrf:
取消關(guān)注操作
URI: http://www.zhihu.com/node/MemberFollowBaseV2 POST/HTTP 1.1
Form Data
method: unfollow_member
params: {"hash_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}
_xsrf:
知乎爬蟲(chóng)需要一個(gè)UID列表才能正常運行,如何獲取這個(gè)列表是需要考慮的問(wèn)題。目前一個(gè)可行的思路是選擇幾個(gè)大V用戶(hù),批量爬取他們的關(guān)注列表。比如張老師目前跟隨著(zhù)58W+,通過(guò):
URI: http://www.zhihu.com/node/ProfileFollowersListV2 POST/HTTP 1.1
Form Data
method: next
params: {"offset": {{%OFFSET}}, "order_by": "hash_id", "hash_id": "{{%HASHID}}"}
_xsrf:
每次可以獲得20個(gè)關(guān)注者的用戶(hù)信息。此信息包括 hash_id、用戶(hù)名、UID、關(guān)注者/關(guān)注者數量、問(wèn)題數量、答案數量等。
文章采集api(什么是zhihu-articles-api(.json)。。)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 135 次瀏覽 ? 2022-02-16 14:20
簡(jiǎn)介:知乎-articles-api
將您的 知乎文章 導出為可用的 API (.json)。
什么是知乎文章API?
知乎-articles-api 是一個(gè)基于 JavaScript DOM 的腳本,通過(guò) DOM 將你的 知乎文章 導出為 json 格式的 API 文檔,其中收錄標題、鏈接、標題圖等信息。這些 API 可用于其他網(wǎng)站或您自己來(lái)顯示您創(chuàng )建的內容。當用戶(hù)訪(fǎng)問(wèn)這些內容時(shí),用戶(hù)會(huì )跳轉到知乎,從而批準和評論您的內容。
如何使用知乎文章API?
與其他 JavaScript 腳本一樣,您需要使用瀏覽器的調試功能來(lái)執行這些腳本。
首先,您需要訪(fǎng)問(wèn)您的個(gè)人主頁(yè)。
知乎的個(gè)人主頁(yè)一般是:
您的個(gè)人域名
如果您不知道自己的個(gè)人域名,可以從首頁(yè)右上角的頭像訪(fǎng)問(wèn)“我的首頁(yè)”。
切換到“文章”選項卡
zaa 只能在該選項卡下工作。
如果您希望導出其他內容,請務(wù)必仔細閱讀源代碼并修改相關(guān)內容。
在這個(gè)選項卡下,通過(guò)調試腳本的執行,瀏覽器會(huì )自動(dòng)下載一個(gè)名為username.json的文件。
腳本:
例子:
{
"Article_0": {
"headline": "為K100 Pro更換更大容量的電池",
"url": "zhuanlan.zhihu.com/p/205607070",
"dateP": "2020-08-29T14:22:15.000Z",
"dateM": "2020-09-01T17:17:49.000Z",
"img": "https://pic4.zhimg.com/v2-8ac0 ... ot%3B
},
"Article_1": {
"headline": "ES6動(dòng)態(tài)計算屬性名的另外一種用法/屬性名表達式",
"url": "zhuanlan.zhihu.com/p/199698763",
"dateP": "2020-08-26T15:24:06.000Z",
"dateM": "2020-08-27T02:42:41.000Z",
"img": "https://pic4.zhimg.com/v2-8ac0 ... ot%3B
},
"Article_2": {
"headline": "為Vuetify的UI組件添加滾動(dòng)條",
"url": "zhuanlan.zhihu.com/p/196736891",
"dateP": "2020-08-24T10:25:53.000Z",
"dateM": "2020-08-24T10:25:53.000Z",
"img": "https://pic4.zhimg.com/v2-8ac0 ... ot%3B
},
"Article_3": {
"headline": "解決移動(dòng)端左右滑動(dòng)/溢出問(wèn)題",
"url": "zhuanlan.zhihu.com/p/194403402",
"dateP": "2020-08-22T16:20:05.000Z",
"dateM": "2020-08-22T16:20:05.000Z",
"img": "https://pic4.zhimg.com/v2-8ac0 ... ot%3B
},
知乎-articles-api 合法嗎?
與所有爬蟲(chóng)、API 等一樣,請確保您在相關(guān)用戶(hù)協(xié)議的規范范圍內使用您獲取的內容。
由于 知乎-articles-api 在 DOM 上運行,獲取的內容是公開(kāi)可用的,并且已經(jīng)加載到用戶(hù)端,我認為這不會(huì )導致非法行為。
但是,請不要將本腳本用于非您創(chuàng )作的內容,也不要將本腳本獲得的內容用于商業(yè)目的,本人對本腳本的任何使用概不負責。
我還是不明白這個(gè)腳本是做什么的
對于托管在 Github 上的靜態(tài)頁(yè)面,如何動(dòng)態(tài)生成博文是一個(gè)非常棘手的問(wèn)題。如果使用普通的靜態(tài)頁(yè)面生成器(markdown),雖然可行,但還是不方便更新維護。個(gè)人網(wǎng)站的流量往往比較少,不利于創(chuàng )意內容的傳播。
通過(guò)知乎-articles-api,將你的文章轉換成API,生成json文件。將此文件部署到對象存儲并進(jìn)行 CDN 分發(fā)。根據這個(gè)json文件生成文章的列表,可以實(shí)現創(chuàng )作內容的遷移。只要在云端修改json文件,就可以動(dòng)態(tài)修改靜態(tài)頁(yè)面的內容,無(wú)需重新生成靜態(tài)頁(yè)面。
簡(jiǎn)單來(lái)說(shuō),你將自己創(chuàng )建的內容托管在知乎上,相關(guān)的靜態(tài)資源也托管在知乎的服務(wù)器上。
已知問(wèn)題和版本更新:
版本 1.00:
如果你的標題圖片是.png格式的透明文件,知乎可能會(huì )在服務(wù)器上生成兩個(gè)文件,白色背景和源文件。通過(guò)知乎-articles-api生成json文件時(shí),只能訪(fǎng)問(wèn)前者。如果您的網(wǎng)站使用深色主題或夜間模式,則可能值得考慮將 知乎 源文件替換為其他來(lái)源的 .png 文件。
感激:
將對象導出為 JSON:
根據自定義屬性獲取元素(原文已過(guò)期,這是轉載鏈接): 查看全部
文章采集api(什么是zhihu-articles-api(.json)。。)
簡(jiǎn)介:知乎-articles-api
將您的 知乎文章 導出為可用的 API (.json)。
什么是知乎文章API?
知乎-articles-api 是一個(gè)基于 JavaScript DOM 的腳本,通過(guò) DOM 將你的 知乎文章 導出為 json 格式的 API 文檔,其中收錄標題、鏈接、標題圖等信息。這些 API 可用于其他網(wǎng)站或您自己來(lái)顯示您創(chuàng )建的內容。當用戶(hù)訪(fǎng)問(wèn)這些內容時(shí),用戶(hù)會(huì )跳轉到知乎,從而批準和評論您的內容。
如何使用知乎文章API?
與其他 JavaScript 腳本一樣,您需要使用瀏覽器的調試功能來(lái)執行這些腳本。
首先,您需要訪(fǎng)問(wèn)您的個(gè)人主頁(yè)。
知乎的個(gè)人主頁(yè)一般是:
您的個(gè)人域名
如果您不知道自己的個(gè)人域名,可以從首頁(yè)右上角的頭像訪(fǎng)問(wèn)“我的首頁(yè)”。
切換到“文章”選項卡
zaa 只能在該選項卡下工作。
如果您希望導出其他內容,請務(wù)必仔細閱讀源代碼并修改相關(guān)內容。
在這個(gè)選項卡下,通過(guò)調試腳本的執行,瀏覽器會(huì )自動(dòng)下載一個(gè)名為username.json的文件。
腳本:
例子:
{
"Article_0": {
"headline": "為K100 Pro更換更大容量的電池",
"url": "zhuanlan.zhihu.com/p/205607070",
"dateP": "2020-08-29T14:22:15.000Z",
"dateM": "2020-09-01T17:17:49.000Z",
"img": "https://pic4.zhimg.com/v2-8ac0 ... ot%3B
},
"Article_1": {
"headline": "ES6動(dòng)態(tài)計算屬性名的另外一種用法/屬性名表達式",
"url": "zhuanlan.zhihu.com/p/199698763",
"dateP": "2020-08-26T15:24:06.000Z",
"dateM": "2020-08-27T02:42:41.000Z",
"img": "https://pic4.zhimg.com/v2-8ac0 ... ot%3B
},
"Article_2": {
"headline": "為Vuetify的UI組件添加滾動(dòng)條",
"url": "zhuanlan.zhihu.com/p/196736891",
"dateP": "2020-08-24T10:25:53.000Z",
"dateM": "2020-08-24T10:25:53.000Z",
"img": "https://pic4.zhimg.com/v2-8ac0 ... ot%3B
},
"Article_3": {
"headline": "解決移動(dòng)端左右滑動(dòng)/溢出問(wèn)題",
"url": "zhuanlan.zhihu.com/p/194403402",
"dateP": "2020-08-22T16:20:05.000Z",
"dateM": "2020-08-22T16:20:05.000Z",
"img": "https://pic4.zhimg.com/v2-8ac0 ... ot%3B
},
知乎-articles-api 合法嗎?
與所有爬蟲(chóng)、API 等一樣,請確保您在相關(guān)用戶(hù)協(xié)議的規范范圍內使用您獲取的內容。
由于 知乎-articles-api 在 DOM 上運行,獲取的內容是公開(kāi)可用的,并且已經(jīng)加載到用戶(hù)端,我認為這不會(huì )導致非法行為。
但是,請不要將本腳本用于非您創(chuàng )作的內容,也不要將本腳本獲得的內容用于商業(yè)目的,本人對本腳本的任何使用概不負責。
我還是不明白這個(gè)腳本是做什么的
對于托管在 Github 上的靜態(tài)頁(yè)面,如何動(dòng)態(tài)生成博文是一個(gè)非常棘手的問(wèn)題。如果使用普通的靜態(tài)頁(yè)面生成器(markdown),雖然可行,但還是不方便更新維護。個(gè)人網(wǎng)站的流量往往比較少,不利于創(chuàng )意內容的傳播。
通過(guò)知乎-articles-api,將你的文章轉換成API,生成json文件。將此文件部署到對象存儲并進(jìn)行 CDN 分發(fā)。根據這個(gè)json文件生成文章的列表,可以實(shí)現創(chuàng )作內容的遷移。只要在云端修改json文件,就可以動(dòng)態(tài)修改靜態(tài)頁(yè)面的內容,無(wú)需重新生成靜態(tài)頁(yè)面。
簡(jiǎn)單來(lái)說(shuō),你將自己創(chuàng )建的內容托管在知乎上,相關(guān)的靜態(tài)資源也托管在知乎的服務(wù)器上。
已知問(wèn)題和版本更新:
版本 1.00:
如果你的標題圖片是.png格式的透明文件,知乎可能會(huì )在服務(wù)器上生成兩個(gè)文件,白色背景和源文件。通過(guò)知乎-articles-api生成json文件時(shí),只能訪(fǎng)問(wèn)前者。如果您的網(wǎng)站使用深色主題或夜間模式,則可能值得考慮將 知乎 源文件替換為其他來(lái)源的 .png 文件。
感激:
將對象導出為 JSON:
根據自定義屬性獲取元素(原文已過(guò)期,這是轉載鏈接):
文章采集api(網(wǎng)站權重越高是不是收錄速度就越快,是不是DedeCMS采集 )
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 153 次瀏覽 ? 2022-02-16 06:26
)
網(wǎng)站權重越高收錄速度越快,有沒(méi)有可能只要網(wǎng)站權重足夠高網(wǎng)站內容可以秒做< @收錄? 對于新站點(diǎn),低權限站點(diǎn)是否無(wú)法實(shí)現快速內容收錄?這樣想是一廂情愿的想法,也是不成熟的想法。
決定網(wǎng)站內容爬取速度的因素,以及搜索引擎影響網(wǎng)站爬取速度的核心因素,還是取決于你內容的屬性。對于咨詢(xún)等具有一定時(shí)效性?xún)热輰傩缘木W(wǎng)站,可以實(shí)現較好的收錄速度,秒級收錄即可?;谒阉饕?,意思是給用戶(hù)他們需要的信息。但信息化信息屬于優(yōu)質(zhì)內容,類(lèi)似重復內容的概率相對較小,因此更有價(jià)值。今天教大家一個(gè)快速的采集優(yōu)質(zhì)文章Dedecms采集(很多大佬都在用)。
這個(gè)dedecms采集不需要學(xué)習更專(zhuān)業(yè)的技術(shù),簡(jiǎn)單幾步就可以輕松采集內容數據,用戶(hù)只需要dedecms采集@對>進(jìn)行簡(jiǎn)單的設置,完成后dedecms采集會(huì )根據用戶(hù)設置的關(guān)鍵詞匹配內容和圖片的準確率,可以選擇保存在本地或者選擇< @k1@ >發(fā)布后,提供方便快捷的內容采集偽原創(chuàng )發(fā)布服務(wù)??!
和其他的Dedecms采集相比,這個(gè)Dedecms采集基本沒(méi)有什么門(mén)檻,也不需要花很多時(shí)間去學(xué)習正則表達式或者html標簽,一分鐘只需要輸入關(guān)鍵詞即可實(shí)現采集(dedecms采集也自帶關(guān)鍵詞采集的功能)。一路掛斷!設置任務(wù)自動(dòng)執行采集偽原創(chuàng )發(fā)布和推送任務(wù)。
幾十萬(wàn)個(gè)不同的cms網(wǎng)站可以統一管理。一個(gè)人維護數百個(gè) 網(wǎng)站文章 更新也不是問(wèn)題。
這類(lèi)Dedecms采集發(fā)布插件工具還配備了很多SEO功能。通過(guò)采集偽原創(chuàng )軟件發(fā)布時(shí),還可以提升很多SEO優(yōu)化。
例如:設置自動(dòng)下載圖片保存在本地或第三方(使內容不再有對方的外鏈)。自動(dòng)內鏈(讓搜索引擎更深入地抓取你的鏈接)、內容或標題插入,以及網(wǎng)站內容插入或隨機作者、隨機閱讀等,形成一個(gè)“高原創(chuàng )”。
這些SEO小功能不僅提高了網(wǎng)站頁(yè)面原創(chuàng )的度數,還間接提升了網(wǎng)站的收錄排名。您可以通過(guò)軟件工具上的監控管理直接查看文章采集的發(fā)布狀態(tài),不再需要每天登錄網(wǎng)站后臺查看。目前博主親測軟件是免費的,可以直接下載使用!
比如當大家看到一個(gè)引起你注意的熱搜,當你需要了解相關(guān)信息的時(shí)候,如果搜索引擎不能快速抓取并展示相關(guān)內容,那么就是非常糟糕的用戶(hù)體驗。.
這再次建立在上述觀(guān)點(diǎn)之上,如果高權重 網(wǎng)站 可以獲得良好的 收錄 速度,那么會(huì )發(fā)生什么?一般來(lái)說(shuō),很多高權重的網(wǎng)站信息量很大。如果權重高再去快速收錄,很有可能搜索引擎抓取壓力太大,所以顯示很不切實(shí)際的快速收錄對于很多< @網(wǎng)站。
比如圖庫網(wǎng)站,很多這類(lèi)網(wǎng)站網(wǎng)站的權重很高,每天的內容可能會(huì )增加成百上千。但是,這類(lèi)網(wǎng)站的特點(diǎn)就是內容在網(wǎng)絡(luò )上并不特殊,也沒(méi)有時(shí)效性,那么秒收這些網(wǎng)站又有什么意義呢。不僅不是秒收錄,這種類(lèi)型的網(wǎng)站很多頁(yè)面都不是收錄。
很多人會(huì )驚訝,權重這么高,怎么可能不是收錄?首先,例如,圖像 網(wǎng)站 的權重為 7,而另一個(gè)新聞類(lèi) 網(wǎng)站 的權重僅為 5。
基本上基于以上兩點(diǎn),新聞網(wǎng)站的收錄速度比較快。一是權重不是決定收錄的因素,二是所謂權重只是第三方工具根據關(guān)鍵詞預測流量。根據預估的站點(diǎn)流量,根據流量大小確定網(wǎng)站的權重評價(jià)。對于搜索引擎來(lái)說(shuō),根本就沒(méi)有所謂的權重,所以很多時(shí)候,權重高的網(wǎng)站在各方面的表現并不一定比搜索引擎好。重量輕 網(wǎng)站 有利于速度。
權重只能作為優(yōu)化程度的參考,所以單純認為權重高網(wǎng)站可以快收錄就更加荒謬了。
可以低權重網(wǎng)站秒收錄嗎?答案是肯定的,我體驗過(guò)很多權重只有1的網(wǎng)站,還可以?xún)?yōu)化到秒?;旧现灰獌热葙|(zhì)量還可以,秒級接收還可以的文字內容還是比較容易的。收錄是SEO優(yōu)化的基本開(kāi)始,網(wǎng)站內容秒數并不決定你的內容能否上榜。
網(wǎng)站即使你能做到內容秒收錄,并不代表你能獲得好的排名,即使你有排名,也不一定意味著(zhù)你有流量。
更多流量仍然取決于您的內容的受歡迎程度。許多網(wǎng)站非常擅長(cháng)在幾秒鐘內采集內容。事實(shí)上,這類(lèi)內容的競爭很小,本身也不是很受歡迎,所以很容易成為比較。易收錄內容,快收錄不是什么難技巧。
如果能在競爭激烈的內容下實(shí)現快速收錄,那可以說(shuō)是非常不錯了。在同樣的內容網(wǎng)站下,大致可以認為此時(shí)的權重較高。收錄速度越快,此時(shí)越科學(xué)??觳⒉淮砻胧?,只是凸顯了一個(gè)時(shí)間的速度。
看完這篇文章,如果覺(jué)得不錯,不妨采集一下,或者發(fā)給需要的朋友同事。每天跟著(zhù)博主為你展示各種SEO經(jīng)驗,打通你的兩條血脈!
查看全部
文章采集api(網(wǎng)站權重越高是不是收錄速度就越快,是不是DedeCMS采集
)
網(wǎng)站權重越高收錄速度越快,有沒(méi)有可能只要網(wǎng)站權重足夠高網(wǎng)站內容可以秒做< @收錄? 對于新站點(diǎn),低權限站點(diǎn)是否無(wú)法實(shí)現快速內容收錄?這樣想是一廂情愿的想法,也是不成熟的想法。
決定網(wǎng)站內容爬取速度的因素,以及搜索引擎影響網(wǎng)站爬取速度的核心因素,還是取決于你內容的屬性。對于咨詢(xún)等具有一定時(shí)效性?xún)热輰傩缘木W(wǎng)站,可以實(shí)現較好的收錄速度,秒級收錄即可?;谒阉饕?,意思是給用戶(hù)他們需要的信息。但信息化信息屬于優(yōu)質(zhì)內容,類(lèi)似重復內容的概率相對較小,因此更有價(jià)值。今天教大家一個(gè)快速的采集優(yōu)質(zhì)文章Dedecms采集(很多大佬都在用)。
這個(gè)dedecms采集不需要學(xué)習更專(zhuān)業(yè)的技術(shù),簡(jiǎn)單幾步就可以輕松采集內容數據,用戶(hù)只需要dedecms采集@對>進(jìn)行簡(jiǎn)單的設置,完成后dedecms采集會(huì )根據用戶(hù)設置的關(guān)鍵詞匹配內容和圖片的準確率,可以選擇保存在本地或者選擇< @k1@ >發(fā)布后,提供方便快捷的內容采集偽原創(chuàng )發(fā)布服務(wù)??!
和其他的Dedecms采集相比,這個(gè)Dedecms采集基本沒(méi)有什么門(mén)檻,也不需要花很多時(shí)間去學(xué)習正則表達式或者html標簽,一分鐘只需要輸入關(guān)鍵詞即可實(shí)現采集(dedecms采集也自帶關(guān)鍵詞采集的功能)。一路掛斷!設置任務(wù)自動(dòng)執行采集偽原創(chuàng )發(fā)布和推送任務(wù)。
幾十萬(wàn)個(gè)不同的cms網(wǎng)站可以統一管理。一個(gè)人維護數百個(gè) 網(wǎng)站文章 更新也不是問(wèn)題。
這類(lèi)Dedecms采集發(fā)布插件工具還配備了很多SEO功能。通過(guò)采集偽原創(chuàng )軟件發(fā)布時(shí),還可以提升很多SEO優(yōu)化。
例如:設置自動(dòng)下載圖片保存在本地或第三方(使內容不再有對方的外鏈)。自動(dòng)內鏈(讓搜索引擎更深入地抓取你的鏈接)、內容或標題插入,以及網(wǎng)站內容插入或隨機作者、隨機閱讀等,形成一個(gè)“高原創(chuàng )”。
這些SEO小功能不僅提高了網(wǎng)站頁(yè)面原創(chuàng )的度數,還間接提升了網(wǎng)站的收錄排名。您可以通過(guò)軟件工具上的監控管理直接查看文章采集的發(fā)布狀態(tài),不再需要每天登錄網(wǎng)站后臺查看。目前博主親測軟件是免費的,可以直接下載使用!
比如當大家看到一個(gè)引起你注意的熱搜,當你需要了解相關(guān)信息的時(shí)候,如果搜索引擎不能快速抓取并展示相關(guān)內容,那么就是非常糟糕的用戶(hù)體驗。.
這再次建立在上述觀(guān)點(diǎn)之上,如果高權重 網(wǎng)站 可以獲得良好的 收錄 速度,那么會(huì )發(fā)生什么?一般來(lái)說(shuō),很多高權重的網(wǎng)站信息量很大。如果權重高再去快速收錄,很有可能搜索引擎抓取壓力太大,所以顯示很不切實(shí)際的快速收錄對于很多< @網(wǎng)站。
比如圖庫網(wǎng)站,很多這類(lèi)網(wǎng)站網(wǎng)站的權重很高,每天的內容可能會(huì )增加成百上千。但是,這類(lèi)網(wǎng)站的特點(diǎn)就是內容在網(wǎng)絡(luò )上并不特殊,也沒(méi)有時(shí)效性,那么秒收這些網(wǎng)站又有什么意義呢。不僅不是秒收錄,這種類(lèi)型的網(wǎng)站很多頁(yè)面都不是收錄。
很多人會(huì )驚訝,權重這么高,怎么可能不是收錄?首先,例如,圖像 網(wǎng)站 的權重為 7,而另一個(gè)新聞類(lèi) 網(wǎng)站 的權重僅為 5。
基本上基于以上兩點(diǎn),新聞網(wǎng)站的收錄速度比較快。一是權重不是決定收錄的因素,二是所謂權重只是第三方工具根據關(guān)鍵詞預測流量。根據預估的站點(diǎn)流量,根據流量大小確定網(wǎng)站的權重評價(jià)。對于搜索引擎來(lái)說(shuō),根本就沒(méi)有所謂的權重,所以很多時(shí)候,權重高的網(wǎng)站在各方面的表現并不一定比搜索引擎好。重量輕 網(wǎng)站 有利于速度。
權重只能作為優(yōu)化程度的參考,所以單純認為權重高網(wǎng)站可以快收錄就更加荒謬了。
可以低權重網(wǎng)站秒收錄嗎?答案是肯定的,我體驗過(guò)很多權重只有1的網(wǎng)站,還可以?xún)?yōu)化到秒?;旧现灰獌热葙|(zhì)量還可以,秒級接收還可以的文字內容還是比較容易的。收錄是SEO優(yōu)化的基本開(kāi)始,網(wǎng)站內容秒數并不決定你的內容能否上榜。
網(wǎng)站即使你能做到內容秒收錄,并不代表你能獲得好的排名,即使你有排名,也不一定意味著(zhù)你有流量。
更多流量仍然取決于您的內容的受歡迎程度。許多網(wǎng)站非常擅長(cháng)在幾秒鐘內采集內容。事實(shí)上,這類(lèi)內容的競爭很小,本身也不是很受歡迎,所以很容易成為比較。易收錄內容,快收錄不是什么難技巧。
如果能在競爭激烈的內容下實(shí)現快速收錄,那可以說(shuō)是非常不錯了。在同樣的內容網(wǎng)站下,大致可以認為此時(shí)的權重較高。收錄速度越快,此時(shí)越科學(xué)??觳⒉淮砻胧?,只是凸顯了一個(gè)時(shí)間的速度。
看完這篇文章,如果覺(jué)得不錯,不妨采集一下,或者發(fā)給需要的朋友同事。每天跟著(zhù)博主為你展示各種SEO經(jīng)驗,打通你的兩條血脈!
文章采集api(4.1API通用規則API用一套非常標準的規則生成數據)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 106 次瀏覽 ? 2022-02-12 10:13
一般情況下,程序員可以使用HTPP協(xié)議向API發(fā)起請求,獲取一定的信息,API會(huì )以XML或JSON格式返回服務(wù)器響應信息。
API 使用通常不被視為網(wǎng)絡(luò )數據采集,但實(shí)際上使用的許多技術(shù)(都發(fā)送 HTTP 請求)和結果(都獲取信息)是相似的;兩者經(jīng)常有重疊的相容關(guān)系。
例如,結合 Wikipedia 編輯歷史記錄(其中收錄編輯者的 IP 地址)和 IP 地址解析 API 以獲取 Wikipedia 條目的編輯者的地理位置。
4.1 API 概述
谷歌 API
4.2 API 通用規則
API 使用一套非常標準的規則來(lái)生成數據,并且生成的數據以非常標準的方式組織。
四種方式:GET、POST、PUT、DELETE
驗證:需要客戶(hù)端驗證
4.3 服務(wù)器響應
大多數反饋數據格式是 XML 和 JSON
過(guò)去,服務(wù)器端使用 PHP 和 .NET 等程序作為 API 的接收端?,F在,服務(wù)器端也使用一些 JavaScript 框架作為 API 的發(fā)送和接收端,例如 Angular 或 Backbone。
接口調用:
4.4 回聲巢穴
回聲巢音樂(lè )資料網(wǎng)站
4.5 推特 API
點(diǎn)安裝推特
from twitter import Twitter
t = Twitter(auth=OAuth(,,,))
pythonTweets = t.search.tweets(q = "#python")
print(pythonTweets)
鳴叫 4.6 個(gè) Google API
無(wú)論您想使用哪種信息,包括語(yǔ)言翻譯、地理位置、日歷,甚至基因數據,Google 都提供 API。Google 還為其一些知名應用程序提供 API,例如 Gmail、YouTube 和 Blogger。
4.7 解析 JSON 數據
import json
from urllib.request import urlopen
def getCountry(ipAddress):
response = urlopen("http://freegeoip.net/json/"+ipAddress).read().decode('utf-8')
responseJson = json.loads(response)
return responseJson.get("country_code")
print(getCountry("50.78.253.58"))
4.8 返回主題
將多個(gè)數據源組合成新的形式,或者使用 API 作為工具從新的角度解釋數據采集。
先做一個(gè)采集維基百科的基礎程序,找到編輯歷史頁(yè)面,然后在編輯歷史中找出IP地址
# -*- coding: utf-8 -*-
from urllib.request import urlopen
from bs4 import BeautifulSoup
import datetime
import random
import re
import json
random.seed(datetime.datetime.now())
# https://en.wikipedia.org/wiki/Python_(programming_language)
def getLinks(articleUrl):
html = urlopen("http://en.wikipedia.org"+articleUrl)
bsObj = BeautifulSoup(html)
return bsObj.find("div",{"id":"bodyContent"}).findAll("a", href=re.compile("^(/wiki/)((?!:).)*$"))
def getHistoryIPs(pageUrl):
# 編輯歷史頁(yè)面URL鏈接格式是:
# https://en.wikipedia.org/w/index.php?title=Python_(programming_language)&action=history
pageUrl = pageUrl.replace("/wiki/", "")
historyUrl = "https://en.wikipedia.org/w/ind ... ot%3B
print("history url is: "+historyUrl)
html = urlopen(historyUrl)
bsObj = BeautifulSoup(html)
# 找出class屬性是"mw-anonuserlink"的鏈接
# 它們用IP地址代替用戶(hù)名
ipAddresses = bsObj.findAll("a", {"class":"mw-anonuserlink"})
addressList = set()
for ipAddress in ipAddresses:
addressList.add(ipAddress.get_text())
return addressList
links = getLinks("/wiki/Python_(programming_language)")
def getCountry(ipAddress):
try:
response = urlopen("http://freegeoip.net/json/"+ipAddress).read().decode('utf-8')
except HTTPError:
return None
responseJson = json.loads(response)
return responseJson.get("country_code")
while (len(links) > 0):
for link in links:
print("-------------------")
historyIPs = getHistoryIPs(link.attrs["href"])
for historyIP in historyIPs:
#print(historyIP)
country = getCountry(historyIP)
if country is not None:
print(historyIP+" is from "+country)
newLink = links[random.randint(0, len(links)-1)].attrs["href"]
links = getLinks(newLink)
4.9 更多 API
Leonard Richardson、Mike Amundsen 和 Sam Ruby 的 RESTful Web APIs ( ) 為使用 Web APIs 提供了非常全面的理論和實(shí)踐指南。此外,Mike Amundsen 的精彩視頻教程 Designing APIs for the Web() 教您如何創(chuàng )建自己的 API。如果您想以方便的方式分享您的 采集 數據,他的視頻非常有用 查看全部
文章采集api(4.1API通用規則API用一套非常標準的規則生成數據)
一般情況下,程序員可以使用HTPP協(xié)議向API發(fā)起請求,獲取一定的信息,API會(huì )以XML或JSON格式返回服務(wù)器響應信息。
API 使用通常不被視為網(wǎng)絡(luò )數據采集,但實(shí)際上使用的許多技術(shù)(都發(fā)送 HTTP 請求)和結果(都獲取信息)是相似的;兩者經(jīng)常有重疊的相容關(guān)系。
例如,結合 Wikipedia 編輯歷史記錄(其中收錄編輯者的 IP 地址)和 IP 地址解析 API 以獲取 Wikipedia 條目的編輯者的地理位置。
4.1 API 概述
谷歌 API
4.2 API 通用規則
API 使用一套非常標準的規則來(lái)生成數據,并且生成的數據以非常標準的方式組織。
四種方式:GET、POST、PUT、DELETE
驗證:需要客戶(hù)端驗證
4.3 服務(wù)器響應
大多數反饋數據格式是 XML 和 JSON
過(guò)去,服務(wù)器端使用 PHP 和 .NET 等程序作為 API 的接收端?,F在,服務(wù)器端也使用一些 JavaScript 框架作為 API 的發(fā)送和接收端,例如 Angular 或 Backbone。
接口調用:
4.4 回聲巢穴
回聲巢音樂(lè )資料網(wǎng)站
4.5 推特 API
點(diǎn)安裝推特
from twitter import Twitter
t = Twitter(auth=OAuth(,,,))
pythonTweets = t.search.tweets(q = "#python")
print(pythonTweets)
鳴叫 4.6 個(gè) Google API
無(wú)論您想使用哪種信息,包括語(yǔ)言翻譯、地理位置、日歷,甚至基因數據,Google 都提供 API。Google 還為其一些知名應用程序提供 API,例如 Gmail、YouTube 和 Blogger。
4.7 解析 JSON 數據
import json
from urllib.request import urlopen
def getCountry(ipAddress):
response = urlopen("http://freegeoip.net/json/"+ipAddress).read().decode('utf-8')
responseJson = json.loads(response)
return responseJson.get("country_code")
print(getCountry("50.78.253.58"))
4.8 返回主題
將多個(gè)數據源組合成新的形式,或者使用 API 作為工具從新的角度解釋數據采集。
先做一個(gè)采集維基百科的基礎程序,找到編輯歷史頁(yè)面,然后在編輯歷史中找出IP地址
# -*- coding: utf-8 -*-
from urllib.request import urlopen
from bs4 import BeautifulSoup
import datetime
import random
import re
import json
random.seed(datetime.datetime.now())
# https://en.wikipedia.org/wiki/Python_(programming_language)
def getLinks(articleUrl):
html = urlopen("http://en.wikipedia.org"+articleUrl)
bsObj = BeautifulSoup(html)
return bsObj.find("div",{"id":"bodyContent"}).findAll("a", href=re.compile("^(/wiki/)((?!:).)*$"))
def getHistoryIPs(pageUrl):
# 編輯歷史頁(yè)面URL鏈接格式是:
# https://en.wikipedia.org/w/index.php?title=Python_(programming_language)&action=history
pageUrl = pageUrl.replace("/wiki/", "")
historyUrl = "https://en.wikipedia.org/w/ind ... ot%3B
print("history url is: "+historyUrl)
html = urlopen(historyUrl)
bsObj = BeautifulSoup(html)
# 找出class屬性是"mw-anonuserlink"的鏈接
# 它們用IP地址代替用戶(hù)名
ipAddresses = bsObj.findAll("a", {"class":"mw-anonuserlink"})
addressList = set()
for ipAddress in ipAddresses:
addressList.add(ipAddress.get_text())
return addressList
links = getLinks("/wiki/Python_(programming_language)")
def getCountry(ipAddress):
try:
response = urlopen("http://freegeoip.net/json/"+ipAddress).read().decode('utf-8')
except HTTPError:
return None
responseJson = json.loads(response)
return responseJson.get("country_code")
while (len(links) > 0):
for link in links:
print("-------------------")
historyIPs = getHistoryIPs(link.attrs["href"])
for historyIP in historyIPs:
#print(historyIP)
country = getCountry(historyIP)
if country is not None:
print(historyIP+" is from "+country)
newLink = links[random.randint(0, len(links)-1)].attrs["href"]
links = getLinks(newLink)
4.9 更多 API
Leonard Richardson、Mike Amundsen 和 Sam Ruby 的 RESTful Web APIs ( ) 為使用 Web APIs 提供了非常全面的理論和實(shí)踐指南。此外,Mike Amundsen 的精彩視頻教程 Designing APIs for the Web() 教您如何創(chuàng )建自己的 API。如果您想以方便的方式分享您的 采集 數據,他的視頻非常有用
文章采集api(終于找到解決方案了,這是一個(gè)值得慶祝的事情..)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 121 次瀏覽 ? 2022-02-11 00:09
終于找到了解決辦法,值得慶賀....
原來(lái)是因為微信在源碼中添加了反采集代碼,把文章源碼中的這一段去掉就好了!
具體代碼如下:
public function getCon(){<br style="margin:0px;padding:0px;" /> header('Content-type: text/html; charset=utf-8');<br style="margin:0px;padding:0px;" /> import('Vendor.QL.QueryList');<br style="margin:0px;padding:0px;" /> $w_url=$_POST['wurl']; //接收到的文章地址<br style="margin:0px;padding:0px;" />// 測試文章地址<br style="margin:0px;padding:0px;" />// $w_url='http://mp.weixin.qq.com/s%3F__ ... %3Bbr style="margin:0px;padding:0px;" />// echo "alert('".$w_url."');";<br style="margin:0px;padding:0px;" /> $html = file_get_contents($w_url); //獲取文章源碼并保存到參數中<br style="margin:0px;padding:0px;" />// echo "alert('".$html."');";<br style="margin:0px;padding:0px;" /> $html = str_replace("", "", $html); //去除微信中的抓取干擾代碼<br style="margin:0px;padding:0px;" />// die($w_url);<br style="margin:0px;padding:0px;" /><br style="margin:0px;padding:0px;" />// var_dump($html);<br style="margin:0px;padding:0px;" /> $data = \QueryList::Query($html,array(<br style="margin:0px;padding:0px;" /> //采集規則庫<br style="margin:0px;padding:0px;" /> //'規則名' => array('jQuery選擇器','要采集的屬性'),<br style="margin:0px;padding:0px;" /> 'titleTag' => array('title','text'),<br style="margin:0px;padding:0px;" />// 'title' => array('#activity-name','text'),<br style="margin:0px;padding:0px;" /> 'content' => array('body','text'),<br style="margin:0px;padding:0px;" />// 'image' => array('img','src'),<br style="margin:0px;padding:0px;" /> //微信規則<br style="margin:0px;padding:0px;" /> 'contentWx' => array('#js_content','text'),<br style="margin:0px;padding:0px;" />// 'imageWx' => array('img','data-src'),<br style="margin:0px;padding:0px;" />// 'conText' => array('.rich_media_content>p','text'),<br style="margin:0px;padding:0px;" /> ))->data;<br style="margin:0px;padding:0px;" /> foreach ($data as $k => $v) {<br style="margin:0px;padding:0px;" /> $data[$k]['imageWx'] = $this->cut_str($v['imageWx'],'?',0);<br style="margin:0px;padding:0px;" /> }<br style="margin:0px;padding:0px;" />//打印結果<br style="margin:0px;padding:0px;" />// print_r($data);<br style="margin:0px;padding:0px;" /> $this->assign('conD',$data);<br style="margin:0px;padding:0px;" /> $this->display();<br style="margin:0px;padding:0px;" /><br style="margin:0px;padding:0px;" /> }
String token = AccessTokenTool.getAccessToken();
String URL = "https://api.weixin.qq.com/cgi- ... 3B%3B
// 原始json
String jsonResult = HttpUtil.sendGet(URL.replace("OPENID", openid).replace("ACCESS_TOKEN", token));
System.out.println(jsonResult);
// 編碼后的json
String json = new String(jsonResult.getBytes("ISO-8859-1"), "UTF-8");
System.out.println(json);
坐下來(lái)輸入代碼。沒(méi)有什么技能不經(jīng)過(guò)多年的深思熟慮就能輕易做到的 查看全部
文章采集api(終于找到解決方案了,這是一個(gè)值得慶祝的事情..)
終于找到了解決辦法,值得慶賀....
原來(lái)是因為微信在源碼中添加了反采集代碼,把文章源碼中的這一段去掉就好了!
具體代碼如下:
public function getCon(){<br style="margin:0px;padding:0px;" /> header('Content-type: text/html; charset=utf-8');<br style="margin:0px;padding:0px;" /> import('Vendor.QL.QueryList');<br style="margin:0px;padding:0px;" /> $w_url=$_POST['wurl']; //接收到的文章地址<br style="margin:0px;padding:0px;" />// 測試文章地址<br style="margin:0px;padding:0px;" />// $w_url='http://mp.weixin.qq.com/s%3F__ ... %3Bbr style="margin:0px;padding:0px;" />// echo "alert('".$w_url."');";<br style="margin:0px;padding:0px;" /> $html = file_get_contents($w_url); //獲取文章源碼并保存到參數中<br style="margin:0px;padding:0px;" />// echo "alert('".$html."');";<br style="margin:0px;padding:0px;" /> $html = str_replace("", "", $html); //去除微信中的抓取干擾代碼<br style="margin:0px;padding:0px;" />// die($w_url);<br style="margin:0px;padding:0px;" /><br style="margin:0px;padding:0px;" />// var_dump($html);<br style="margin:0px;padding:0px;" /> $data = \QueryList::Query($html,array(<br style="margin:0px;padding:0px;" /> //采集規則庫<br style="margin:0px;padding:0px;" /> //'規則名' => array('jQuery選擇器','要采集的屬性'),<br style="margin:0px;padding:0px;" /> 'titleTag' => array('title','text'),<br style="margin:0px;padding:0px;" />// 'title' => array('#activity-name','text'),<br style="margin:0px;padding:0px;" /> 'content' => array('body','text'),<br style="margin:0px;padding:0px;" />// 'image' => array('img','src'),<br style="margin:0px;padding:0px;" /> //微信規則<br style="margin:0px;padding:0px;" /> 'contentWx' => array('#js_content','text'),<br style="margin:0px;padding:0px;" />// 'imageWx' => array('img','data-src'),<br style="margin:0px;padding:0px;" />// 'conText' => array('.rich_media_content>p','text'),<br style="margin:0px;padding:0px;" /> ))->data;<br style="margin:0px;padding:0px;" /> foreach ($data as $k => $v) {<br style="margin:0px;padding:0px;" /> $data[$k]['imageWx'] = $this->cut_str($v['imageWx'],'?',0);<br style="margin:0px;padding:0px;" /> }<br style="margin:0px;padding:0px;" />//打印結果<br style="margin:0px;padding:0px;" />// print_r($data);<br style="margin:0px;padding:0px;" /> $this->assign('conD',$data);<br style="margin:0px;padding:0px;" /> $this->display();<br style="margin:0px;padding:0px;" /><br style="margin:0px;padding:0px;" /> }
String token = AccessTokenTool.getAccessToken();
String URL = "https://api.weixin.qq.com/cgi- ... 3B%3B
// 原始json
String jsonResult = HttpUtil.sendGet(URL.replace("OPENID", openid).replace("ACCESS_TOKEN", token));
System.out.println(jsonResult);
// 編碼后的json
String json = new String(jsonResult.getBytes("ISO-8859-1"), "UTF-8");
System.out.println(json);
坐下來(lái)輸入代碼。沒(méi)有什么技能不經(jīng)過(guò)多年的深思熟慮就能輕易做到的
文章采集api(cms如何添加采集api接口快速建站,網(wǎng)站模板建站平臺)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 137 次瀏覽 ? 2022-02-07 13:20
cms如何添加api采集接口快速建站,網(wǎng)站模板建站平臺
高端網(wǎng)站設計cms如何添加api采集接口平臺值得您免費注冊使用,您可以放心點(diǎn)擊使用!
?1、 網(wǎng)站模板免費使用,3000套海量網(wǎng)站行業(yè)模板任你選擇,所見(jiàn)即所得。
?2、易于維護。如果有錯,可以修改,直到合適為止。
?3、覆蓋范圍廣、產(chǎn)品穩定、每周持續更新、專(zhuān)人專(zhuān)職、優(yōu)質(zhì)服務(wù)讓您滿(mǎn)意
?4、覆蓋電腦網(wǎng)站、手機網(wǎng)站、小程序、微網(wǎng)站等多平臺終端,無(wú)需擔心流量曝光
?5、高性?xún)r(jià)比企業(yè)網(wǎng)站施工方案,買(mǎi)三年送三年,還在猶豫嗎?
cms如何添加api采集界面網(wǎng)站免費提供各行各業(yè)的網(wǎng)站模板供你選擇,總有一款適合你,有都是各種素材圖片,完全不用擔心沒(méi)有素材可做網(wǎng)站。
?1、cms如何添加api采集接口網(wǎng)站服務(wù),或者免費模板自建
?2、怎么做網(wǎng)站,只要你會(huì )用電腦制作網(wǎng)站,客服兄妹耐心教你
?3、我們如何制作自己的網(wǎng)站,cms如何添加api采集接口來(lái)幫助你實(shí)現你的網(wǎng)站夢(mèng)想
?4、不用自己寫(xiě)代碼,建個(gè)網(wǎng)站其實(shí)是很簡(jiǎn)單的事情
?5、提供建站+空間+域名+備案一站式服務(wù),讓您無(wú)后顧之憂(yōu)
?6、一鍵免費注冊建站,豐富的功能控件拖拽自由操作,快速編輯,網(wǎng)站可生成預覽
?7、新手會(huì )用網(wǎng)站build,不信可以試試
?8、網(wǎng)站四合一【電腦、手機、微網(wǎng)站、小程序】 查看全部
文章采集api(cms如何添加采集api接口快速建站,網(wǎng)站模板建站平臺)
cms如何添加api采集接口快速建站,網(wǎng)站模板建站平臺

高端網(wǎng)站設計cms如何添加api采集接口平臺值得您免費注冊使用,您可以放心點(diǎn)擊使用!
?1、 網(wǎng)站模板免費使用,3000套海量網(wǎng)站行業(yè)模板任你選擇,所見(jiàn)即所得。
?2、易于維護。如果有錯,可以修改,直到合適為止。
?3、覆蓋范圍廣、產(chǎn)品穩定、每周持續更新、專(zhuān)人專(zhuān)職、優(yōu)質(zhì)服務(wù)讓您滿(mǎn)意
?4、覆蓋電腦網(wǎng)站、手機網(wǎng)站、小程序、微網(wǎng)站等多平臺終端,無(wú)需擔心流量曝光
?5、高性?xún)r(jià)比企業(yè)網(wǎng)站施工方案,買(mǎi)三年送三年,還在猶豫嗎?

cms如何添加api采集界面網(wǎng)站免費提供各行各業(yè)的網(wǎng)站模板供你選擇,總有一款適合你,有都是各種素材圖片,完全不用擔心沒(méi)有素材可做網(wǎng)站。
?1、cms如何添加api采集接口網(wǎng)站服務(wù),或者免費模板自建
?2、怎么做網(wǎng)站,只要你會(huì )用電腦制作網(wǎng)站,客服兄妹耐心教你
?3、我們如何制作自己的網(wǎng)站,cms如何添加api采集接口來(lái)幫助你實(shí)現你的網(wǎng)站夢(mèng)想
?4、不用自己寫(xiě)代碼,建個(gè)網(wǎng)站其實(shí)是很簡(jiǎn)單的事情
?5、提供建站+空間+域名+備案一站式服務(wù),讓您無(wú)后顧之憂(yōu)
?6、一鍵免費注冊建站,豐富的功能控件拖拽自由操作,快速編輯,網(wǎng)站可生成預覽
?7、新手會(huì )用網(wǎng)站build,不信可以試試
?8、網(wǎng)站四合一【電腦、手機、微網(wǎng)站、小程序】
文章采集api(離線(xiàn)文檔查閱Dash的優(yōu)勢是什么?工具集成介紹)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 135 次瀏覽 ? 2022-02-01 16:09
對于軟件開(kāi)發(fā)領(lǐng)域的新手和絕大多數計算機科學(xué)專(zhuān)業(yè)的學(xué)生來(lái)說(shuō),API 文檔是眾多硬骨頭之一。大多數文檔存在交互不友好和索引不方便的問(wèn)題。本著(zhù)解決人民群眾需求的精神,介紹了本期的主角Dash。
Dash 將自己定位為開(kāi)發(fā)人員的文檔查詢(xún)工具。事實(shí)上,Dash 在易用性和實(shí)用性方面都非常強大。簡(jiǎn)要總結如下:
可以說(shuō),Dash 絕對對得起它的定位。用了之后,很有可能沒(méi)有它就活不下去了。
離線(xiàn)文檔審核
Dash首先是一個(gè)文檔查詢(xún)工具,也是它的核心。它基本上涵蓋了所有主流和一些非主流語(yǔ)言、框架和庫的文檔。大部分文檔來(lái)自這些語(yǔ)言的官方語(yǔ)言,所以也收錄了很多官方的介紹。
讓我們專(zhuān)注于 API 查詢(xún)。在 Dash 中查詢(xún) API 非常簡(jiǎn)單。您可以根據需要搜索所有下載的文檔,或雙擊選擇特定文檔,然后輸入關(guān)鍵字進(jìn)行搜索。在這種情況下,搜索范圍將被鎖定在該特定文檔中。文檔內。Dash的檢索效率非常高,基本秒出結果。
以 JavaScript 文檔為例,它被合理地劃分為“類(lèi)”、“方法”、“事件”、“函數”、“關(guān)鍵字”以及來(lái)自 MDN 的非常實(shí)用的介紹。與在線(xiàn)版本相比,像Dash這樣的離線(xiàn)文檔庫的優(yōu)勢不僅在于它可以處理更多的場(chǎng)景,而且所有內容一目了然,而且很容易檢索,無(wú)需忍受快速和慢速的外國服務(wù)器。
這是畫(huà)布教程,這部分來(lái)自 MDN(Mozilla 開(kāi)發(fā)者網(wǎng)絡(luò ),Web 標準的主要開(kāi)發(fā)和推廣組織之一一)。
第三方工具集成
由于其作為開(kāi)發(fā)和生產(chǎn)力工具的定位,Dash 與許多工具和 IDE 無(wú)縫集成?;旧?,您使用和將使用的工具都得到官方支持。插件的安裝方法在其GitHub對應的各個(gè)Repository上都有詳細的安裝說(shuō)明,點(diǎn)擊上方對應的工具圖標即可找到。
以Alfred為例,即使沒(méi)有額外的步驟,點(diǎn)擊圖標后會(huì )自動(dòng)跳轉到Alfred,點(diǎn)擊import即可安裝。集成 Dash 后,索引甚至不需要打開(kāi)應用程序本身,不太方便。
感受觸手可及的閱讀樂(lè )趣。
自定義數據源
如果你覺(jué)得 Dash 的官方庫不能滿(mǎn)足你的所有需求,你想自定義它作為文檔源!
沒(méi)問(wèn)題,Google Stack Overflow 已經(jīng)集成。您還可以將任何您喜歡的社區用作自定義搜索庫,并且很容易添加。以Medium為例,直接在上面搜索東西后,復制URL。
可以看到搜索關(guān)鍵詞是網(wǎng)址的q后面的段落。在 Dash 的偏好設置中點(diǎn)擊網(wǎng)頁(yè)搜索欄左下角的 +,在名稱(chēng)字段中輸入搜索源的名稱(chēng);將 URL 粘貼到 Search URL 字段中,然后輸入關(guān)鍵字只需將其替換為 {query}。
添加注釋
Dash還自帶注釋工具,可以在文檔的任意部分添加注釋?zhuān)瑢W(xué)習有很大幫助,也符合大學(xué)做筆記的風(fēng)格。
此外,您還可以將 Mark 學(xué)了一半時(shí)間的章節或 API 添加到書(shū)簽中,并將其添加到書(shū)簽中以供將來(lái)參考。
總的來(lái)說(shuō),Dash是一款在文檔的廣度和質(zhì)量上可以滿(mǎn)足大部分人使用場(chǎng)景的工具,同時(shí)還提供了包括自定義數據源、添加注釋等個(gè)性化功能,對于學(xué)習和工作都有很大的幫助. 明顯地。學(xué)習搜索是技術(shù)發(fā)展道路上不可或缺的一步,你也是嗎?
除了 Mac 端,Dash 還有一個(gè) iOS 版本。iOS 版本完全免費,還支持離線(xiàn)文檔。此外,它還支持 URL Schemes 等功能。您可以從 App Store 或 GitHub 下載源文件。 查看全部
文章采集api(離線(xiàn)文檔查閱Dash的優(yōu)勢是什么?工具集成介紹)
對于軟件開(kāi)發(fā)領(lǐng)域的新手和絕大多數計算機科學(xué)專(zhuān)業(yè)的學(xué)生來(lái)說(shuō),API 文檔是眾多硬骨頭之一。大多數文檔存在交互不友好和索引不方便的問(wèn)題。本著(zhù)解決人民群眾需求的精神,介紹了本期的主角Dash。
Dash 將自己定位為開(kāi)發(fā)人員的文檔查詢(xún)工具。事實(shí)上,Dash 在易用性和實(shí)用性方面都非常強大。簡(jiǎn)要總結如下:
可以說(shuō),Dash 絕對對得起它的定位。用了之后,很有可能沒(méi)有它就活不下去了。
離線(xiàn)文檔審核
Dash首先是一個(gè)文檔查詢(xún)工具,也是它的核心。它基本上涵蓋了所有主流和一些非主流語(yǔ)言、框架和庫的文檔。大部分文檔來(lái)自這些語(yǔ)言的官方語(yǔ)言,所以也收錄了很多官方的介紹。
讓我們專(zhuān)注于 API 查詢(xún)。在 Dash 中查詢(xún) API 非常簡(jiǎn)單。您可以根據需要搜索所有下載的文檔,或雙擊選擇特定文檔,然后輸入關(guān)鍵字進(jìn)行搜索。在這種情況下,搜索范圍將被鎖定在該特定文檔中。文檔內。Dash的檢索效率非常高,基本秒出結果。

以 JavaScript 文檔為例,它被合理地劃分為“類(lèi)”、“方法”、“事件”、“函數”、“關(guān)鍵字”以及來(lái)自 MDN 的非常實(shí)用的介紹。與在線(xiàn)版本相比,像Dash這樣的離線(xiàn)文檔庫的優(yōu)勢不僅在于它可以處理更多的場(chǎng)景,而且所有內容一目了然,而且很容易檢索,無(wú)需忍受快速和慢速的外國服務(wù)器。

這是畫(huà)布教程,這部分來(lái)自 MDN(Mozilla 開(kāi)發(fā)者網(wǎng)絡(luò ),Web 標準的主要開(kāi)發(fā)和推廣組織之一一)。

第三方工具集成
由于其作為開(kāi)發(fā)和生產(chǎn)力工具的定位,Dash 與許多工具和 IDE 無(wú)縫集成?;旧?,您使用和將使用的工具都得到官方支持。插件的安裝方法在其GitHub對應的各個(gè)Repository上都有詳細的安裝說(shuō)明,點(diǎn)擊上方對應的工具圖標即可找到。

以Alfred為例,即使沒(méi)有額外的步驟,點(diǎn)擊圖標后會(huì )自動(dòng)跳轉到Alfred,點(diǎn)擊import即可安裝。集成 Dash 后,索引甚至不需要打開(kāi)應用程序本身,不太方便。

感受觸手可及的閱讀樂(lè )趣。

自定義數據源
如果你覺(jué)得 Dash 的官方庫不能滿(mǎn)足你的所有需求,你想自定義它作為文檔源!
沒(méi)問(wèn)題,Google Stack Overflow 已經(jīng)集成。您還可以將任何您喜歡的社區用作自定義搜索庫,并且很容易添加。以Medium為例,直接在上面搜索東西后,復制URL。

可以看到搜索關(guān)鍵詞是網(wǎng)址的q后面的段落。在 Dash 的偏好設置中點(diǎn)擊網(wǎng)頁(yè)搜索欄左下角的 +,在名稱(chēng)字段中輸入搜索源的名稱(chēng);將 URL 粘貼到 Search URL 字段中,然后輸入關(guān)鍵字只需將其替換為 {query}。

添加注釋
Dash還自帶注釋工具,可以在文檔的任意部分添加注釋?zhuān)瑢W(xué)習有很大幫助,也符合大學(xué)做筆記的風(fēng)格。

此外,您還可以將 Mark 學(xué)了一半時(shí)間的章節或 API 添加到書(shū)簽中,并將其添加到書(shū)簽中以供將來(lái)參考。
總的來(lái)說(shuō),Dash是一款在文檔的廣度和質(zhì)量上可以滿(mǎn)足大部分人使用場(chǎng)景的工具,同時(shí)還提供了包括自定義數據源、添加注釋等個(gè)性化功能,對于學(xué)習和工作都有很大的幫助. 明顯地。學(xué)習搜索是技術(shù)發(fā)展道路上不可或缺的一步,你也是嗎?
除了 Mac 端,Dash 還有一個(gè) iOS 版本。iOS 版本完全免費,還支持離線(xiàn)文檔。此外,它還支持 URL Schemes 等功能。您可以從 App Store 或 GitHub 下載源文件。
文章采集api(Java開(kāi)發(fā)中常見(jiàn)的純文本解析方法-樂(lè )題庫)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 114 次瀏覽 ? 2022-01-29 00:21
其他可用的 python http 請求模塊:
你的頻率
你請求
其中frequests和grequests的使用方式相同,frequests的穩定性高于grequests;簡(jiǎn)單使用如下:
2.響應結果數據格式
常見(jiàn)的響應結果格式為:
3.各種數據格式的分析方法3.1 Html分析方法
常見(jiàn)的html數據解析方式有:
3.2 純文本解析方法
常見(jiàn)的純文本解析方法有:
3.3 網(wǎng)頁(yè)正文提取
網(wǎng)頁(yè)正文提取的重要性:
正則表達式可以準確提取某種固定格式的頁(yè)面,但面對各種HTML,難免要用規則來(lái)處理。能否高效、準確地提取頁(yè)面文本,使其在大規模網(wǎng)頁(yè)范圍內通用,是直接關(guān)系到上層應用的難題。
研究計劃:
JoyHTML的目的是解析HTML文本中的鏈接和文本,采用超鏈接密度法作為標記窗口算法的主要判斷依據,采用DOM樹(shù)解析方式。
這個(gè) Java 類(lèi)庫提供了檢測和刪除網(wǎng)頁(yè)主要文本內容旁邊的冗余重復內容的算法。它已經(jīng)提供了特殊的策略來(lái)處理一些常見(jiàn)的功能,例如新聞文章提取。
該算法首次將網(wǎng)頁(yè)文本提取問(wèn)題轉化為尋找頁(yè)面的行塊分布函數,并將其與HTML標簽完全分離。通過(guò)線(xiàn)性時(shí)間建立線(xiàn)塊分布函數圖,該圖可以直接、高效、準確地定位網(wǎng)頁(yè)文本。同時(shí)采用統計與規則相結合的方法解決系統的一般性問(wèn)題。
這里我們只使用 cx-extractor 和可讀性;這里是cx-extractor和可讀性的對比,如下:
cx-extractor的使用示例如下圖所示:
cx-extractor 和可讀性比較
4.數據解析詳解
建議: 查看全部
文章采集api(Java開(kāi)發(fā)中常見(jiàn)的純文本解析方法-樂(lè )題庫)
其他可用的 python http 請求模塊:
你的頻率
你請求
其中frequests和grequests的使用方式相同,frequests的穩定性高于grequests;簡(jiǎn)單使用如下:
2.響應結果數據格式
常見(jiàn)的響應結果格式為:
3.各種數據格式的分析方法3.1 Html分析方法
常見(jiàn)的html數據解析方式有:
3.2 純文本解析方法
常見(jiàn)的純文本解析方法有:
3.3 網(wǎng)頁(yè)正文提取
網(wǎng)頁(yè)正文提取的重要性:
正則表達式可以準確提取某種固定格式的頁(yè)面,但面對各種HTML,難免要用規則來(lái)處理。能否高效、準確地提取頁(yè)面文本,使其在大規模網(wǎng)頁(yè)范圍內通用,是直接關(guān)系到上層應用的難題。
研究計劃:
JoyHTML的目的是解析HTML文本中的鏈接和文本,采用超鏈接密度法作為標記窗口算法的主要判斷依據,采用DOM樹(shù)解析方式。
這個(gè) Java 類(lèi)庫提供了檢測和刪除網(wǎng)頁(yè)主要文本內容旁邊的冗余重復內容的算法。它已經(jīng)提供了特殊的策略來(lái)處理一些常見(jiàn)的功能,例如新聞文章提取。
該算法首次將網(wǎng)頁(yè)文本提取問(wèn)題轉化為尋找頁(yè)面的行塊分布函數,并將其與HTML標簽完全分離。通過(guò)線(xiàn)性時(shí)間建立線(xiàn)塊分布函數圖,該圖可以直接、高效、準確地定位網(wǎng)頁(yè)文本。同時(shí)采用統計與規則相結合的方法解決系統的一般性問(wèn)題。
這里我們只使用 cx-extractor 和可讀性;這里是cx-extractor和可讀性的對比,如下:
cx-extractor的使用示例如下圖所示:
cx-extractor 和可讀性比較
4.數據解析詳解
建議:
文章采集api(優(yōu)采云采集器官網(wǎng)-網(wǎng)頁(yè)抓取工具優(yōu)采云采集器免費網(wǎng)站采集軟件 )
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 173 次瀏覽 ? 2022-01-25 08:13
)
免責聲明:本教程沒(méi)有任何盈利目的,僅供學(xué)習使用,不會(huì )對網(wǎng)站的操作造成負擔。請不要將其用于任何商業(yè)目的。
優(yōu)采云簡(jiǎn)介
優(yōu)采云采集器官網(wǎng)-網(wǎng)頁(yè)抓取工具優(yōu)采云采集器免費網(wǎng)站采集軟件
優(yōu)采云采集器,專(zhuān)業(yè)的互聯(lián)網(wǎng)數據采集、處理、分析、挖掘軟件,可以靈活快速的抓取網(wǎng)頁(yè)上零散的數據信息,并通過(guò)一系列的分析處理,精準挖掘出來(lái)所需的數據。優(yōu)采云采集器歷經(jīng)十二年的升級更新,積累了大量的用戶(hù)和良好的口碑,是目前最受歡迎的網(wǎng)絡(luò )數據采集軟件。
簡(jiǎn)單來(lái)說(shuō),就是用軟件來(lái)簡(jiǎn)化我們的爬取過(guò)程。整個(gè)過(guò)程無(wú)需編寫(xiě)代碼即可實(shí)現爬蟲(chóng)邏輯。
示例爬取任務(wù)
需要爬取分頁(yè)中的所有頁(yè)面,并進(jìn)一步爬取頁(yè)面上所有有趣條目的二級URL
新任務(wù) 添加任務(wù)
URL采集規則 - URL 獲取
URL采集規則-分頁(yè)設置
分頁(yè)規則主要設置在這里,也就是說(shuō)不僅要抓取當前頁(yè)面,還需要抓取所有頁(yè)面。
內容采集規則
這里設置了將URL中的內容提取到前面的采集的規則,即每個(gè)商品詳情頁(yè)的內容
內容發(fā)布規則
用于指定如何處理采集發(fā)送的內容,這里設置為發(fā)送到一個(gè)api
單擊 + 號以添加規則
新發(fā)布模塊
這里指定要發(fā)送給api的參數,其中name為[Content 采集Rule]部分獲取的信息,參數為規則名稱(chēng)。
您可以保存其他設置而不更改它們。
然后填寫(xiě)請求的主機
其他設置
以下是一些常用設置,可選。
查看爬取的數據
計劃任務(wù)設置
這里可以指定任務(wù)重復運行的規則
發(fā)送通知
可以使用ios軟件bark來(lái)接受通知,其內容就是爬取的規則。在這里,使用 Golang 簡(jiǎn)單地創(chuàng )建了一個(gè)新的 api。當軟件爬取完成后,將信息發(fā)送到api【在內容發(fā)布規則中設置】,然后將消息發(fā)送到api。推送到ios
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package main
import (
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/net/ghttp"
"github.com/gogf/gf/os/glog"
"github.com/gogf/gf/util/gconv"
"github.com/gogf/gf/util/grand"
)
type Info struct {
Url string `json:"url"`
Name string `json:"name"`
TaskType string `json:"task_type"`
}
func main() {
s := g.Server()
s.SetPort(8080)
_ = glog.SetConfigWithMap(g.Map{
"path": "log",
"level": "all",
"file": "{Y-m-d}.log",
"flags": glog.F_TIME_DATE | glog.F_TIME_MILLI | glog.F_FILE_LONG,
})
s.BindHandler("/send_info", func(r *ghttp.Request){
requestId := grand.Letters(16)
var info Info
if err := r.ParseForm(&info); err != nil {
glog.Error(requestId, err)
_ = r.Response.WriteJsonExit(nil)
}
glog.Info(requestId, info)
bark := "https://api.day.app/{xxxxxxxxxxxx}"
body := gconv.String(g.Map{
"device_key": "xxxxxxxxxxxxx",
"body": gconv.String(info),
"title": "商品信息",
"ext_params": g.Map{"url": info.Url},
})
glog.Info(requestId, body)
if _, err := g.Client().Post(bark, body); err != nil{
glog.Error(err)
}
})
s.Run()
} 查看全部
文章采集api(優(yōu)采云采集器官網(wǎng)-網(wǎng)頁(yè)抓取工具優(yōu)采云采集器免費網(wǎng)站采集軟件
)
免責聲明:本教程沒(méi)有任何盈利目的,僅供學(xué)習使用,不會(huì )對網(wǎng)站的操作造成負擔。請不要將其用于任何商業(yè)目的。
優(yōu)采云簡(jiǎn)介
優(yōu)采云采集器官網(wǎng)-網(wǎng)頁(yè)抓取工具優(yōu)采云采集器免費網(wǎng)站采集軟件
優(yōu)采云采集器,專(zhuān)業(yè)的互聯(lián)網(wǎng)數據采集、處理、分析、挖掘軟件,可以靈活快速的抓取網(wǎng)頁(yè)上零散的數據信息,并通過(guò)一系列的分析處理,精準挖掘出來(lái)所需的數據。優(yōu)采云采集器歷經(jīng)十二年的升級更新,積累了大量的用戶(hù)和良好的口碑,是目前最受歡迎的網(wǎng)絡(luò )數據采集軟件。
簡(jiǎn)單來(lái)說(shuō),就是用軟件來(lái)簡(jiǎn)化我們的爬取過(guò)程。整個(gè)過(guò)程無(wú)需編寫(xiě)代碼即可實(shí)現爬蟲(chóng)邏輯。
示例爬取任務(wù)
需要爬取分頁(yè)中的所有頁(yè)面,并進(jìn)一步爬取頁(yè)面上所有有趣條目的二級URL
新任務(wù) 添加任務(wù)

URL采集規則 - URL 獲取

URL采集規則-分頁(yè)設置

分頁(yè)規則主要設置在這里,也就是說(shuō)不僅要抓取當前頁(yè)面,還需要抓取所有頁(yè)面。
內容采集規則

這里設置了將URL中的內容提取到前面的采集的規則,即每個(gè)商品詳情頁(yè)的內容
內容發(fā)布規則
用于指定如何處理采集發(fā)送的內容,這里設置為發(fā)送到一個(gè)api

單擊 + 號以添加規則

新發(fā)布模塊

這里指定要發(fā)送給api的參數,其中name為[Content 采集Rule]部分獲取的信息,參數為規則名稱(chēng)。
您可以保存其他設置而不更改它們。

然后填寫(xiě)請求的主機
其他設置

以下是一些常用設置,可選。
查看爬取的數據

計劃任務(wù)設置

這里可以指定任務(wù)重復運行的規則
發(fā)送通知
可以使用ios軟件bark來(lái)接受通知,其內容就是爬取的規則。在這里,使用 Golang 簡(jiǎn)單地創(chuàng )建了一個(gè)新的 api。當軟件爬取完成后,將信息發(fā)送到api【在內容發(fā)布規則中設置】,然后將消息發(fā)送到api。推送到ios
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package main
import (
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/net/ghttp"
"github.com/gogf/gf/os/glog"
"github.com/gogf/gf/util/gconv"
"github.com/gogf/gf/util/grand"
)
type Info struct {
Url string `json:"url"`
Name string `json:"name"`
TaskType string `json:"task_type"`
}
func main() {
s := g.Server()
s.SetPort(8080)
_ = glog.SetConfigWithMap(g.Map{
"path": "log",
"level": "all",
"file": "{Y-m-d}.log",
"flags": glog.F_TIME_DATE | glog.F_TIME_MILLI | glog.F_FILE_LONG,
})
s.BindHandler("/send_info", func(r *ghttp.Request){
requestId := grand.Letters(16)
var info Info
if err := r.ParseForm(&info); err != nil {
glog.Error(requestId, err)
_ = r.Response.WriteJsonExit(nil)
}
glog.Info(requestId, info)
bark := "https://api.day.app/{xxxxxxxxxxxx}"
body := gconv.String(g.Map{
"device_key": "xxxxxxxxxxxxx",
"body": gconv.String(info),
"title": "商品信息",
"ext_params": g.Map{"url": info.Url},
})
glog.Info(requestId, body)
if _, err := g.Client().Post(bark, body); err != nil{
glog.Error(err)
}
})
s.Run()
}
文章采集api(優(yōu)采云采集支持調用5118一鍵智能換詞API接口(組圖) )
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 203 次瀏覽 ? 2022-01-25 04:20
)
優(yōu)采云采集 支持調用5118一鍵智能換字API接口,處理采集的數據標題和內容等,可處理文章@ > 對搜索引擎更有吸引力;
具體步驟如下
1. 5118 一鍵智能換詞API接口配置 I,API配置入口:
點(diǎn)擊控制臺左側列表中的【第三方服務(wù)配置】==點(diǎn)擊【第三方內容API接入】==點(diǎn)擊【第三方API配置管理】==最后點(diǎn)擊[+5118 一鍵智能原創(chuàng )API]創(chuàng )建接口配置;
二。配置API接口信息:
【API-Key值】是從5118后端獲取的一鍵智能換詞API對應的key值,填寫(xiě)后記得保存;
2. 創(chuàng )建 API 處理規則
API處理規則,可以通過(guò)調用API接口設置處理哪些字段的內容;
一、API處理規則入口:
點(diǎn)擊控制臺左側列表中的【第三方服務(wù)配置】==點(diǎn)擊【第三方內容API接入】==進(jìn)入【API處理規則管理】頁(yè)面,最后點(diǎn)擊[+添加API處理規則]創(chuàng )建API處理規則;
二、API處理規則配置:
規則名稱(chēng):用戶(hù)可以命名;
字段名稱(chēng):填寫(xiě)的字段名稱(chēng)內容將由API接口處理,默認為標題和內容字段,可修改、添加或刪除字段;
API used:選擇配置的API接口配置,執行時(shí)會(huì )調用該接口,不同的字段可以選擇不同的API接口配置;
處理順序:執行順序按照數量從小到大執行;
3.API處理規則使用
API處理規則有兩種使用方式:手動(dòng)執行和自動(dòng)執行:
手動(dòng)執行:數據采集后,使用[Result Data & Release]中的第三方API執行;
自動(dòng)執行:配置自動(dòng)化后,任務(wù)采集數據完成后,系統會(huì )自動(dòng)執行指定的API處理規則,無(wú)需人工操作。
我。手動(dòng)執行API處理規則:
點(diǎn)擊采集任務(wù)的【結果數據&發(fā)布】選項卡中的【SEO&API&翻譯等工具】按鈕==選擇【第三方API執行】欄==選擇對應的API處理規則== "Execute;
二。自動(dòng)執行API處理規則:
啟用 API 處理的自動(dòng)執行。任務(wù)完成后采集會(huì )自動(dòng)執行API處理。一般配合定時(shí)采集和自動(dòng)發(fā)布功能使用非常方便;
在任務(wù)的【自動(dòng)化:發(fā)布&SEO&翻譯】選項卡【自動(dòng)執行第三方API配置】==勾選【采集,自動(dòng)執行API】選項==選擇執行的API處理rules=="選擇API接口處理的數據范圍(一般選擇‘待發(fā)布’,全部會(huì )導致所有數據重復執行),最后點(diǎn)擊保存;
4.API處理結果并發(fā)布 I,查看API接口處理結果:
API接口處理后的內容會(huì )保存為新字段,如:標題處理后的新字段:title_5118,內容處理后的新字段:content_5118,可在【結果數據&發(fā)布】中查看和數據預覽界面。
二。發(fā)布API接口處理后的內容:
發(fā)布前文章@>修改發(fā)布目標第二步的映射字段,重新選擇標題和內容作為API接口處理后添加的對應字段title_5118和content_5118;
查看全部
文章采集api(優(yōu)采云采集支持調用5118一鍵智能換詞API接口(組圖)
)
優(yōu)采云采集 支持調用5118一鍵智能換字API接口,處理采集的數據標題和內容等,可處理文章@ > 對搜索引擎更有吸引力;
具體步驟如下
1. 5118 一鍵智能換詞API接口配置 I,API配置入口:
點(diǎn)擊控制臺左側列表中的【第三方服務(wù)配置】==點(diǎn)擊【第三方內容API接入】==點(diǎn)擊【第三方API配置管理】==最后點(diǎn)擊[+5118 一鍵智能原創(chuàng )API]創(chuàng )建接口配置;
二。配置API接口信息:
【API-Key值】是從5118后端獲取的一鍵智能換詞API對應的key值,填寫(xiě)后記得保存;
2. 創(chuàng )建 API 處理規則
API處理規則,可以通過(guò)調用API接口設置處理哪些字段的內容;
一、API處理規則入口:
點(diǎn)擊控制臺左側列表中的【第三方服務(wù)配置】==點(diǎn)擊【第三方內容API接入】==進(jìn)入【API處理規則管理】頁(yè)面,最后點(diǎn)擊[+添加API處理規則]創(chuàng )建API處理規則;
二、API處理規則配置:
規則名稱(chēng):用戶(hù)可以命名;
字段名稱(chēng):填寫(xiě)的字段名稱(chēng)內容將由API接口處理,默認為標題和內容字段,可修改、添加或刪除字段;
API used:選擇配置的API接口配置,執行時(shí)會(huì )調用該接口,不同的字段可以選擇不同的API接口配置;
處理順序:執行順序按照數量從小到大執行;
3.API處理規則使用
API處理規則有兩種使用方式:手動(dòng)執行和自動(dòng)執行:
手動(dòng)執行:數據采集后,使用[Result Data & Release]中的第三方API執行;
自動(dòng)執行:配置自動(dòng)化后,任務(wù)采集數據完成后,系統會(huì )自動(dòng)執行指定的API處理規則,無(wú)需人工操作。
我。手動(dòng)執行API處理規則:
點(diǎn)擊采集任務(wù)的【結果數據&發(fā)布】選項卡中的【SEO&API&翻譯等工具】按鈕==選擇【第三方API執行】欄==選擇對應的API處理規則== "Execute;
二。自動(dòng)執行API處理規則:
啟用 API 處理的自動(dòng)執行。任務(wù)完成后采集會(huì )自動(dòng)執行API處理。一般配合定時(shí)采集和自動(dòng)發(fā)布功能使用非常方便;
在任務(wù)的【自動(dòng)化:發(fā)布&SEO&翻譯】選項卡【自動(dòng)執行第三方API配置】==勾選【采集,自動(dòng)執行API】選項==選擇執行的API處理rules=="選擇API接口處理的數據范圍(一般選擇‘待發(fā)布’,全部會(huì )導致所有數據重復執行),最后點(diǎn)擊保存;
4.API處理結果并發(fā)布 I,查看API接口處理結果:
API接口處理后的內容會(huì )保存為新字段,如:標題處理后的新字段:title_5118,內容處理后的新字段:content_5118,可在【結果數據&發(fā)布】中查看和數據預覽界面。
二。發(fā)布API接口處理后的內容:
發(fā)布前文章@>修改發(fā)布目標第二步的映射字段,重新選擇標題和內容作為API接口處理后添加的對應字段title_5118和content_5118;
文章采集api( 如何查詢(xún)prometheus采集job中指標下數據量的情況過(guò)濾?)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 153 次瀏覽 ? 2022-01-22 12:25
如何查詢(xún)prometheus采集job中指標下數據量的情況過(guò)濾?)
如何在普羅米修斯中過(guò)濾不需要的指標
在prometheus的采集中,你會(huì )發(fā)現一個(gè)job可能收錄幾十個(gè)甚至上百個(gè)指標,每個(gè)指標下的數據量也非常大。在生產(chǎn)環(huán)境中,我們實(shí)際上可能只用到了幾十個(gè)指標,而那些我們沒(méi)有用過(guò)的指標,prometheus采集就成了浪費部署資源的罪魁禍首。
這時(shí)候就需要考慮過(guò)濾prometheus采集的job中的指標了。
如何查詢(xún)指標下的數據量
1
2
3
4
5
# 展現數據量前50的指標
topk(50, count by (__name__, job)({__name__=~".+"}))
# prometheus中的指標數據量
sum(count by (__name__, job)({__name__=~".+"}))
在 prometheus 采集Job 上過(guò)濾指標
以下是 cadvice采集job 的示例。目前使用metric_relabel_configs下的drop操作丟棄不需要的指標(感覺(jué)不是特別方便)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
- job_name: kubernetes-cadvisor
kubernetes_sd_configs:
- role: node
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
- target_label: __address__
replacement: kubernetes.default.svc:443
- source_labels: [__meta_kubernetes_node_name]
regex: (.+)
target_label: __metrics_path__
replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
metric_relabel_configs:
- action: replace
source_labels: [id]
regex: '^/machine\.slice/machine-rkt\\x2d([^\\]+)\\.+/([^/]+)\.service$'
target_label: rkt_container_name
replacement: '${2}-${1}'
- action: replace
source_labels: [id]
regex: '^/system\.slice/(.+)\.service$'
target_label: systemd_service_name
replacement: '${1}'
# 丟棄掉container_network_tcp_usage_total指標
- action: drop
source_labels: [__name__]
regex: 'container_network_tcp_usage_total'
- action: drop
source_labels: [__name__]
regex: 'container_tasks_state'
- action: drop
source_labels: [__name__]
regex: 'container_network_udp_usage_total'
- action: drop
source_labels: [__name__]
regex: 'container_memory_failures_total'
在 prometheus-opretor 中過(guò)濾 Servicemonit 配置的作業(yè)指標
在使用prometheus-opretor部署監控環(huán)境時(shí),會(huì )發(fā)現很多監控作業(yè)都是使用Servicemonit定義的。您還可以在 Servicemonit 中配置 drop to drop 指示器。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
serviceMonitors:
- name: foundation-prometheus
namespaceSelector:
matchNames:
- monitoring
selector:
matchLabels:
cluster: foundation
endpoints:
- port: foundation-port
honorLabels: true
path: /federate
params:
'match[]':
- '{__name__=~".+"}'
# 配置丟棄container_memory_failures_total指標
metricRelabelings:
- action: drop
source_labels: [__name__]
regex: 'container_memory_failures_total'
在每個(gè) 采集export 中配置不需要的指標
最好的處理方法是在prometheus采集指標之前控制每個(gè)export提供的指標,只給prometheus提供我們需要監控的指標。我們以節點(diǎn)導出為例。在 node-export 中,有一個(gè)應用程序的官方描述。您可以使用--no-collector。用于控制不需要 采集 的模塊的標志 查看全部
文章采集api(
如何查詢(xún)prometheus采集job中指標下數據量的情況過(guò)濾?)
如何在普羅米修斯中過(guò)濾不需要的指標
在prometheus的采集中,你會(huì )發(fā)現一個(gè)job可能收錄幾十個(gè)甚至上百個(gè)指標,每個(gè)指標下的數據量也非常大。在生產(chǎn)環(huán)境中,我們實(shí)際上可能只用到了幾十個(gè)指標,而那些我們沒(méi)有用過(guò)的指標,prometheus采集就成了浪費部署資源的罪魁禍首。
這時(shí)候就需要考慮過(guò)濾prometheus采集的job中的指標了。
如何查詢(xún)指標下的數據量
1
2
3
4
5
# 展現數據量前50的指標
topk(50, count by (__name__, job)({__name__=~".+"}))
# prometheus中的指標數據量
sum(count by (__name__, job)({__name__=~".+"}))
在 prometheus 采集Job 上過(guò)濾指標
以下是 cadvice采集job 的示例。目前使用metric_relabel_configs下的drop操作丟棄不需要的指標(感覺(jué)不是特別方便)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
- job_name: kubernetes-cadvisor
kubernetes_sd_configs:
- role: node
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
- target_label: __address__
replacement: kubernetes.default.svc:443
- source_labels: [__meta_kubernetes_node_name]
regex: (.+)
target_label: __metrics_path__
replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
metric_relabel_configs:
- action: replace
source_labels: [id]
regex: '^/machine\.slice/machine-rkt\\x2d([^\\]+)\\.+/([^/]+)\.service$'
target_label: rkt_container_name
replacement: '${2}-${1}'
- action: replace
source_labels: [id]
regex: '^/system\.slice/(.+)\.service$'
target_label: systemd_service_name
replacement: '${1}'
# 丟棄掉container_network_tcp_usage_total指標
- action: drop
source_labels: [__name__]
regex: 'container_network_tcp_usage_total'
- action: drop
source_labels: [__name__]
regex: 'container_tasks_state'
- action: drop
source_labels: [__name__]
regex: 'container_network_udp_usage_total'
- action: drop
source_labels: [__name__]
regex: 'container_memory_failures_total'
在 prometheus-opretor 中過(guò)濾 Servicemonit 配置的作業(yè)指標
在使用prometheus-opretor部署監控環(huán)境時(shí),會(huì )發(fā)現很多監控作業(yè)都是使用Servicemonit定義的。您還可以在 Servicemonit 中配置 drop to drop 指示器。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
serviceMonitors:
- name: foundation-prometheus
namespaceSelector:
matchNames:
- monitoring
selector:
matchLabels:
cluster: foundation
endpoints:
- port: foundation-port
honorLabels: true
path: /federate
params:
'match[]':
- '{__name__=~".+"}'
# 配置丟棄container_memory_failures_total指標
metricRelabelings:
- action: drop
source_labels: [__name__]
regex: 'container_memory_failures_total'
在每個(gè) 采集export 中配置不需要的指標
最好的處理方法是在prometheus采集指標之前控制每個(gè)export提供的指標,只給prometheus提供我們需要監控的指標。我們以節點(diǎn)導出為例。在 node-export 中,有一個(gè)應用程序的官方描述。您可以使用--no-collector。用于控制不需要 采集 的模塊的標志
文章采集api( 傳cookie )
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 138 次瀏覽 ? 2022-01-21 21:15
傳cookie
)
在api采集的過(guò)程中,有些接口不通過(guò)cookie就不能讓你訪(fǎng)問(wèn)該接口。然后我們需要把cookie帶入到cookie傳遞的地方。
cookie 的來(lái)源,例如訪(fǎng)問(wèn)或登錄。當服務(wù)器響應時(shí),它會(huì )為你生成。
卷曲方法:
// 初始化CURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
// 獲取頭部信息
curl_setopt($ch, CURLOPT_HEADER, 1);
// 返回原生的(Raw)輸出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 執行并獲取返回結果
$content = curl_exec($ch);
// 關(guān)閉CURL
curl_close($ch);
// 解析HTTP數據流
list($header, $body) = explode("\r\n\r\n", $content);
// 解析COOKIE
preg_match("/set\-cookie:([^\r\n]*)/i", $header, $matches);
// 后面用CURL提交的時(shí)候可以直接使用
// curl_setopt($ch, CURLOPT_COOKIE, $cookie);
$cookie = $matches[1];
// 初始化CURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url2);
// 獲取頭部信息
curl_setopt($ch, CURLOPT_HEADER, 1);
// 返回原生的(Raw)輸出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIE, $cookie);//設置cookie
// 執行并獲取返回結果
$content = curl_exec($ch);
// 關(guān)閉CURL
curl_close($ch); 查看全部
文章采集api(
傳cookie
)
在api采集的過(guò)程中,有些接口不通過(guò)cookie就不能讓你訪(fǎng)問(wèn)該接口。然后我們需要把cookie帶入到cookie傳遞的地方。
cookie 的來(lái)源,例如訪(fǎng)問(wèn)或登錄。當服務(wù)器響應時(shí),它會(huì )為你生成。
卷曲方法:
// 初始化CURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
// 獲取頭部信息
curl_setopt($ch, CURLOPT_HEADER, 1);
// 返回原生的(Raw)輸出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 執行并獲取返回結果
$content = curl_exec($ch);
// 關(guān)閉CURL
curl_close($ch);
// 解析HTTP數據流
list($header, $body) = explode("\r\n\r\n", $content);
// 解析COOKIE
preg_match("/set\-cookie:([^\r\n]*)/i", $header, $matches);
// 后面用CURL提交的時(shí)候可以直接使用
// curl_setopt($ch, CURLOPT_COOKIE, $cookie);
$cookie = $matches[1];
// 初始化CURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url2);
// 獲取頭部信息
curl_setopt($ch, CURLOPT_HEADER, 1);
// 返回原生的(Raw)輸出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIE, $cookie);//設置cookie
// 執行并獲取返回結果
$content = curl_exec($ch);
// 關(guān)閉CURL
curl_close($ch);


