亚洲国产精品无码久久大片,亚洲AV无码乱码麻豆精品国产,亚洲品质自拍网站,少妇伦子伦精品无码STYLES,国产精久久久久久久

文章采集調用

文章采集調用

文章采集調用(數據具體的采集方案是什么?四種數據采集方法對比 )

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 135 次瀏覽 ? 2022-03-02 08:11 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(數據具體的采集方案是什么?四種數據采集方法對比
)
  根據企業(yè)在生產(chǎn)經(jīng)營(yíng)過(guò)程中會(huì )產(chǎn)生的數據類(lèi)型,提供鏈接標簽、SDK和API三種采集方法,以及基于UTSE數據采集模型對用戶(hù)的整個(gè)生命周期。
  那么,數據的具體采集計劃是什么?
  
  四種數據采集方法對比
  Data采集是通過(guò)埋點(diǎn)實(shí)現的。諸葛io提供了非常完善的數據訪(fǎng)問(wèn)解決方案,支持代碼埋、全埋、可視埋、服務(wù)端埋等數據采集方式。
  1.代碼被埋沒(méi)
  說(shuō)明:嵌入SDK定義事件和添加事件代碼是一種常用的數據采集方法,主要包括網(wǎng)頁(yè)和h5頁(yè)面的JS嵌入、移動(dòng)端的iOS和Android嵌入、微信小程序等。
  優(yōu)點(diǎn):按需采集,業(yè)務(wù)信息更全,數據分析更專(zhuān)注,數據采集全面準確,便于后續深入分析。
  缺點(diǎn):需要研發(fā)人員配合,有一定的工作量。
  2.全葬
  說(shuō)明:通過(guò)SDK自動(dòng)采集頁(yè)面所有可點(diǎn)擊元素的操作數據,無(wú)需定義事件,適用于活動(dòng)頁(yè)面、登陸頁(yè)面、關(guān)鍵頁(yè)面的設計體驗測量。
  優(yōu)點(diǎn):更簡(jiǎn)單快捷,可以看到頁(yè)面元素的點(diǎn)擊,更好的了解自己產(chǎn)品的特點(diǎn)。
  缺點(diǎn):采集的數據太多,只要是可點(diǎn)擊的元素就會(huì )是采集,上傳數據很多,消耗流量也很大。無(wú)法采集到更深層次的維度信息,比如事件的屬性、用戶(hù)的屬性等。
  3.可視化埋點(diǎn)
  注意:視覺(jué)嵌入基于完全嵌入。技術(shù)同事整合后,業(yè)務(wù)同事需要圈出頁(yè)面的元素,選中的元素會(huì )是采集。
  優(yōu)點(diǎn):基于接口配置,無(wú)需開(kāi)發(fā),易于更新,快速生效。
  缺點(diǎn):對自定義屬性的支持范圍有限;重構或頁(yè)面更改時(shí)需要重新配置。
  4.服務(wù)器埋點(diǎn)
  描述:通過(guò)API對存儲在服務(wù)器上的數據進(jìn)行結構化處理,通過(guò)接口調用其他業(yè)務(wù)數據采集和集成,比如CRM等用戶(hù)數據,對數據進(jìn)行結構化處理,即適合擁有 采集 @采集 能力客戶(hù)端的用戶(hù)。
  優(yōu)點(diǎn):服務(wù)端embedding更有針對性,數據更準確,減少編碼embedding的發(fā)布過(guò)程,數據上傳更及時(shí)。
  缺點(diǎn):用戶(hù)的一些簡(jiǎn)單操作,比如點(diǎn)擊按鈕、切換模塊,這些數據不能采集,用戶(hù)行為不夠完整。
  總結:以上是諸葛io提供的四種data采集解決方案:code embedding、full embedding、visual embedding、server embedding,data采集目的是為了滿(mǎn)足采集詳細分析和操作然后執行需求。只有能夠達到這個(gè)目標,才有可能選擇一種或多種采集形式的組合。在企業(yè)業(yè)務(wù)中,選擇哪種采集方式要根據企業(yè)自身的具體業(yè)務(wù)需求來(lái)決定。
   查看全部

  文章采集調用(數據具體的采集方案是什么?四種數據采集方法對比
)
  根據企業(yè)在生產(chǎn)經(jīng)營(yíng)過(guò)程中會(huì )產(chǎn)生的數據類(lèi)型,提供鏈接標簽、SDK和API三種采集方法,以及基于UTSE數據采集模型對用戶(hù)的整個(gè)生命周期。
  那么,數據的具體采集計劃是什么?
  
  四種數據采集方法對比
  Data采集是通過(guò)埋點(diǎn)實(shí)現的。諸葛io提供了非常完善的數據訪(fǎng)問(wèn)解決方案,支持代碼埋、全埋、可視埋、服務(wù)端埋等數據采集方式。
  1.代碼被埋沒(méi)
  說(shuō)明:嵌入SDK定義事件和添加事件代碼是一種常用的數據采集方法,主要包括網(wǎng)頁(yè)和h5頁(yè)面的JS嵌入、移動(dòng)端的iOS和Android嵌入、微信小程序等。
  優(yōu)點(diǎn):按需采集,業(yè)務(wù)信息更全,數據分析更專(zhuān)注,數據采集全面準確,便于后續深入分析。
  缺點(diǎn):需要研發(fā)人員配合,有一定的工作量。
  2.全葬
  說(shuō)明:通過(guò)SDK自動(dòng)采集頁(yè)面所有可點(diǎn)擊元素的操作數據,無(wú)需定義事件,適用于活動(dòng)頁(yè)面、登陸頁(yè)面、關(guān)鍵頁(yè)面的設計體驗測量。
  優(yōu)點(diǎn):更簡(jiǎn)單快捷,可以看到頁(yè)面元素的點(diǎn)擊,更好的了解自己產(chǎn)品的特點(diǎn)。
  缺點(diǎn):采集的數據太多,只要是可點(diǎn)擊的元素就會(huì )是采集,上傳數據很多,消耗流量也很大。無(wú)法采集到更深層次的維度信息,比如事件的屬性、用戶(hù)的屬性等。
  3.可視化埋點(diǎn)
  注意:視覺(jué)嵌入基于完全嵌入。技術(shù)同事整合后,業(yè)務(wù)同事需要圈出頁(yè)面的元素,選中的元素會(huì )是采集。
  優(yōu)點(diǎn):基于接口配置,無(wú)需開(kāi)發(fā),易于更新,快速生效。
  缺點(diǎn):對自定義屬性的支持范圍有限;重構或頁(yè)面更改時(shí)需要重新配置。
  4.服務(wù)器埋點(diǎn)
  描述:通過(guò)API對存儲在服務(wù)器上的數據進(jìn)行結構化處理,通過(guò)接口調用其他業(yè)務(wù)數據采集和集成,比如CRM等用戶(hù)數據,對數據進(jìn)行結構化處理,即適合擁有 采集 @采集 能力客戶(hù)端的用戶(hù)。
  優(yōu)點(diǎn):服務(wù)端embedding更有針對性,數據更準確,減少編碼embedding的發(fā)布過(guò)程,數據上傳更及時(shí)。
  缺點(diǎn):用戶(hù)的一些簡(jiǎn)單操作,比如點(diǎn)擊按鈕、切換模塊,這些數據不能采集,用戶(hù)行為不夠完整。
  總結:以上是諸葛io提供的四種data采集解決方案:code embedding、full embedding、visual embedding、server embedding,data采集目的是為了滿(mǎn)足采集詳細分析和操作然后執行需求。只有能夠達到這個(gè)目標,才有可能選擇一種或多種采集形式的組合。在企業(yè)業(yè)務(wù)中,選擇哪種采集方式要根據企業(yè)自身的具體業(yè)務(wù)需求來(lái)決定。
  

文章采集調用(利用白帽SEO優(yōu)化方法快速提升網(wǎng)站權重值的方法有哪些)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 115 次瀏覽 ? 2022-03-01 19:02 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(利用白帽SEO優(yōu)化方法快速提升網(wǎng)站權重值的方法有哪些)
  文章采集,使得網(wǎng)站有內容,只有有內容才有可能被收錄推廣,只有收錄才能推廣能不能提高網(wǎng)站權重。 網(wǎng)站權重是對網(wǎng)站綜合價(jià)值的總稱(chēng),包括網(wǎng)站運營(yíng)能力、用戶(hù)體驗、內容質(zhì)量、用戶(hù)熱度、SEO指標。綜合性能統一名稱(chēng)。
  
  文章采集如何增加網(wǎng)站的權重:日常正規管理和運營(yíng)網(wǎng)站,使用正規白帽方法來(lái)操作網(wǎng)站,比如比如更新內容、檢查維護等等,這些都是站長(cháng)必須要做的事情。挖礦優(yōu)化精準關(guān)鍵詞,根據自己的網(wǎng)站行業(yè),挖礦優(yōu)化精準網(wǎng)站關(guān)鍵詞,必須有流量關(guān)鍵詞,如果挖礦關(guān)鍵詞@ >與網(wǎng)站的主題定位無(wú)關(guān),那么網(wǎng)站的權重就很難增加,甚至網(wǎng)站都會(huì )被搜索引擎懲罰。
  
  文章采集改進(jìn)網(wǎng)站和收錄的內容,網(wǎng)站收錄索引數據和網(wǎng)站的數量?jì)热莞率浅杀壤年P(guān)系,如果你長(cháng)時(shí)間不更新網(wǎng)站,那么你的網(wǎng)站索引數據不僅會(huì )增加還會(huì )減少。如果你想改進(jìn)網(wǎng)站網(wǎng)站@收錄的內容,那么你需要不斷更新網(wǎng)站的優(yōu)質(zhì)內容。
  
  同時(shí),站內和站外的SEO也需要做好。除了文章采集還要更新內容,內鏈優(yōu)化,網(wǎng)站結構優(yōu)化,404、網(wǎng)站Sitemap地圖和機器人都屬于到現場(chǎng)搜索引擎優(yōu)化的類(lèi)別。如果你不做好站內優(yōu)化,你的外鏈再好也沒(méi)用,因為你的網(wǎng)站留不住用戶(hù),所以站內優(yōu)化大于站外-網(wǎng)站優(yōu)化,而外部鏈接的作用近年來(lái)逐漸減弱。如果想通過(guò)累計外鏈數量來(lái)增加網(wǎng)站的權重,目前可能很難實(shí)現。 .
  
  使用白帽SEO形式優(yōu)化,為什么一定要使用白帽SEO優(yōu)化網(wǎng)站?因為有的站長(cháng)想用黑帽SEO優(yōu)化方法來(lái)快速提升網(wǎng)站的權重值,如果使用這些黑帽SEO,一旦被搜索引擎發(fā)現,就等待網(wǎng)站的結果只能被處罰或K站。搜索引擎支持用戶(hù)使用正式的白帽SEO優(yōu)化方式,因為這種優(yōu)化方式可以持續為用戶(hù)提供有價(jià)值的內容。
  我們在優(yōu)化網(wǎng)站的時(shí)候,建議不要用黑帽作弊的操作方法優(yōu)化網(wǎng)站,因為到最后你很可能會(huì )花費時(shí)間和精力,但是網(wǎng)站 還不是很好的流程。
  新站前期以文章采集和挖礦網(wǎng)站長(cháng)尾關(guān)鍵詞為主。長(cháng)尾關(guān)鍵詞不僅競爭程度低,而且排名時(shí)間長(cháng)。短,優(yōu)化長(cháng)尾關(guān)鍵詞可能只需要幾個(gè)星期,最長(cháng)不會(huì )超過(guò)一個(gè)月,新站沒(méi)有優(yōu)化基礎,搜索引擎對新站信任度不高網(wǎng)站,我們通過(guò)優(yōu)化文章采集和長(cháng)尾關(guān)鍵詞,可以實(shí)現更快的收錄網(wǎng)站頁(yè)面,更快的流量獲取,然后繼續積累,提升網(wǎng)站的流量和權重,最后爭奪一些高指數高流量的關(guān)鍵詞,新的網(wǎng)站傾向于前期做內容, 文章采集讓新站點(diǎn)的內容快寫(xiě)完的時(shí)候,我們可以?xún)?yōu)化站點(diǎn),交換一些優(yōu)質(zhì)的鏈接。
  
  老站意味著(zhù)已經(jīng)有一定的流量基礎,但是流量不是特別高。老的網(wǎng)站可以?xún)A向于挖一些有一定索引的關(guān)鍵詞,但是不建議選擇索引太高的關(guān)鍵詞,300到500的索引關(guān)鍵詞是比較合適,通過(guò)索引關(guān)鍵詞來(lái)帶動(dòng)全站流量的增加,老的網(wǎng)站權重的增加和高索引流量關(guān)鍵詞有一定的關(guān)系流量詞越多,網(wǎng)站的權重就越高,流量關(guān)鍵詞的不斷積累,搜索引擎對你網(wǎng)站的信任度會(huì )不斷增加。老的網(wǎng)站傾向于后期做流量。返回搜狐,查看更多 查看全部

  文章采集調用(利用白帽SEO優(yōu)化方法快速提升網(wǎng)站權重值的方法有哪些)
  文章采集,使得網(wǎng)站有內容,只有有內容才有可能被收錄推廣,只有收錄才能推廣能不能提高網(wǎng)站權重。 網(wǎng)站權重是對網(wǎng)站綜合價(jià)值的總稱(chēng),包括網(wǎng)站運營(yíng)能力、用戶(hù)體驗、內容質(zhì)量、用戶(hù)熱度、SEO指標。綜合性能統一名稱(chēng)。
  
  文章采集如何增加網(wǎng)站的權重:日常正規管理和運營(yíng)網(wǎng)站,使用正規白帽方法來(lái)操作網(wǎng)站,比如比如更新內容、檢查維護等等,這些都是站長(cháng)必須要做的事情。挖礦優(yōu)化精準關(guān)鍵詞,根據自己的網(wǎng)站行業(yè),挖礦優(yōu)化精準網(wǎng)站關(guān)鍵詞,必須有流量關(guān)鍵詞,如果挖礦關(guān)鍵詞@ >與網(wǎng)站的主題定位無(wú)關(guān),那么網(wǎng)站的權重就很難增加,甚至網(wǎng)站都會(huì )被搜索引擎懲罰。
  
  文章采集改進(jìn)網(wǎng)站和收錄的內容,網(wǎng)站收錄索引數據和網(wǎng)站的數量?jì)热莞率浅杀壤年P(guān)系,如果你長(cháng)時(shí)間不更新網(wǎng)站,那么你的網(wǎng)站索引數據不僅會(huì )增加還會(huì )減少。如果你想改進(jìn)網(wǎng)站網(wǎng)站@收錄的內容,那么你需要不斷更新網(wǎng)站的優(yōu)質(zhì)內容。
  
  同時(shí),站內和站外的SEO也需要做好。除了文章采集還要更新內容,內鏈優(yōu)化,網(wǎng)站結構優(yōu)化,404、網(wǎng)站Sitemap地圖和機器人都屬于到現場(chǎng)搜索引擎優(yōu)化的類(lèi)別。如果你不做好站內優(yōu)化,你的外鏈再好也沒(méi)用,因為你的網(wǎng)站留不住用戶(hù),所以站內優(yōu)化大于站外-網(wǎng)站優(yōu)化,而外部鏈接的作用近年來(lái)逐漸減弱。如果想通過(guò)累計外鏈數量來(lái)增加網(wǎng)站的權重,目前可能很難實(shí)現。 .
  
  使用白帽SEO形式優(yōu)化,為什么一定要使用白帽SEO優(yōu)化網(wǎng)站?因為有的站長(cháng)想用黑帽SEO優(yōu)化方法來(lái)快速提升網(wǎng)站的權重值,如果使用這些黑帽SEO,一旦被搜索引擎發(fā)現,就等待網(wǎng)站的結果只能被處罰或K站。搜索引擎支持用戶(hù)使用正式的白帽SEO優(yōu)化方式,因為這種優(yōu)化方式可以持續為用戶(hù)提供有價(jià)值的內容。
  我們在優(yōu)化網(wǎng)站的時(shí)候,建議不要用黑帽作弊的操作方法優(yōu)化網(wǎng)站,因為到最后你很可能會(huì )花費時(shí)間和精力,但是網(wǎng)站 還不是很好的流程。
  新站前期以文章采集和挖礦網(wǎng)站長(cháng)尾關(guān)鍵詞為主。長(cháng)尾關(guān)鍵詞不僅競爭程度低,而且排名時(shí)間長(cháng)。短,優(yōu)化長(cháng)尾關(guān)鍵詞可能只需要幾個(gè)星期,最長(cháng)不會(huì )超過(guò)一個(gè)月,新站沒(méi)有優(yōu)化基礎,搜索引擎對新站信任度不高網(wǎng)站,我們通過(guò)優(yōu)化文章采集和長(cháng)尾關(guān)鍵詞,可以實(shí)現更快的收錄網(wǎng)站頁(yè)面,更快的流量獲取,然后繼續積累,提升網(wǎng)站的流量和權重,最后爭奪一些高指數高流量的關(guān)鍵詞,新的網(wǎng)站傾向于前期做內容, 文章采集讓新站點(diǎn)的內容快寫(xiě)完的時(shí)候,我們可以?xún)?yōu)化站點(diǎn),交換一些優(yōu)質(zhì)的鏈接。
  
  老站意味著(zhù)已經(jīng)有一定的流量基礎,但是流量不是特別高。老的網(wǎng)站可以?xún)A向于挖一些有一定索引的關(guān)鍵詞,但是不建議選擇索引太高的關(guān)鍵詞,300到500的索引關(guān)鍵詞是比較合適,通過(guò)索引關(guān)鍵詞來(lái)帶動(dòng)全站流量的增加,老的網(wǎng)站權重的增加和高索引流量關(guān)鍵詞有一定的關(guān)系流量詞越多,網(wǎng)站的權重就越高,流量關(guān)鍵詞的不斷積累,搜索引擎對你網(wǎng)站的信任度會(huì )不斷增加。老的網(wǎng)站傾向于后期做流量。返回搜狐,查看更多

文章采集調用(dedecms如何修改這一上限值)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 129 次瀏覽 ? 2022-02-22 11:11 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(dedecms如何修改這一上限值)
  dedecmssystem文章調用描述最大字符數為250字節,文章summary(可以通過(guò)infolen或description相關(guān)標簽調用)設置為最大250 個(gè)字符。上限的主要目的是減少數據庫的冗余,保證網(wǎng)絡(luò )的良好性能。所以,不給配置文件的內容設置一個(gè)上限顯然是不合理的,但是如果可以自由控制這個(gè)上限,那么就會(huì )給網(wǎng)頁(yè)內容的布局帶來(lái)積極的影響。NET 源代碼在網(wǎng)頁(yè)設計過(guò)程中。dedecms 經(jīng)常需要在頻道列表頁(yè)面調用文章 的摘要。如果文章的摘要中的字數可以得到有效控制,那么頁(yè)面布局就可以變得非常靈活。
  先說(shuō)一下如何修改這個(gè)上限值,從而體現[field:description function="cn_substr(@me, number of characters)"/]的重要性。
  在Dedecms系統中,與抽象文章相關(guān)的php文件如下:
  /dede/archives_add.php
  /dede/archives_edit.php
  /dede/article_add.php
  /dede/article_edit.php
  /dede/article_description_main.php
  在添加頁(yè)面中,有一句:$description = cn_substrR($description, $cfg_auot_description); 這句話(huà)實(shí)現了[field:description function="cn_substr(@me, number of characters)"/]的功能。由于此聲明確實(shí)有利于頁(yè)面布局,因此我們正在嘗試不做任何更改。
  我在編輯頁(yè)面,有一句話(huà): $description = cn_substrR($description, 250); ,這句話(huà)顯示了一個(gè)熟悉的字符數 250,也就是 文章 的摘要字符集系統個(gè)數的上限,如果是gbk編碼,會(huì )顯示125個(gè)字符,如果是utf-8編碼,會(huì )是81個(gè)字符。顯然,如果我們要打破抽象字符個(gè)數的上限,一定要搞定。是的,你可以在這里把250改成別的值,比如500。這里不建議設置太高。一個(gè)是不需要在列表頁(yè)顯示太多的內容(最好直接使用body來(lái)顯示過(guò)多的內容),另一個(gè)是避免數據庫冗余。
  完成以上修改還不夠,還需要修改article_description_main.php
  在 article_description_main.php 頁(yè)面上,找到 if($dsize>250) $dsize = 250; 語(yǔ)句,它限制了后臺從摘要中提取的字符數。將此處的 250 更改為 500, 織夢(mèng) 仿站的意思是和之前修改的字符數不同。(如果你確認你的每一個(gè)文章都是手動(dòng)添加的,如果手動(dòng)完成就不需要修改這個(gè)文件了抽象的采集。按照抽象 次要采集保留給大部分 文章 和 采集。)
  最初登錄后臺,在系統-系統基本參數-其他選項中,后續摘要的長(cháng)度可以改為500,即可以和之前修改的字符數不同。
  完成以上修改后,我們進(jìn)入頻道列表頁(yè)面,通過(guò)標簽調用。示例標簽如下:
  {dede:list typeid="row='5' titlelen='100' orderby='new' pagesize='5'}
  [字段:標題/]
  [字段:描述函數='cn_substr(@me,500)'/]…
  {/dede:列表}
  通過(guò)以上方法,我們實(shí)現了被調用的文章摘要字符為500個(gè)字符,完全突破了文章摘要250個(gè)字符的系統限制,為網(wǎng)頁(yè)布局提供了更廣闊的空間。
  先說(shuō)一下常用的Dedecms文章或者列表頁(yè)調用文章summary方法。
  1:[字段:信息/]
  2:[字段:描述/]
  3: [field:info function="cn_substr(@me, 字符數)"/]
  4: [field:description function="cn_substr(@me, 字符數)"/]
  1、的第二種方法是間接調用文章的抽象。關(guān)于被調用字數的問(wèn)題,在使用[field:info /]時(shí),可以調用{dede:arclist infolen=' ' }{/dede :arclist},設置調用摘要的字符數(最大可以設置為系統設置的250);如果使用[field:description/],則間接使用后臺設置的抽象字符上限(后臺也有上限250字符)字符)。顯然這兩種方法是被動(dòng)的和靈活的。
  3、的第四種方法通過(guò)function函數實(shí)現了對文章摘要中顯示字符的靈活調整。當然,當文章的抽象內容中的字符上限沒(méi)有正常修改的情況下,這四種方式的區別并不大。
  ============================
  1:[字段:信息/]
  2:[字段:描述/]
  3:[field:info function="cn_substr(@me, 字符數)"/]
  4:[field:description function="cn_substr(@me, 字符數)"/]
  這四種方法用于調用文章描述標簽。但它最多只能調用前 250 個(gè)字符。如果要調用更多,需要修改幾個(gè)地方:
  1.article_description_main.php頁(yè)面,找到“if ($dsize>250) $dsize = 250;”語(yǔ)句,將250改為500
  2.登錄后臺,在System-System Basic Parameters-Other Options中,將自動(dòng)匯總長(cháng)度改為500.
  3.登錄后臺執行SQL語(yǔ)句:alter table `dede_archives` change `description` `description` varchar ( 1000 )
  調用標簽{dede:field.description function='cn_substr(@me,500)'/}.可以顯示500個(gè)字符 查看全部

  文章采集調用(dedecms如何修改這一上限值)
  dedecmssystem文章調用描述最大字符數為250字節,文章summary(可以通過(guò)infolen或description相關(guān)標簽調用)設置為最大250 個(gè)字符。上限的主要目的是減少數據庫的冗余,保證網(wǎng)絡(luò )的良好性能。所以,不給配置文件的內容設置一個(gè)上限顯然是不合理的,但是如果可以自由控制這個(gè)上限,那么就會(huì )給網(wǎng)頁(yè)內容的布局帶來(lái)積極的影響。NET 源代碼在網(wǎng)頁(yè)設計過(guò)程中。dedecms 經(jīng)常需要在頻道列表頁(yè)面調用文章 的摘要。如果文章的摘要中的字數可以得到有效控制,那么頁(yè)面布局就可以變得非常靈活。
  先說(shuō)一下如何修改這個(gè)上限值,從而體現[field:description function="cn_substr(@me, number of characters)"/]的重要性。
  在Dedecms系統中,與抽象文章相關(guān)的php文件如下:
  /dede/archives_add.php
  /dede/archives_edit.php
  /dede/article_add.php
  /dede/article_edit.php
  /dede/article_description_main.php
  在添加頁(yè)面中,有一句:$description = cn_substrR($description, $cfg_auot_description); 這句話(huà)實(shí)現了[field:description function="cn_substr(@me, number of characters)"/]的功能。由于此聲明確實(shí)有利于頁(yè)面布局,因此我們正在嘗試不做任何更改。
  我在編輯頁(yè)面,有一句話(huà): $description = cn_substrR($description, 250); ,這句話(huà)顯示了一個(gè)熟悉的字符數 250,也就是 文章 的摘要字符集系統個(gè)數的上限,如果是gbk編碼,會(huì )顯示125個(gè)字符,如果是utf-8編碼,會(huì )是81個(gè)字符。顯然,如果我們要打破抽象字符個(gè)數的上限,一定要搞定。是的,你可以在這里把250改成別的值,比如500。這里不建議設置太高。一個(gè)是不需要在列表頁(yè)顯示太多的內容(最好直接使用body來(lái)顯示過(guò)多的內容),另一個(gè)是避免數據庫冗余。
  完成以上修改還不夠,還需要修改article_description_main.php
  在 article_description_main.php 頁(yè)面上,找到 if($dsize>250) $dsize = 250; 語(yǔ)句,它限制了后臺從摘要中提取的字符數。將此處的 250 更改為 500, 織夢(mèng) 仿站的意思是和之前修改的字符數不同。(如果你確認你的每一個(gè)文章都是手動(dòng)添加的,如果手動(dòng)完成就不需要修改這個(gè)文件了抽象的采集。按照抽象 次要采集保留給大部分 文章 和 采集。)
  最初登錄后臺,在系統-系統基本參數-其他選項中,后續摘要的長(cháng)度可以改為500,即可以和之前修改的字符數不同。
  完成以上修改后,我們進(jìn)入頻道列表頁(yè)面,通過(guò)標簽調用。示例標簽如下:
  {dede:list typeid="row='5' titlelen='100' orderby='new' pagesize='5'}
  [字段:標題/]
  [字段:描述函數='cn_substr(@me,500)'/]…
  {/dede:列表}
  通過(guò)以上方法,我們實(shí)現了被調用的文章摘要字符為500個(gè)字符,完全突破了文章摘要250個(gè)字符的系統限制,為網(wǎng)頁(yè)布局提供了更廣闊的空間。
  先說(shuō)一下常用的Dedecms文章或者列表頁(yè)調用文章summary方法。
  1:[字段:信息/]
  2:[字段:描述/]
  3: [field:info function="cn_substr(@me, 字符數)"/]
  4: [field:description function="cn_substr(@me, 字符數)"/]
  1、的第二種方法是間接調用文章的抽象。關(guān)于被調用字數的問(wèn)題,在使用[field:info /]時(shí),可以調用{dede:arclist infolen=' ' }{/dede :arclist},設置調用摘要的字符數(最大可以設置為系統設置的250);如果使用[field:description/],則間接使用后臺設置的抽象字符上限(后臺也有上限250字符)字符)。顯然這兩種方法是被動(dòng)的和靈活的。
  3、的第四種方法通過(guò)function函數實(shí)現了對文章摘要中顯示字符的靈活調整。當然,當文章的抽象內容中的字符上限沒(méi)有正常修改的情況下,這四種方式的區別并不大。
  ============================
  1:[字段:信息/]
  2:[字段:描述/]
  3:[field:info function="cn_substr(@me, 字符數)"/]
  4:[field:description function="cn_substr(@me, 字符數)"/]
  這四種方法用于調用文章描述標簽。但它最多只能調用前 250 個(gè)字符。如果要調用更多,需要修改幾個(gè)地方:
  1.article_description_main.php頁(yè)面,找到“if ($dsize>250) $dsize = 250;”語(yǔ)句,將250改為500
  2.登錄后臺,在System-System Basic Parameters-Other Options中,將自動(dòng)匯總長(cháng)度改為500.
  3.登錄后臺執行SQL語(yǔ)句:alter table `dede_archives` change `description` `description` varchar ( 1000 )
  調用標簽{dede:field.description function='cn_substr(@me,500)'/}.可以顯示500個(gè)字符

文章采集調用(用python+selenuim自動(dòng)框架來(lái)爬取京東商品信息(不要))

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 435 次瀏覽 ? 2022-02-21 23:28 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(用python+selenuim自動(dòng)框架來(lái)爬取京東商品信息(不要))
  今天我們使用python+ selenium 自動(dòng)框架爬取京東商品信息(不要再問(wèn)我為什么是京東了,因為京東不用登錄也可以搜索商品),Selenium是用來(lái)模仿人類(lèi)操作的,免費的手,生產(chǎn)力提升,哈哈,這里是對selenuim的一點(diǎn)介紹。
  硒簡(jiǎn)介
  Selenium 是一個(gè) Web 應用程序測試工具,Selenium 測試直接在瀏覽器中運行,就像真正的用戶(hù)一樣。一般的爬蟲(chóng)方法是使用python腳本直接訪(fǎng)問(wèn)目標網(wǎng)站,并且只對目標數據執行采集,訪(fǎng)問(wèn)速度非???,這樣目標網(wǎng)站就可以輕松識別您這是機器人,它阻止了您。使用selenium寫(xiě)爬蟲(chóng),python腳本控制瀏覽器進(jìn)行訪(fǎng)問(wèn),也就是說(shuō)python腳本和目標網(wǎng)站之間多了一個(gè)瀏覽器操作,這個(gè)行為更像是人的行為,這么多難以爬取網(wǎng)站你也可以輕松抓取數據。
  準備
  首先安裝selenuim,方法和其他第三方庫的安裝方法一樣,使用pip命令
  點(diǎn)安裝硒
  安裝 selenuim 后,您必須安裝驅動(dòng)程序才能使其正常工作。因為我使用的是 Google Chrome,所以我下載了 Google Drive,當然還有 Firefox。下載對應瀏覽器版本的驅動(dòng)(如果沒(méi)有對應版本,也可以下載接近的版本)。以下是兩款驅動(dòng)的下載地址:
  - 谷歌云端硬盤(pán):(點(diǎn)擊下載)
  - 火狐驅動(dòng):(點(diǎn)擊下載)
  
  下載完成后,驅動(dòng)就安裝好了。Firefox驅動(dòng)的安裝方法與Chrome驅動(dòng)相同。把下載好的驅動(dòng)放到你的python安裝路徑下的Script目錄下即可(放到Script文件夾下即可,無(wú)需配置環(huán)境變量)
  
  至此,selenuim的相關(guān)安裝就完成了,接下來(lái)開(kāi)始我們今天的任務(wù)。
  1.導入相關(guān)依賴(lài)
  import time
import json
from pyquery import PyQuery as pq
#pyquery是個(gè)解析庫
from selenium import webdriver
#導入驅動(dòng)webdriver
from selenium.webdriver.common.by import By
#By是selenium中內置的一個(gè)class,在這個(gè)class中有各種方法來(lái)定位元素
from selenium.webdriver.support.ui import WebDriverWait
#設置瀏覽器驅動(dòng)休眠等待,避免頻繁操作封ip
from selenium.webdriver.support import expected_conditions as EC
#判斷一個(gè)元素是否存在,是否加載完畢等一系列的場(chǎng)景判斷方法
  二、使用selenium EC操作瀏覽器
  首先,用Chrome瀏覽器打開(kāi)產(chǎn)品首頁(yè)。我們很容易發(fā)現該網(wǎng)頁(yè)是一個(gè)動(dòng)態(tài)加載的網(wǎng)頁(yè)。首次打開(kāi)網(wǎng)頁(yè)時(shí),僅顯示 30 種產(chǎn)品的信息。只有當網(wǎng)頁(yè)被向下拖動(dòng)時(shí),它才會(huì )加載其余部分。30 項信息。這里我們可以使用selenium模擬瀏覽器拉下網(wǎng)頁(yè),判斷網(wǎng)頁(yè)元素是否通過(guò)EC加載,從而獲取所有產(chǎn)品網(wǎng)站的信息。
  def search():
browser.get('https://www.jd.com/')
try:
input = wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#key"))
) # 等待搜索框加載出來(lái)
submit = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, "#search > div > div.form > button"))
) # 等待搜索按鈕可以被點(diǎn)擊
input[0].send_keys(keyword) # 向搜索框內輸入關(guān)鍵詞
submit.click() # 點(diǎn)擊搜索
time.sleep(2) # 加入時(shí)間間隔,速度太快可能會(huì )抓不到數據
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 下拉到網(wǎng)頁(yè)底部
wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(60)"))
) # 等待最后一個(gè)商品信息加載完畢
html = browser.page_source
except TimeoutError:
search()
  三、使用selenium EC實(shí)現翻頁(yè)操作
  與第一頁(yè)類(lèi)似,它也使用EC來(lái)判斷頁(yè)面元素是否加載,并添加延遲以防止數據被抓到。
  def next_page(page_number):
try:
button = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_bottomPage > span.p-num > a.pn-next > em'))
) # 等待翻頁(yè)按鈕可以點(diǎn)擊
button.click() # 點(diǎn)擊翻頁(yè)按鈕
wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(30)"))
) # 等到30個(gè)商品都加載出來(lái)
time.sleep(2)
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)
wait.until(# 等到60個(gè)商品都加載出來(lái)
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(60)"))
)
html = browser.page_source
find_save(html) # 調用函數篩選數據
except TimeoutError:
return next_page(page_number)
  四、提取數據并保存
  這里使用pyquery庫解析網(wǎng)頁(yè)源代碼,使用CSS_SELECTOR選擇元素。一定要找到參考元素。例如,將鼠標放在搜索框中,右鍵查看,然后跳轉到搜索框中對應的代碼處。右鍵點(diǎn)擊它,點(diǎn)擊Copy > Copy selector,我們得到我們需要的#key,然后通過(guò).text()獲取內容,最后將python對象轉換成json數據寫(xiě)入json文件。
  def find_save(html):
doc = pq(html)
items = doc('#J_goodsList > ul > li').items()
for item in items:
product = {
'name': item('.p-name a').text(),
'price': item('.p-price i').text(),
'commit': item('.p-commit a').text()
}
data_list.append(product) # 寫(xiě)入全局變量
# 把全局變量轉化為json數據
content = json.dumps(data_list, ensure_ascii=False, indent=2)
with open("E:\python\project\selenium\info.json", "w", encoding="utf-8") as f:
f.write(content)
print("json文件寫(xiě)入成功")
  五、編寫(xiě)和調用main函數
  使用for循環(huán)控制爬取的頁(yè)面數并添加延遲
  def main():
print("第", 1, "頁(yè):")
search()
for i in range(2, 6): # 爬取2-5頁(yè)
time.sleep(2) # 設置延遲
print("第", i, "頁(yè):")
next_page(i)
if __name__ == "__main__":
main()
  補充:
  為了提高爬蟲(chóng)的效率,可以將瀏覽器設置為無(wú)圖片模式,即不加載圖片,這樣可以提高采集的速度
  options = webdriver.ChromeOptions()
options.add_experimental_option('prefs'{'profile.managed_default_content_settings.images': 2})
browser = webdriver.Chrome(options=options)
  看看結果:
  
  
  附上完整代碼:
  import time
import json
from pyquery import PyQuery as pq
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
# 不加載圖片
options = webdriver.ChromeOptions()
options.add_experimental_option('prefs', {'profile.managed_default_content_settings.images': 2})
browser = webdriver.Chrome(options=options)
wait = WebDriverWait(browser, 20) # 設置等待時(shí)間
data_list = [] # 設置全局變量用來(lái)存儲數據
keyword = "平凡的世界" # 商品名稱(chēng)
def search():
browser.get('https://www.jd.com/')
try:
input = wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#key"))
) # 等待搜索框加載出來(lái)
submit = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, "#search > div > div.form > button"))
) # 等待搜索按鈕可以被點(diǎn)擊
input[0].send_keys(keyword) # 向搜索框內輸入關(guān)鍵詞
submit.click() # 點(diǎn)擊搜索
time.sleep(2) # 加入時(shí)間間隔,速度太快可能會(huì )抓不到數據
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 滑動(dòng)到底部
wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(60)"))
) # 等待最后一個(gè)商品信息加載完畢
html = browser.page_source
find_save(html) # 調用函數篩選數據
except TimeoutError:
search()
def next_page(page_number):
try:
button = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_bottomPage > span.p-num > a.pn-next > em'))
) # 等待翻頁(yè)按鈕可以點(diǎn)擊
button.click() # 點(diǎn)擊翻頁(yè)按鈕
wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(30)"))
) # 等到30個(gè)商品都加載出來(lái)
time.sleep(2)
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)
wait.until(# 等到60個(gè)商品都加載出來(lái)
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(60)"))
)
html = browser.page_source
find_save(html) # 調用函數篩選數據
except TimeoutError:
return next_page(page_number)
def find_save(html):
doc = pq(html)
items = doc('#J_goodsList > ul > li').items()
# print(items)
for item in items:
product = {
'name': item('.p-name a').text(),
'price': item('.p-price i').text(),
'commit': item('.p-commit a').text()
}
data_list.append(product) # 寫(xiě)入全局變量
# 把全局變量轉化為json數據
content = json.dumps(data_list, ensure_ascii=False, indent=2)
with open("E:\python\project\selenium\info.json", "w", encoding="utf-8") as f:
f.write(content)
print("json文件寫(xiě)入成功")
def main():
print("第", 1, "頁(yè):")
search()
for i in range(2, 6): # 爬取2-5頁(yè)
time.sleep(2) # 設置延遲
print("第", i, "頁(yè):")
next_page(i)
if __name__ == "__main__":
main()
  如有錯誤,請私信指正,謝謝支持! 查看全部

  文章采集調用(用python+selenuim自動(dòng)框架來(lái)爬取京東商品信息(不要))
  今天我們使用python+ selenium 自動(dòng)框架爬取京東商品信息(不要再問(wèn)我為什么是京東了,因為京東不用登錄也可以搜索商品),Selenium是用來(lái)模仿人類(lèi)操作的,免費的手,生產(chǎn)力提升,哈哈,這里是對selenuim的一點(diǎn)介紹。
  硒簡(jiǎn)介
  Selenium 是一個(gè) Web 應用程序測試工具,Selenium 測試直接在瀏覽器中運行,就像真正的用戶(hù)一樣。一般的爬蟲(chóng)方法是使用python腳本直接訪(fǎng)問(wèn)目標網(wǎng)站,并且只對目標數據執行采集,訪(fǎng)問(wèn)速度非???,這樣目標網(wǎng)站就可以輕松識別您這是機器人,它阻止了您。使用selenium寫(xiě)爬蟲(chóng),python腳本控制瀏覽器進(jìn)行訪(fǎng)問(wèn),也就是說(shuō)python腳本和目標網(wǎng)站之間多了一個(gè)瀏覽器操作,這個(gè)行為更像是人的行為,這么多難以爬取網(wǎng)站你也可以輕松抓取數據。
  準備
  首先安裝selenuim,方法和其他第三方庫的安裝方法一樣,使用pip命令
  點(diǎn)安裝硒
  安裝 selenuim 后,您必須安裝驅動(dòng)程序才能使其正常工作。因為我使用的是 Google Chrome,所以我下載了 Google Drive,當然還有 Firefox。下載對應瀏覽器版本的驅動(dòng)(如果沒(méi)有對應版本,也可以下載接近的版本)。以下是兩款驅動(dòng)的下載地址:
  - 谷歌云端硬盤(pán):(點(diǎn)擊下載)
  - 火狐驅動(dòng):(點(diǎn)擊下載)
  
  下載完成后,驅動(dòng)就安裝好了。Firefox驅動(dòng)的安裝方法與Chrome驅動(dòng)相同。把下載好的驅動(dòng)放到你的python安裝路徑下的Script目錄下即可(放到Script文件夾下即可,無(wú)需配置環(huán)境變量)
  
  至此,selenuim的相關(guān)安裝就完成了,接下來(lái)開(kāi)始我們今天的任務(wù)。
  1.導入相關(guān)依賴(lài)
  import time
import json
from pyquery import PyQuery as pq
#pyquery是個(gè)解析庫
from selenium import webdriver
#導入驅動(dòng)webdriver
from selenium.webdriver.common.by import By
#By是selenium中內置的一個(gè)class,在這個(gè)class中有各種方法來(lái)定位元素
from selenium.webdriver.support.ui import WebDriverWait
#設置瀏覽器驅動(dòng)休眠等待,避免頻繁操作封ip
from selenium.webdriver.support import expected_conditions as EC
#判斷一個(gè)元素是否存在,是否加載完畢等一系列的場(chǎng)景判斷方法
  二、使用selenium EC操作瀏覽器
  首先,用Chrome瀏覽器打開(kāi)產(chǎn)品首頁(yè)。我們很容易發(fā)現該網(wǎng)頁(yè)是一個(gè)動(dòng)態(tài)加載的網(wǎng)頁(yè)。首次打開(kāi)網(wǎng)頁(yè)時(shí),僅顯示 30 種產(chǎn)品的信息。只有當網(wǎng)頁(yè)被向下拖動(dòng)時(shí),它才會(huì )加載其余部分。30 項信息。這里我們可以使用selenium模擬瀏覽器拉下網(wǎng)頁(yè),判斷網(wǎng)頁(yè)元素是否通過(guò)EC加載,從而獲取所有產(chǎn)品網(wǎng)站的信息。
  def search():
browser.get('https://www.jd.com/')
try:
input = wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#key"))
) # 等待搜索框加載出來(lái)
submit = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, "#search > div > div.form > button"))
) # 等待搜索按鈕可以被點(diǎn)擊
input[0].send_keys(keyword) # 向搜索框內輸入關(guān)鍵詞
submit.click() # 點(diǎn)擊搜索
time.sleep(2) # 加入時(shí)間間隔,速度太快可能會(huì )抓不到數據
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 下拉到網(wǎng)頁(yè)底部
wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(60)"))
) # 等待最后一個(gè)商品信息加載完畢
html = browser.page_source
except TimeoutError:
search()
  三、使用selenium EC實(shí)現翻頁(yè)操作
  與第一頁(yè)類(lèi)似,它也使用EC來(lái)判斷頁(yè)面元素是否加載,并添加延遲以防止數據被抓到。
  def next_page(page_number):
try:
button = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_bottomPage > span.p-num > a.pn-next > em'))
) # 等待翻頁(yè)按鈕可以點(diǎn)擊
button.click() # 點(diǎn)擊翻頁(yè)按鈕
wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(30)"))
) # 等到30個(gè)商品都加載出來(lái)
time.sleep(2)
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)
wait.until(# 等到60個(gè)商品都加載出來(lái)
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(60)"))
)
html = browser.page_source
find_save(html) # 調用函數篩選數據
except TimeoutError:
return next_page(page_number)
  四、提取數據并保存
  這里使用pyquery庫解析網(wǎng)頁(yè)源代碼,使用CSS_SELECTOR選擇元素。一定要找到參考元素。例如,將鼠標放在搜索框中,右鍵查看,然后跳轉到搜索框中對應的代碼處。右鍵點(diǎn)擊它,點(diǎn)擊Copy > Copy selector,我們得到我們需要的#key,然后通過(guò).text()獲取內容,最后將python對象轉換成json數據寫(xiě)入json文件。
  def find_save(html):
doc = pq(html)
items = doc('#J_goodsList > ul > li').items()
for item in items:
product = {
'name': item('.p-name a').text(),
'price': item('.p-price i').text(),
'commit': item('.p-commit a').text()
}
data_list.append(product) # 寫(xiě)入全局變量
# 把全局變量轉化為json數據
content = json.dumps(data_list, ensure_ascii=False, indent=2)
with open("E:\python\project\selenium\info.json", "w", encoding="utf-8") as f:
f.write(content)
print("json文件寫(xiě)入成功")
  五、編寫(xiě)和調用main函數
  使用for循環(huán)控制爬取的頁(yè)面數并添加延遲
  def main():
print("第", 1, "頁(yè):")
search()
for i in range(2, 6): # 爬取2-5頁(yè)
time.sleep(2) # 設置延遲
print("第", i, "頁(yè):")
next_page(i)
if __name__ == "__main__":
main()
  補充:
  為了提高爬蟲(chóng)的效率,可以將瀏覽器設置為無(wú)圖片模式,即不加載圖片,這樣可以提高采集的速度
  options = webdriver.ChromeOptions()
options.add_experimental_option('prefs'{'profile.managed_default_content_settings.images': 2})
browser = webdriver.Chrome(options=options)
  看看結果:
  
  
  附上完整代碼:
  import time
import json
from pyquery import PyQuery as pq
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
# 不加載圖片
options = webdriver.ChromeOptions()
options.add_experimental_option('prefs', {'profile.managed_default_content_settings.images': 2})
browser = webdriver.Chrome(options=options)
wait = WebDriverWait(browser, 20) # 設置等待時(shí)間
data_list = [] # 設置全局變量用來(lái)存儲數據
keyword = "平凡的世界" # 商品名稱(chēng)
def search():
browser.get('https://www.jd.com/')
try:
input = wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#key"))
) # 等待搜索框加載出來(lái)
submit = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, "#search > div > div.form > button"))
) # 等待搜索按鈕可以被點(diǎn)擊
input[0].send_keys(keyword) # 向搜索框內輸入關(guān)鍵詞
submit.click() # 點(diǎn)擊搜索
time.sleep(2) # 加入時(shí)間間隔,速度太快可能會(huì )抓不到數據
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 滑動(dòng)到底部
wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(60)"))
) # 等待最后一個(gè)商品信息加載完畢
html = browser.page_source
find_save(html) # 調用函數篩選數據
except TimeoutError:
search()
def next_page(page_number):
try:
button = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_bottomPage > span.p-num > a.pn-next > em'))
) # 等待翻頁(yè)按鈕可以點(diǎn)擊
button.click() # 點(diǎn)擊翻頁(yè)按鈕
wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(30)"))
) # 等到30個(gè)商品都加載出來(lái)
time.sleep(2)
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)
wait.until(# 等到60個(gè)商品都加載出來(lái)
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(60)"))
)
html = browser.page_source
find_save(html) # 調用函數篩選數據
except TimeoutError:
return next_page(page_number)
def find_save(html):
doc = pq(html)
items = doc('#J_goodsList > ul > li').items()
# print(items)
for item in items:
product = {
'name': item('.p-name a').text(),
'price': item('.p-price i').text(),
'commit': item('.p-commit a').text()
}
data_list.append(product) # 寫(xiě)入全局變量
# 把全局變量轉化為json數據
content = json.dumps(data_list, ensure_ascii=False, indent=2)
with open("E:\python\project\selenium\info.json", "w", encoding="utf-8") as f:
f.write(content)
print("json文件寫(xiě)入成功")
def main():
print("第", 1, "頁(yè):")
search()
for i in range(2, 6): # 爬取2-5頁(yè)
time.sleep(2) # 設置延遲
print("第", i, "頁(yè):")
next_page(i)
if __name__ == "__main__":
main()
  如有錯誤,請私信指正,謝謝支持!

文章采集調用(小蜜蜂公眾號文章助手上線(xiàn),復制文字還沒(méi)有什么?)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 166 次瀏覽 ? 2022-02-21 23:27 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(小蜜蜂公眾號文章助手上線(xiàn),復制文字還沒(méi)有什么?)
  現在小蜜蜂公眾號文章助手上線(xiàn),可以采集任意公眾號歷史文章,支持點(diǎn)贊數、閱讀數、評論數采集,支持導出PDF ,Excel,HTML,TXT格式導出,支持關(guān)鍵詞搜索,可以去官網(wǎng)查看
  許多微信公眾號作者(個(gè)人、組織、公司)不僅在微信公眾平臺上寫(xiě)作,而且通常文章在多個(gè)平臺上推送,例如今日頭條、知乎專(zhuān)欄、短書(shū)等,甚至有自己的網(wǎng)站(官網(wǎng)),但是在多個(gè)平臺上發(fā)布文章是一項非常耗時(shí)的工作。
  大多數 網(wǎng)站 構建都基于 WordPress,因為該平臺非常簡(jiǎn)單實(shí)用,并且有大量插件。因此,我也不例外。當我選擇建站系統時(shí),首先選擇的是 WordPress。不過(guò)我經(jīng)常寫(xiě)文章發(fā)現一個(gè)問(wèn)題,就是每次在公眾號寫(xiě)文章,我把文章@文章手動(dòng)復制到WordPress上,復制文字沒(méi)什么,但復制圖片會(huì )殺了我。微信公眾號文章的圖片不能直接復制到WordPress,會(huì )顯示為“無(wú)法顯示。這張圖片”,因為微信對圖片做了防盜鏈措施。
  這時(shí)候嘗試搜索了一個(gè)這樣的插件,可以通過(guò)粘貼公眾號文章的鏈接直接將內容導入WordPress,并將圖片下載到本地(媒體庫),于是開(kāi)發(fā)了一個(gè)插件名為Bee采集,除了微信公眾號文章,還可以導入今日頭條、短書(shū)、知乎欄目的文章,以及有多種可選功能,除此之外,還可以采集other網(wǎng)站,只要配置好相應的規則即可
  
  使用也很簡(jiǎn)單,粘貼鏈接即可,可以同時(shí)導入多個(gè)文章,即批量導入功能,自動(dòng)同步采集公眾號功能文章
  下載的話(huà)直接在安裝插件頁(yè)面搜索蜜蜂采集就可以看到
  
  希望這篇筆記可以幫到你 查看全部

  文章采集調用(小蜜蜂公眾號文章助手上線(xiàn),復制文字還沒(méi)有什么?)
  現在小蜜蜂公眾號文章助手上線(xiàn),可以采集任意公眾號歷史文章,支持點(diǎn)贊數、閱讀數、評論數采集,支持導出PDF ,Excel,HTML,TXT格式導出,支持關(guān)鍵詞搜索,可以去官網(wǎng)查看
  許多微信公眾號作者(個(gè)人、組織、公司)不僅在微信公眾平臺上寫(xiě)作,而且通常文章在多個(gè)平臺上推送,例如今日頭條、知乎專(zhuān)欄、短書(shū)等,甚至有自己的網(wǎng)站(官網(wǎng)),但是在多個(gè)平臺上發(fā)布文章是一項非常耗時(shí)的工作。
  大多數 網(wǎng)站 構建都基于 WordPress,因為該平臺非常簡(jiǎn)單實(shí)用,并且有大量插件。因此,我也不例外。當我選擇建站系統時(shí),首先選擇的是 WordPress。不過(guò)我經(jīng)常寫(xiě)文章發(fā)現一個(gè)問(wèn)題,就是每次在公眾號寫(xiě)文章,我把文章@文章手動(dòng)復制到WordPress上,復制文字沒(méi)什么,但復制圖片會(huì )殺了我。微信公眾號文章的圖片不能直接復制到WordPress,會(huì )顯示為“無(wú)法顯示。這張圖片”,因為微信對圖片做了防盜鏈措施。
  這時(shí)候嘗試搜索了一個(gè)這樣的插件,可以通過(guò)粘貼公眾號文章的鏈接直接將內容導入WordPress,并將圖片下載到本地(媒體庫),于是開(kāi)發(fā)了一個(gè)插件名為Bee采集,除了微信公眾號文章,還可以導入今日頭條、短書(shū)、知乎欄目的文章,以及有多種可選功能,除此之外,還可以采集other網(wǎng)站,只要配置好相應的規則即可
  
  使用也很簡(jiǎn)單,粘貼鏈接即可,可以同時(shí)導入多個(gè)文章,即批量導入功能,自動(dòng)同步采集公眾號功能文章
  下載的話(huà)直接在安裝插件頁(yè)面搜索蜜蜂采集就可以看到
  
  希望這篇筆記可以幫到你

文章采集調用(結構圖代理中增強類(lèi)Enhancer應該是核心配置功能類(lèi)的)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 147 次瀏覽 ? 2022-02-21 23:25 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(結構圖代理中增強類(lèi)Enhancer應該是核心配置功能類(lèi)的)
  背景
  通過(guò)開(kāi)發(fā)插件包采集部門(mén)內的trace的鏈接信息,包括RPC mock工具。采集的調用鏈如下所示:
  1589802250554|0b51063f15898022505134582ec1dc|RPC|com.service.bindReadService#getBindModelByUserId|[2988166812]|{"@type":"com.service.models.ResultVOModel","succeed":true,"valueObject":{"@type":"com.service.models.bind1688Model","accountNo":"2088422864957283","accountType":3,"bindFrom":"activeAccount","enable":true,"enableStatus":1,"memberId":"b2b-2988166812dc3ef","modifyDate":1509332355000,"userId":2988166812}}|2|0.1.1.4.4|11.181.112.68|C:membercenterhost|DPathBaseEnv|N||
  不僅會(huì )打印trace,還會(huì )打印輸入輸出參數、目標IP和源IP??梢钥吹竭€是很清晰的,大大提高了我們聯(lián)查排查的效率。
  但是,隨著(zhù)產(chǎn)品的不斷迭代,jar的形式還是存在不少問(wèn)題。首先,接入成本高,版本不穩定,導致快速升級。相應的服務(wù)必須不斷升級。相信大家都經(jīng)歷過(guò)升級fastjson的陣痛。另外,由于多版本兼容,數據不能一致,處理起來(lái)很麻煩。為此,您唯一能想到的就是對相應的集合和模擬進(jìn)行代理增強操作。
  結構圖
  代理中的增強類(lèi)Enhancer應該是核心配置功能類(lèi)。通過(guò)繼承或者SPI擴展,我們可以實(shí)現不同增強點(diǎn)的配置。
  
  相關(guān)代碼
  BootStrapAgent 入口類(lèi):
  /** * @author wanghao * @date 2020/5/6 */public class BootStrapAgent { public static void main(String[] args) { System.out.println("====main 方法執行"); } public static void premain(String agentArgs, Instrumentation inst) { System.out.println("====premain 方法執行"); new BootInitializer(inst, true).init(); } public static void agentmain(String agentOps, Instrumentation inst) { System.out.println("====agentmain 方法執行"); new BootInitializer(inst, false).init(); }}
  agent的入口類(lèi),premain支持的agent掛載方式,agentmain支持的attach api方式,agent方式需要指定-javaagent參數,項目中的docker文件需要配置。attach api的使用方法。BootInitializer 主要代碼:
  public class BootInitializer { public BootInitializer(Instrumentation instrumentation, boolean isPreAgent) { this.instrumentation = instrumentation; this.isPreAgent = isPreAgent; } public void init() { this.instrumentation.addTransformer(new EnhanceClassTransfer(), true); if (!isPreAgent) { try { // TODO 此處暫硬編碼,后續修改 this.instrumentation.retransformClasses(Class.forName("com.abb.ReflectInvocationHandler")); } catch (UnmodifiableClassException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }}
  這里需要注意的一點(diǎn)是addTransformer中的參數canRetransform需要設置為true,表示可以重新轉換表名,否則即使調用retransformClasses方法也無(wú)法重新定義指定的類(lèi)。需要注意的是,新加載的類(lèi)不能修改舊的類(lèi)聲明,例如添加屬性和修改方法聲明。EnhanceClassTransfer 主要代碼:
  @Overridepublic byte[] transform(ClassLoader loader, String className, Class> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { if (className == null) { return null; } String name = className.replace("/", "."); byte[] bytes = enhanceEngine.getEnhancedByteByClassName(name, classfileBuffer, loader); return bytes;}
  EnhanceClassTransfer 做的很簡(jiǎn)單,直接調用 EnhanceEngine 生成字節碼 EnhanceEngine 主代碼:
  private static Map enhancerMap = new ConcurrentHashMap();public byte[] getEnhancedByteByClassName(String className, byte[] bytes, ClassLoader classLoader, Enhancer enhancerProvide) { byte[] classBytes = bytes; boolean isNeedEnhance = false; Enhancer enhancer = null; // 兩次enhancer匹配校驗 // 具體類(lèi)名匹配 enhancer = enhancerMap.get(className); if (enhancer != null) { isNeedEnhance = true; } // 類(lèi)名正則匹配 if (!isNeedEnhance) { for (Enhancer classNamePtnEnhancer : classNamePtnEnhancers) { if (classNamePtnEnhancer.isClassMatch(className)) { enhancer = classNamePtnEnhancer; break; } } } if (enhancer != null) { System.out.println(enhancer.getClassName()); MethodAopContext methodAopContext = GlobalAopContext.buildMethodAopContext(enhancer.getClassName(), enhancer.getInvocationInterceptor() ,classLoader, enhancer.getMethodFilter()); try { classBytes = ClassProxyUtil.buildInjectByteCodeByJavaAssist(methodAopContext, bytes); } catch (Exception e) { e.printStackTrace(); } } return classBytes; }
  類(lèi)名匹配在這里進(jìn)行了兩次。增強器映射保存了需要增強的類(lèi)名與增強的擴展類(lèi)的關(guān)系。Enhancer中的變量很簡(jiǎn)單,如下:
  private String className;private Pattern classNamePattern;private Pattern methodPattern;private InvocationInterceptor invocationInterceptor;
  只有匹配到對應的增強器后,才會(huì )進(jìn)行增強處理,比如后面提到的DubboProviderEnhancer。
  字節碼操作工具
  目前主流的字節碼操作工具包括以下asmJavaassistbytebuddy
  三個(gè)文章的比較有很多,大家可以自己搜索看看。
  目前asm的使用門(mén)檻最高,調試的門(mén)檻也很高。Idea有一個(gè)非常強大的插件ASM Bytecode Outline。它可以根據當前的java類(lèi)生成相應的asm指令。效果圖如下:
  
  但是,使用 asm 還是需要開(kāi)發(fā)者對字節碼指令、局部變量表、操作樹(shù)棧有很好的理解,才能寫(xiě)好相關(guān)的代碼。
  bytebuddy 完全以鏈式編程的方式構建了一套用于方法切面編織的字節碼操作。從編碼的角度來(lái)看,它是比較簡(jiǎn)單的。目前,bytebuddy的代理操作已經(jīng)很完善了。它是根據類(lèi)名和方法名過(guò)濾的。提供了一套鏈式操作,如果業(yè)務(wù)邏輯不復雜,推薦使用。
  代理實(shí)現
  代理類(lèi)的實(shí)現大家一定不會(huì )陌生。我們有許多代理類(lèi)的入口點(diǎn)。我們可以在方法的before、after、afterReturn、afterThrowing等進(jìn)行相應的操作。當然,所有這些都可以通過(guò)模板來(lái)實(shí)現。這里我稍微簡(jiǎn)化一下,整體實(shí)現代理類(lèi)的增強操作。類(lèi)似于java動(dòng)態(tài)代理,大家都知道實(shí)現java動(dòng)態(tài)代理必須實(shí)現的類(lèi)InvocationHandler,改寫(xiě)方法:
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
  大致思路是比較動(dòng)態(tài)代理的方式,封裝需要代理的類(lèi),將類(lèi)類(lèi)型、入參和對象帶入代理方法,重寫(xiě)需要增強的方法,將重寫(xiě)前的方法作為基類(lèi)和修改方法名,這里分兩步操作。
  1.重寫(xiě)之前的方法
  2.添加新方法并復制之前的方法體
  需要注意的是這里沒(méi)有違反retransformClasses的規則,沒(méi)有添加屬性,也沒(méi)有修改方法聲明
  RPC中間件相關(guān)類(lèi)的增強實(shí)現效果如下:
  代碼顯示如下:
<p>public static byte[] buildInjectByteCodeByJavaAssist(MethodAopContext methodAopContext, byte[] classBytes) throws Exception { CtClass ctclass = null; try { ClassPool classPool = new ClassPool(); // 使用加載該類(lèi)的classLoader進(jìn)行classPool的構造,而不能使用ClassPool.getDefault()的方式 classPool.appendClassPath(new LoaderClassPath(methodAopContext.getLoader())); ctclass = classPool.get(methodAopContext.getClassName()); CtMethod[] declaredMethods = ctclass.getDeclaredMethods(); for (CtMethod method : declaredMethods) { String methodName = method.getName(); if (methodAopContext.matchs(methodName)) { System.out.println("methodName:" + methodName); String outputStr = "System.out.println("this method " + methodName + " cost:" +(endTime - startTime) +"ms.");"; // 定義新方法名,修改原名 String oldMethodName = methodName + "$old"; // 將原來(lái)的方法名字修改 method.setName(oldMethodName); // 創(chuàng )建新的方法,復制原來(lái)的方法,名字為原來(lái)的名字 CtMethod newMethod = CtNewMethod.copy(method, methodName, ctclass, null); int modifiers = newMethod.getModifiers(); String type = newMethod.getReturnType().getName(); CtClass[] parameterJaTypes = newMethod.getParameterTypes(); // 獲取參數 Class>[] parameterTypes = new Class[parameterJaTypes.length]; for (int var1 = 0; var1 查看全部

  文章采集調用(結構圖代理中增強類(lèi)Enhancer應該是核心配置功能類(lèi)的)
  背景
  通過(guò)開(kāi)發(fā)插件包采集部門(mén)內的trace的鏈接信息,包括RPC mock工具。采集的調用鏈如下所示:
  1589802250554|0b51063f15898022505134582ec1dc|RPC|com.service.bindReadService#getBindModelByUserId|[2988166812]|{"@type":"com.service.models.ResultVOModel","succeed":true,"valueObject":{"@type":"com.service.models.bind1688Model","accountNo":"2088422864957283","accountType":3,"bindFrom":"activeAccount","enable":true,"enableStatus":1,"memberId":"b2b-2988166812dc3ef","modifyDate":1509332355000,"userId":2988166812}}|2|0.1.1.4.4|11.181.112.68|C:membercenterhost|DPathBaseEnv|N||
  不僅會(huì )打印trace,還會(huì )打印輸入輸出參數、目標IP和源IP??梢钥吹竭€是很清晰的,大大提高了我們聯(lián)查排查的效率。
  但是,隨著(zhù)產(chǎn)品的不斷迭代,jar的形式還是存在不少問(wèn)題。首先,接入成本高,版本不穩定,導致快速升級。相應的服務(wù)必須不斷升級。相信大家都經(jīng)歷過(guò)升級fastjson的陣痛。另外,由于多版本兼容,數據不能一致,處理起來(lái)很麻煩。為此,您唯一能想到的就是對相應的集合和模擬進(jìn)行代理增強操作。
  結構圖
  代理中的增強類(lèi)Enhancer應該是核心配置功能類(lèi)。通過(guò)繼承或者SPI擴展,我們可以實(shí)現不同增強點(diǎn)的配置。
  
  相關(guān)代碼
  BootStrapAgent 入口類(lèi):
  /** * @author wanghao * @date 2020/5/6 */public class BootStrapAgent { public static void main(String[] args) { System.out.println("====main 方法執行"); } public static void premain(String agentArgs, Instrumentation inst) { System.out.println("====premain 方法執行"); new BootInitializer(inst, true).init(); } public static void agentmain(String agentOps, Instrumentation inst) { System.out.println("====agentmain 方法執行"); new BootInitializer(inst, false).init(); }}
  agent的入口類(lèi),premain支持的agent掛載方式,agentmain支持的attach api方式,agent方式需要指定-javaagent參數,項目中的docker文件需要配置。attach api的使用方法。BootInitializer 主要代碼:
  public class BootInitializer { public BootInitializer(Instrumentation instrumentation, boolean isPreAgent) { this.instrumentation = instrumentation; this.isPreAgent = isPreAgent; } public void init() { this.instrumentation.addTransformer(new EnhanceClassTransfer(), true); if (!isPreAgent) { try { // TODO 此處暫硬編碼,后續修改 this.instrumentation.retransformClasses(Class.forName("com.abb.ReflectInvocationHandler")); } catch (UnmodifiableClassException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }}
  這里需要注意的一點(diǎn)是addTransformer中的參數canRetransform需要設置為true,表示可以重新轉換表名,否則即使調用retransformClasses方法也無(wú)法重新定義指定的類(lèi)。需要注意的是,新加載的類(lèi)不能修改舊的類(lèi)聲明,例如添加屬性和修改方法聲明。EnhanceClassTransfer 主要代碼:
  @Overridepublic byte[] transform(ClassLoader loader, String className, Class> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { if (className == null) { return null; } String name = className.replace("/", "."); byte[] bytes = enhanceEngine.getEnhancedByteByClassName(name, classfileBuffer, loader); return bytes;}
  EnhanceClassTransfer 做的很簡(jiǎn)單,直接調用 EnhanceEngine 生成字節碼 EnhanceEngine 主代碼:
  private static Map enhancerMap = new ConcurrentHashMap();public byte[] getEnhancedByteByClassName(String className, byte[] bytes, ClassLoader classLoader, Enhancer enhancerProvide) { byte[] classBytes = bytes; boolean isNeedEnhance = false; Enhancer enhancer = null; // 兩次enhancer匹配校驗 // 具體類(lèi)名匹配 enhancer = enhancerMap.get(className); if (enhancer != null) { isNeedEnhance = true; } // 類(lèi)名正則匹配 if (!isNeedEnhance) { for (Enhancer classNamePtnEnhancer : classNamePtnEnhancers) { if (classNamePtnEnhancer.isClassMatch(className)) { enhancer = classNamePtnEnhancer; break; } } } if (enhancer != null) { System.out.println(enhancer.getClassName()); MethodAopContext methodAopContext = GlobalAopContext.buildMethodAopContext(enhancer.getClassName(), enhancer.getInvocationInterceptor() ,classLoader, enhancer.getMethodFilter()); try { classBytes = ClassProxyUtil.buildInjectByteCodeByJavaAssist(methodAopContext, bytes); } catch (Exception e) { e.printStackTrace(); } } return classBytes; }
  類(lèi)名匹配在這里進(jìn)行了兩次。增強器映射保存了需要增強的類(lèi)名與增強的擴展類(lèi)的關(guān)系。Enhancer中的變量很簡(jiǎn)單,如下:
  private String className;private Pattern classNamePattern;private Pattern methodPattern;private InvocationInterceptor invocationInterceptor;
  只有匹配到對應的增強器后,才會(huì )進(jìn)行增強處理,比如后面提到的DubboProviderEnhancer。
  字節碼操作工具
  目前主流的字節碼操作工具包括以下asmJavaassistbytebuddy
  三個(gè)文章的比較有很多,大家可以自己搜索看看。
  目前asm的使用門(mén)檻最高,調試的門(mén)檻也很高。Idea有一個(gè)非常強大的插件ASM Bytecode Outline。它可以根據當前的java類(lèi)生成相應的asm指令。效果圖如下:
  
  但是,使用 asm 還是需要開(kāi)發(fā)者對字節碼指令、局部變量表、操作樹(shù)棧有很好的理解,才能寫(xiě)好相關(guān)的代碼。
  bytebuddy 完全以鏈式編程的方式構建了一套用于方法切面編織的字節碼操作。從編碼的角度來(lái)看,它是比較簡(jiǎn)單的。目前,bytebuddy的代理操作已經(jīng)很完善了。它是根據類(lèi)名和方法名過(guò)濾的。提供了一套鏈式操作,如果業(yè)務(wù)邏輯不復雜,推薦使用。
  代理實(shí)現
  代理類(lèi)的實(shí)現大家一定不會(huì )陌生。我們有許多代理類(lèi)的入口點(diǎn)。我們可以在方法的before、after、afterReturn、afterThrowing等進(jìn)行相應的操作。當然,所有這些都可以通過(guò)模板來(lái)實(shí)現。這里我稍微簡(jiǎn)化一下,整體實(shí)現代理類(lèi)的增強操作。類(lèi)似于java動(dòng)態(tài)代理,大家都知道實(shí)現java動(dòng)態(tài)代理必須實(shí)現的類(lèi)InvocationHandler,改寫(xiě)方法:
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
  大致思路是比較動(dòng)態(tài)代理的方式,封裝需要代理的類(lèi),將類(lèi)類(lèi)型、入參和對象帶入代理方法,重寫(xiě)需要增強的方法,將重寫(xiě)前的方法作為基類(lèi)和修改方法名,這里分兩步操作。
  1.重寫(xiě)之前的方法
  2.添加新方法并復制之前的方法體
  需要注意的是這里沒(méi)有違反retransformClasses的規則,沒(méi)有添加屬性,也沒(méi)有修改方法聲明
  RPC中間件相關(guān)類(lèi)的增強實(shí)現效果如下:
  代碼顯示如下:
<p>public static byte[] buildInjectByteCodeByJavaAssist(MethodAopContext methodAopContext, byte[] classBytes) throws Exception { CtClass ctclass = null; try { ClassPool classPool = new ClassPool(); // 使用加載該類(lèi)的classLoader進(jìn)行classPool的構造,而不能使用ClassPool.getDefault()的方式 classPool.appendClassPath(new LoaderClassPath(methodAopContext.getLoader())); ctclass = classPool.get(methodAopContext.getClassName()); CtMethod[] declaredMethods = ctclass.getDeclaredMethods(); for (CtMethod method : declaredMethods) { String methodName = method.getName(); if (methodAopContext.matchs(methodName)) { System.out.println("methodName:" + methodName); String outputStr = "System.out.println("this method " + methodName + " cost:" +(endTime - startTime) +"ms.");"; // 定義新方法名,修改原名 String oldMethodName = methodName + "$old"; // 將原來(lái)的方法名字修改 method.setName(oldMethodName); // 創(chuàng )建新的方法,復制原來(lái)的方法,名字為原來(lái)的名字 CtMethod newMethod = CtNewMethod.copy(method, methodName, ctclass, null); int modifiers = newMethod.getModifiers(); String type = newMethod.getReturnType().getName(); CtClass[] parameterJaTypes = newMethod.getParameterTypes(); // 獲取參數 Class>[] parameterTypes = new Class[parameterJaTypes.length]; for (int var1 = 0; var1

文章采集調用(文章采集調用excel,簡(jiǎn)單,基本就是:1.2)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 122 次瀏覽 ? 2022-02-21 16:02 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(文章采集調用excel,簡(jiǎn)單,基本就是:1.2)
  文章采集調用excel,簡(jiǎn)單,基本就是:1采集工作表中的圖片文字2導出為圖片或者其他類(lèi)型的數據3整理,導出.至于怎么實(shí)現?下載個(gè)rvest就行.
  通過(guò)excel采集電子表格中的內容并直接保存為excel格式
  謝邀目前我還不會(huì )看我看最近會(huì )不會(huì )有類(lèi)似的爬蟲(chóng)項目
  爬蟲(chóng)技術(shù)應該沒(méi)有要求吧?不會(huì )下載rvest嗎?windows直接用filezilla瀏覽器(safari也行)直接登錄就可以了,
  1.excel2.txt+list3.爬蟲(chóng)順便這個(gè)業(yè)余的,
  騰訊xx地圖,
  你可以爬,爬完了批量導出,做個(gè)爬蟲(chóng)app,
  還好我讀書(shū)少,大概覺(jué)得是excel。
  txt
  各大衛視所有電視臺的視頻圖片。
  提取圖片上的文字識別關(guān)鍵詞提取聯(lián)系方式。
  rvest,jieba,sunset_login,ggplot2+lattice基本算是比較精確又簡(jiǎn)單的還要更精確可以借助relaxmat
  respin的代碼
  xlcrollback
  必須是lllllllllllll
  題主都沒(méi)有細化要求,
  vba進(jìn)程中打開(kāi)lllllllllllllw才能完整下載
  當然是我們電視臺??!發(fā)生在湖南某電視臺一個(gè)月,男女老少通吃的驚天大節目,用的工具是啥不知道,具體代碼私信問(wèn)我,懶得碼一大堆。 查看全部

  文章采集調用(文章采集調用excel,簡(jiǎn)單,基本就是:1.2)
  文章采集調用excel,簡(jiǎn)單,基本就是:1采集工作表中的圖片文字2導出為圖片或者其他類(lèi)型的數據3整理,導出.至于怎么實(shí)現?下載個(gè)rvest就行.
  通過(guò)excel采集電子表格中的內容并直接保存為excel格式
  謝邀目前我還不會(huì )看我看最近會(huì )不會(huì )有類(lèi)似的爬蟲(chóng)項目
  爬蟲(chóng)技術(shù)應該沒(méi)有要求吧?不會(huì )下載rvest嗎?windows直接用filezilla瀏覽器(safari也行)直接登錄就可以了,
  1.excel2.txt+list3.爬蟲(chóng)順便這個(gè)業(yè)余的,
  騰訊xx地圖,
  你可以爬,爬完了批量導出,做個(gè)爬蟲(chóng)app,
  還好我讀書(shū)少,大概覺(jué)得是excel。
  txt
  各大衛視所有電視臺的視頻圖片。
  提取圖片上的文字識別關(guān)鍵詞提取聯(lián)系方式。
  rvest,jieba,sunset_login,ggplot2+lattice基本算是比較精確又簡(jiǎn)單的還要更精確可以借助relaxmat
  respin的代碼
  xlcrollback
  必須是lllllllllllll
  題主都沒(méi)有細化要求,
  vba進(jìn)程中打開(kāi)lllllllllllllw才能完整下載
  當然是我們電視臺??!發(fā)生在湖南某電視臺一個(gè)月,男女老少通吃的驚天大節目,用的工具是啥不知道,具體代碼私信問(wèn)我,懶得碼一大堆。

文章采集調用(【干貨】文章采集調用webframework,的處理流程(二))

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 115 次瀏覽 ? 2022-02-20 21:02 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(【干貨】文章采集調用webframework,的處理流程(二))
  文章采集調用webframework,一般都有framework相關(guān)的配置頁(yè)面,
  我們在拿到數據之后,需要先做處理,大致的處理流程如下:獲取對應的sql數據1。將數據存入freesoftwareresources庫2。調用framework相關(guān)的函數來(lái)處理數據cache數據1。寫(xiě)文件,查詢(xún)文件2。寫(xiě)文件加載到存儲池1。遍歷加載器freesoftwareresources庫2。遍歷已經(jīng)加載到存儲池的數據3。讀取文件(對于apollo是直接對數據進(jìn)行分析,對于js來(lái)說(shuō)是解析)。
  文件放在linux的/etc/freebsd下
  文件系統文件夾里~.
  對于文本文件的處理,可以使用thread,并發(fā)處理文件。
  標準是,在單節點(diǎn)環(huán)境下,1,如果兩個(gè)guest同在一個(gè)freebsd集群中,使用nodelocal,2,如果第一個(gè)節點(diǎn)集群關(guān)閉,會(huì )走guest的mapjoin互相peer3,若多個(gè)節點(diǎn)同在一個(gè)freebsd集群中,那么guest之間peer互相轉。因為節點(diǎn)cluster是獨立的。
  一個(gè)freebsd進(jìn)程內共享一個(gè)文件系統。在該文件系統上,webid登記了兩種操作,具體也可以類(lèi)比為java中的session,從guest(創(chuàng )建)到guestparent(usercreate)到guestuser(usercreate)的user操作。有兩種策略可以實(shí)現同一臺設備內的peer互相轉發(fā):每一個(gè)freebsd進(jìn)程都將本機上共享的文件共享給自己。
  用來(lái)保證這種共享互相轉發(fā)的可行性:可以實(shí)現guest對于本機來(lái)說(shuō)都是存在的,所以freebsd集群內不必存在guest對本機共享的文件?;蛘哌x擇利用userprotocolswitch。開(kāi)端點(diǎn),停止點(diǎn),主機復制。你可以研究下nodelocalwebprotocolpaths的實(shí)現,能很好地解決這個(gè)問(wèn)題。
  tls也是基于userprotocol。usermap到文件/path分布中,usermap到文件/fsuserprotocol主要處理的問(wèn)題是文件/fs開(kāi)端點(diǎn)到userprotocolswitch連接,這個(gè)都可以通過(guò)protocolentryvesting做到。 查看全部

  文章采集調用(【干貨】文章采集調用webframework,的處理流程(二))
  文章采集調用webframework,一般都有framework相關(guān)的配置頁(yè)面,
  我們在拿到數據之后,需要先做處理,大致的處理流程如下:獲取對應的sql數據1。將數據存入freesoftwareresources庫2。調用framework相關(guān)的函數來(lái)處理數據cache數據1。寫(xiě)文件,查詢(xún)文件2。寫(xiě)文件加載到存儲池1。遍歷加載器freesoftwareresources庫2。遍歷已經(jīng)加載到存儲池的數據3。讀取文件(對于apollo是直接對數據進(jìn)行分析,對于js來(lái)說(shuō)是解析)。
  文件放在linux的/etc/freebsd下
  文件系統文件夾里~.
  對于文本文件的處理,可以使用thread,并發(fā)處理文件。
  標準是,在單節點(diǎn)環(huán)境下,1,如果兩個(gè)guest同在一個(gè)freebsd集群中,使用nodelocal,2,如果第一個(gè)節點(diǎn)集群關(guān)閉,會(huì )走guest的mapjoin互相peer3,若多個(gè)節點(diǎn)同在一個(gè)freebsd集群中,那么guest之間peer互相轉。因為節點(diǎn)cluster是獨立的。
  一個(gè)freebsd進(jìn)程內共享一個(gè)文件系統。在該文件系統上,webid登記了兩種操作,具體也可以類(lèi)比為java中的session,從guest(創(chuàng )建)到guestparent(usercreate)到guestuser(usercreate)的user操作。有兩種策略可以實(shí)現同一臺設備內的peer互相轉發(fā):每一個(gè)freebsd進(jìn)程都將本機上共享的文件共享給自己。
  用來(lái)保證這種共享互相轉發(fā)的可行性:可以實(shí)現guest對于本機來(lái)說(shuō)都是存在的,所以freebsd集群內不必存在guest對本機共享的文件?;蛘哌x擇利用userprotocolswitch。開(kāi)端點(diǎn),停止點(diǎn),主機復制。你可以研究下nodelocalwebprotocolpaths的實(shí)現,能很好地解決這個(gè)問(wèn)題。
  tls也是基于userprotocol。usermap到文件/path分布中,usermap到文件/fsuserprotocol主要處理的問(wèn)題是文件/fs開(kāi)端點(diǎn)到userprotocolswitch連接,這個(gè)都可以通過(guò)protocolentryvesting做到。

文章采集調用(小蜜蜂公眾號文章助手上線(xiàn),復制文字還沒(méi)有什么?)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 157 次瀏覽 ? 2022-02-17 11:16 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(小蜜蜂公眾號文章助手上線(xiàn),復制文字還沒(méi)有什么?)
  現在小蜜蜂公眾號文章助手上線(xiàn),可以采集任意公眾號歷史文章,支持點(diǎn)贊數、閱讀數、評論數采集,支持導出PDF ,Excel,HTML,TXT格式導出,支持關(guān)鍵詞搜索,可以去官網(wǎng)查看
  許多微信公眾號作者(個(gè)人、組織、公司)不僅在微信公眾平臺上寫(xiě)作,而且通常文章在多個(gè)平臺上推送,例如今日頭條、知乎專(zhuān)欄、短書(shū)等,甚至有自己的網(wǎng)站(官網(wǎng)),但是在多個(gè)平臺上發(fā)布文章是一項非常耗時(shí)的工作。
  大多數 網(wǎng)站 構建都基于 WordPress,因為該平臺非常簡(jiǎn)單實(shí)用,并且有大量插件。因此,我也不例外。當我選擇建站系統時(shí),首先選擇的是 WordPress。不過(guò)我經(jīng)常寫(xiě)文章發(fā)現一個(gè)問(wèn)題,就是每次在公眾號寫(xiě)文章,我把文章@文章手動(dòng)復制到WordPress上,復制文字沒(méi)什么,但復制圖片會(huì )殺了我。微信公眾號文章的圖片不能直接復制到WordPress,會(huì )顯示為“無(wú)法顯示。這張圖片”,因為微信對圖片做了防盜鏈措施。
  這時(shí)候嘗試搜索了這樣一個(gè)插件,可以通過(guò)粘貼公眾號文章的鏈接直接將內容導入WordPress,并將圖片下載到本地(媒體庫),于是我開(kāi)發(fā)了一個(gè)叫Bee采集的插件,除了微信公眾號文章,還可以導入今日頭條、短書(shū)、知乎欄目的文章,并且還有各種多種可選功能,除此之外,還可以采集other網(wǎng)站,只要配置好相應的規則即可
  
  使用也很簡(jiǎn)單,粘貼鏈接即可,可以同時(shí)導入多個(gè)文章,即批量導入功能,自動(dòng)同步采集公眾號功能文章
  下載的話(huà)直接在安裝插件頁(yè)面搜索蜜蜂采集就可以看到
  
  希望這篇筆記可以幫到你 查看全部

  文章采集調用(小蜜蜂公眾號文章助手上線(xiàn),復制文字還沒(méi)有什么?)
  現在小蜜蜂公眾號文章助手上線(xiàn),可以采集任意公眾號歷史文章,支持點(diǎn)贊數、閱讀數、評論數采集,支持導出PDF ,Excel,HTML,TXT格式導出,支持關(guān)鍵詞搜索,可以去官網(wǎng)查看
  許多微信公眾號作者(個(gè)人、組織、公司)不僅在微信公眾平臺上寫(xiě)作,而且通常文章在多個(gè)平臺上推送,例如今日頭條、知乎專(zhuān)欄、短書(shū)等,甚至有自己的網(wǎng)站(官網(wǎng)),但是在多個(gè)平臺上發(fā)布文章是一項非常耗時(shí)的工作。
  大多數 網(wǎng)站 構建都基于 WordPress,因為該平臺非常簡(jiǎn)單實(shí)用,并且有大量插件。因此,我也不例外。當我選擇建站系統時(shí),首先選擇的是 WordPress。不過(guò)我經(jīng)常寫(xiě)文章發(fā)現一個(gè)問(wèn)題,就是每次在公眾號寫(xiě)文章,我把文章@文章手動(dòng)復制到WordPress上,復制文字沒(méi)什么,但復制圖片會(huì )殺了我。微信公眾號文章的圖片不能直接復制到WordPress,會(huì )顯示為“無(wú)法顯示。這張圖片”,因為微信對圖片做了防盜鏈措施。
  這時(shí)候嘗試搜索了這樣一個(gè)插件,可以通過(guò)粘貼公眾號文章的鏈接直接將內容導入WordPress,并將圖片下載到本地(媒體庫),于是我開(kāi)發(fā)了一個(gè)叫Bee采集的插件,除了微信公眾號文章,還可以導入今日頭條、短書(shū)、知乎欄目的文章,并且還有各種多種可選功能,除此之外,還可以采集other網(wǎng)站,只要配置好相應的規則即可
  
  使用也很簡(jiǎn)單,粘貼鏈接即可,可以同時(shí)導入多個(gè)文章,即批量導入功能,自動(dòng)同步采集公眾號功能文章
  下載的話(huà)直接在安裝插件頁(yè)面搜索蜜蜂采集就可以看到
  
  希望這篇筆記可以幫到你

文章采集調用(python爬取參考文章AnyProxy代理批量采集實(shí)現方法:anyproxy+js )

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 134 次瀏覽 ? 2022-02-16 22:08 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(python爬取參考文章AnyProxy代理批量采集實(shí)現方法:anyproxy+js
)
  蟒蛇爬行
  參考文章
  AnyProxy 代理批量采集
  實(shí)現方式:anyproxy+js
  實(shí)現方式:anyproxy+java+webmagic
  FiddlerCore
  實(shí)現方式:抓包工具,Fiddler4
  通過(guò)捕獲和分析多個(gè)賬戶(hù),可以確定:
  步:
  1、編寫(xiě)按鈕向導腳本,在手機端自動(dòng)點(diǎn)擊公眾號文章的列表頁(yè)面,即“查看歷史消息”;
  2、使用fiddler代理劫持??手機訪(fǎng)問(wèn),將URL轉發(fā)到php編寫(xiě)的本地網(wǎng)頁(yè);
  3、將接收到的URL備份到php網(wǎng)頁(yè)上的數據庫中;
  4、使用python從數據庫中檢索URL,然后進(jìn)行正常爬取。
  在爬升過(guò)程中發(fā)現了一個(gè)問(wèn)題:
  如果只是想爬文章內容,貌似沒(méi)有訪(fǎng)問(wèn)頻率限制,但是如果想爬讀點(diǎn)贊數,達到一定頻率后,返回值會(huì )變成null,時(shí)間間隔我設置了10秒,就可以正常取了。在這個(gè)頻率下,一個(gè)小時(shí)只能取到 360 條,沒(méi)有實(shí)際意義。
  青波新名單
  如果你只是想看數據,你可以不花錢(qián)只看每日清單。如果你需要訪(fǎng)問(wèn)自己的系統,他們也提供了一個(gè)api接口
  Part3 項目步驟基本原則
  網(wǎng)站收錄最微信公眾號文章會(huì )定期更新,經(jīng)測試發(fā)現對爬蟲(chóng)更友好
  網(wǎng)站頁(yè)面排版和排版規則,不同公眾號以鏈接中的賬號區分
  公眾號采集下的文章也有定期翻頁(yè):id號每翻一頁(yè)+12
  
  傳送門(mén)副本.png
  所以這個(gè)想法可能是
  環(huán)境相關(guān)包獲取頁(yè)面
  def get_one_page(url):
#需要加一個(gè)請求頭部,不然會(huì )被網(wǎng)站封禁
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'}
try:
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status #若不為200,則引發(fā)HTTPError錯誤
response.encoding = response.apparent_encoding
return response.text
except:
return "產(chǎn)生異常"
  注意目標爬蟲(chóng)網(wǎng)站必須添加headers,否則會(huì )直接拒絕訪(fǎng)問(wèn)
  正則解析html
  def parse_one_page(html):
pattern = re.compile('.*?.*?<a class="question_link" href="(.*?)".*?_blank"(.*?)/a.*?"timestamp".*?">(.*?)', re.S)
items = re.findall(pattern, html)
return items
  自動(dòng)跳轉頁(yè)面
  def main(offset, i):
url = 'http://chuansong.me/account/' + str(offset) + '?start=' + str(12*i)
print(url)
wait = round(random.uniform(1,2),2) # 設置隨機爬蟲(chóng)間隔,避免被封
time.sleep(wait)
html = get_one_page(url)
for item in parse_one_page(html):
info = 'http://chuansong.me'+item[0]+','+ item[1]+','+item[2]+'\n'
info = repr(info.replace('\n', ''))
print(info)
#info.strip('\"') #這種去不掉首尾的“
#info = info[1:-1] #這種去不掉首尾的“
#info.Trim("".ToCharArray())
#info.TrimStart('\"').TrimEnd('\"')
write_to_file(info, offset)
  從標題中刪除非法字符
  因為windows下的file命令,有些字符不能使用,所以需要使用正則剔除
  itle = re.sub('[\\\\/:*?\"|]', '', info.loc[indexs]['標題'])
  轉換html
  使用pandas的read_csv函數讀取爬取的csv文件,循環(huán)遍歷“l(fā)ink”、“title”、“date”
  def html_to_pdf(offset):
wait = round(random.uniform(1,2),2) # 設置隨機爬蟲(chóng)間隔,避免被封
time.sleep(wait)
path = get_path(offset)
path_wk = r'D:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe' #安裝wkhtmltopdf的位置
config = pdfkit.configuration(wkhtmltopdf = path_wk)
if path == "" :
print("尚未抓取該公眾號")
else:
info = get_url_info(offset)
for indexs in info.index:
url = info.loc[indexs]['鏈接']
title = re.sub('[\\\\/:*?\"|]', '', info.loc[indexs]['標題'])
date = info.loc[indexs]['日期']
wait = round(random.uniform(4,5),2) # 設置隨機爬蟲(chóng)間隔,避免被封
time.sleep(wait)
print(url)
with eventlet.Timeout(4,False):
pdfkit.from_url(url, get_path(offset)+'\\'+ date+'_'+title+'.pdf', configuration=config)
print('轉換成功!')
  結果顯示爬取結果
  
  result1-copy.png
  爬取的幾個(gè)公眾號存放在文件夾中
  
  結果 2 - 復制.png
  文件夾目錄的內容
  
  result3-copy.png
  抓取的 CSV 內容格式
  生成的 PDF 結果
  
  result4-copy.png
  遇到的問(wèn)題問(wèn)題1
   for item in parse_one_page(html):
info = 'http://chuansong.me'+item[0]+','+ item[1]+','+item[2]+'\n'
info = repr(info.replace('\n', ''))
info = info.strip('\"')
print(info)
#info.strip('\"') #這種去不掉首尾的“
#info = info[1:-1] #這種去不掉首尾的“
#info.Trim("".ToCharArray())
#info.TrimStart('\"').TrimEnd('\"')
write_to_file(info, offset)
  解決方案
   字符串中首尾帶有“”,使用上文中的#注釋部分的各種方法都不好使,
最后的解決辦法是:
在寫(xiě)入字符串的代碼出,加上.strip('\'\"'),以去掉‘和”
with open(path, 'a', encoding='utf-8') as f: #追加存儲形式,content是字典形式
f.write(str(json.dumps(content, ensure_ascii=False).strip('\'\"') + '\n'))
f.close()
  問(wèn)題2
  調用wkhtmltopdf.exe將html轉成pdf報錯
調用代碼
``` python
path_wk = 'D:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe'
config = pdfkit.configuration(wkhtmltopdf = path_wk)
pdfkit.from_url(url, get_path(offset)+'\\taobao.pdf', configuration=config)
```
  錯誤信息
   OSError: No wkhtmltopdf executable found: "D:\Program Files\wkhtmltopdin\wkhtmltopdf.exe"
If this file exists please check that this process can read it. Otherwise please install wkhtmltopdf - https://github.com/JazzCore/py ... topdf
  解決方案
   path_wk = r'D:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe'
config = pdfkit.configuration(wkhtmltopdf = path_wk)
pdfkit.from_url(url, get_path(offset)+'\\taobao.pdf', configuration=config)
   或者
   path_wk = 'D:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltopdf.exe'
config = pdfkit.configuration(wkhtmltopdf = path_wk)
pdfkit.from_url(url, get_path(offset)+'\\taobao.pdf', configuration=config)
  原因
   Your config path contains an ASCII Backspace, the \b in \bin,
which pdfkit appears to be stripping out and converting D:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe
to D:\Program Files\wkhtmltopdf\wkhtmltopdf.exe. 查看全部

  文章采集調用(python爬取參考文章AnyProxy代理批量采集實(shí)現方法:anyproxy+js
)
  蟒蛇爬行
  參考文章
  AnyProxy 代理批量采集
  實(shí)現方式:anyproxy+js
  實(shí)現方式:anyproxy+java+webmagic
  FiddlerCore
  實(shí)現方式:抓包工具,Fiddler4
  通過(guò)捕獲和分析多個(gè)賬戶(hù),可以確定:
  步:
  1、編寫(xiě)按鈕向導腳本,在手機端自動(dòng)點(diǎn)擊公眾號文章的列表頁(yè)面,即“查看歷史消息”;
  2、使用fiddler代理劫持??手機訪(fǎng)問(wèn),將URL轉發(fā)到php編寫(xiě)的本地網(wǎng)頁(yè);
  3、將接收到的URL備份到php網(wǎng)頁(yè)上的數據庫中;
  4、使用python從數據庫中檢索URL,然后進(jìn)行正常爬取。
  在爬升過(guò)程中發(fā)現了一個(gè)問(wèn)題:
  如果只是想爬文章內容,貌似沒(méi)有訪(fǎng)問(wèn)頻率限制,但是如果想爬讀點(diǎn)贊數,達到一定頻率后,返回值會(huì )變成null,時(shí)間間隔我設置了10秒,就可以正常取了。在這個(gè)頻率下,一個(gè)小時(shí)只能取到 360 條,沒(méi)有實(shí)際意義。
  青波新名單
  如果你只是想看數據,你可以不花錢(qián)只看每日清單。如果你需要訪(fǎng)問(wèn)自己的系統,他們也提供了一個(gè)api接口
  Part3 項目步驟基本原則
  網(wǎng)站收錄最微信公眾號文章會(huì )定期更新,經(jīng)測試發(fā)現對爬蟲(chóng)更友好
  網(wǎng)站頁(yè)面排版和排版規則,不同公眾號以鏈接中的賬號區分
  公眾號采集下的文章也有定期翻頁(yè):id號每翻一頁(yè)+12
  
  傳送門(mén)副本.png
  所以這個(gè)想法可能是
  環(huán)境相關(guān)包獲取頁(yè)面
  def get_one_page(url):
#需要加一個(gè)請求頭部,不然會(huì )被網(wǎng)站封禁
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'}
try:
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status #若不為200,則引發(fā)HTTPError錯誤
response.encoding = response.apparent_encoding
return response.text
except:
return "產(chǎn)生異常"
  注意目標爬蟲(chóng)網(wǎng)站必須添加headers,否則會(huì )直接拒絕訪(fǎng)問(wèn)
  正則解析html
  def parse_one_page(html):
pattern = re.compile('.*?.*?<a class="question_link" href="(.*?)".*?_blank"(.*?)/a.*?"timestamp".*?">(.*?)', re.S)
items = re.findall(pattern, html)
return items
  自動(dòng)跳轉頁(yè)面
  def main(offset, i):
url = 'http://chuansong.me/account/' + str(offset) + '?start=' + str(12*i)
print(url)
wait = round(random.uniform(1,2),2) # 設置隨機爬蟲(chóng)間隔,避免被封
time.sleep(wait)
html = get_one_page(url)
for item in parse_one_page(html):
info = 'http://chuansong.me'+item[0]+','+ item[1]+','+item[2]+'\n'
info = repr(info.replace('\n', ''))
print(info)
#info.strip('\"') #這種去不掉首尾的“
#info = info[1:-1] #這種去不掉首尾的“
#info.Trim("".ToCharArray())
#info.TrimStart('\"').TrimEnd('\"')
write_to_file(info, offset)
  從標題中刪除非法字符
  因為windows下的file命令,有些字符不能使用,所以需要使用正則剔除
  itle = re.sub('[\\\\/:*?\"|]', '', info.loc[indexs]['標題'])
  轉換html
  使用pandas的read_csv函數讀取爬取的csv文件,循環(huán)遍歷“l(fā)ink”、“title”、“date”
  def html_to_pdf(offset):
wait = round(random.uniform(1,2),2) # 設置隨機爬蟲(chóng)間隔,避免被封
time.sleep(wait)
path = get_path(offset)
path_wk = r'D:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe' #安裝wkhtmltopdf的位置
config = pdfkit.configuration(wkhtmltopdf = path_wk)
if path == "" :
print("尚未抓取該公眾號")
else:
info = get_url_info(offset)
for indexs in info.index:
url = info.loc[indexs]['鏈接']
title = re.sub('[\\\\/:*?\"|]', '', info.loc[indexs]['標題'])
date = info.loc[indexs]['日期']
wait = round(random.uniform(4,5),2) # 設置隨機爬蟲(chóng)間隔,避免被封
time.sleep(wait)
print(url)
with eventlet.Timeout(4,False):
pdfkit.from_url(url, get_path(offset)+'\\'+ date+'_'+title+'.pdf', configuration=config)
print('轉換成功!')
  結果顯示爬取結果
  
  result1-copy.png
  爬取的幾個(gè)公眾號存放在文件夾中
  
  結果 2 - 復制.png
  文件夾目錄的內容
  
  result3-copy.png
  抓取的 CSV 內容格式
  生成的 PDF 結果
  
  result4-copy.png
  遇到的問(wèn)題問(wèn)題1
   for item in parse_one_page(html):
info = 'http://chuansong.me'+item[0]+','+ item[1]+','+item[2]+'\n'
info = repr(info.replace('\n', ''))
info = info.strip('\"')
print(info)
#info.strip('\"') #這種去不掉首尾的“
#info = info[1:-1] #這種去不掉首尾的“
#info.Trim("".ToCharArray())
#info.TrimStart('\"').TrimEnd('\"')
write_to_file(info, offset)
  解決方案
   字符串中首尾帶有“”,使用上文中的#注釋部分的各種方法都不好使,
最后的解決辦法是:
在寫(xiě)入字符串的代碼出,加上.strip('\'\"'),以去掉‘和”
with open(path, 'a', encoding='utf-8') as f: #追加存儲形式,content是字典形式
f.write(str(json.dumps(content, ensure_ascii=False).strip('\'\"') + '\n'))
f.close()
  問(wèn)題2
  調用wkhtmltopdf.exe將html轉成pdf報錯
調用代碼
``` python
path_wk = 'D:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe'
config = pdfkit.configuration(wkhtmltopdf = path_wk)
pdfkit.from_url(url, get_path(offset)+'\\taobao.pdf', configuration=config)
```
  錯誤信息
   OSError: No wkhtmltopdf executable found: "D:\Program Files\wkhtmltopdin\wkhtmltopdf.exe"
If this file exists please check that this process can read it. Otherwise please install wkhtmltopdf - https://github.com/JazzCore/py ... topdf
  解決方案
   path_wk = r'D:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe'
config = pdfkit.configuration(wkhtmltopdf = path_wk)
pdfkit.from_url(url, get_path(offset)+'\\taobao.pdf', configuration=config)
   或者
   path_wk = 'D:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltopdf.exe'
config = pdfkit.configuration(wkhtmltopdf = path_wk)
pdfkit.from_url(url, get_path(offset)+'\\taobao.pdf', configuration=config)
  原因
   Your config path contains an ASCII Backspace, the \b in \bin,
which pdfkit appears to be stripping out and converting D:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe
to D:\Program Files\wkhtmltopdf\wkhtmltopdf.exe.

文章采集調用(java項目中如何實(shí)現攝像頭圖像采集圖片數據采集? )

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 150 次瀏覽 ? 2022-02-15 07:08 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(java項目中如何實(shí)現攝像頭圖像采集圖片數據采集?
)
  最近一個(gè)項目需要實(shí)現攝像頭圖像采集,經(jīng)過(guò)一系列的折騰,終于實(shí)現了這個(gè)功能,現在整理一下。
  就java技術(shù)而言,為了實(shí)現相機的二次開(kāi)發(fā),采集相機圖片需要使用JMF。JMF 適合在 j2se 程序中使用。我需要在網(wǎng)絡(luò )程序中調用相機。顯然,JMF 處理不了?,F在想寫(xiě)個(gè)applet程序,但是那個(gè)東西需要客戶(hù)端有jre環(huán)境,不適合我。您不能指望用戶(hù)在訪(fǎng)問(wèn)您的 網(wǎng)站 jre 進(jìn)行安裝然后再次訪(fǎng)問(wèn)時(shí)下載一個(gè)大文件嗎?
  既然JMF不適用,那么我們在java項目中如何控制攝像頭抓拍呢?在windows平臺下,我們可以使用視頻采集卡等二次開(kāi)發(fā)包來(lái)訪(fǎng)問(wèn)視頻數據,但是現在攝像頭都是usb的,甚至筆記本屏幕都有攝像頭,這種情況下使用的解決方案采集卡二次開(kāi)發(fā)包不適用。你只能自己編寫(xiě)一個(gè)程序來(lái)做類(lèi)似“相機相機軟件”的事情。經(jīng)過(guò)一系列的分析,終于實(shí)現了在web程序中調用攝像頭,可以通過(guò)js代碼控制攝像頭,通過(guò)ajax技術(shù)上傳數據。雖然我沒(méi)有在程序中測試過(guò),但是應該支持.net技術(shù),也可以在采集Camera data的項目中實(shí)現,例如,
  啰嗦一大堆,程序放在csdn下載資源上面,以后不用到處找相機二次開(kāi)發(fā)了,直接下載使用就行了。
  攝像頭程序下載地址
  壓縮包中收錄一個(gè)基于純網(wǎng)頁(yè)采集的相機照片示例程序,以及一個(gè)基于jquery框架的ajax數據操作程序示例。調用攝像頭的方法詳見(jiàn)示例代碼。相信稍微懂一點(diǎn)技術(shù)的人應該都能看懂。了解了,有一個(gè)完整的基于java技術(shù)的photo采集示例程序,使用jsp頁(yè)面采集的照片,serlvet程序接收攝像頭照片數據。
  以下是程序運行效果示例:
   查看全部

  文章采集調用(java項目中如何實(shí)現攝像頭圖像采集圖片數據采集?
)
  最近一個(gè)項目需要實(shí)現攝像頭圖像采集,經(jīng)過(guò)一系列的折騰,終于實(shí)現了這個(gè)功能,現在整理一下。
  就java技術(shù)而言,為了實(shí)現相機的二次開(kāi)發(fā),采集相機圖片需要使用JMF。JMF 適合在 j2se 程序中使用。我需要在網(wǎng)絡(luò )程序中調用相機。顯然,JMF 處理不了?,F在想寫(xiě)個(gè)applet程序,但是那個(gè)東西需要客戶(hù)端有jre環(huán)境,不適合我。您不能指望用戶(hù)在訪(fǎng)問(wèn)您的 網(wǎng)站 jre 進(jìn)行安裝然后再次訪(fǎng)問(wèn)時(shí)下載一個(gè)大文件嗎?
  既然JMF不適用,那么我們在java項目中如何控制攝像頭抓拍呢?在windows平臺下,我們可以使用視頻采集卡等二次開(kāi)發(fā)包來(lái)訪(fǎng)問(wèn)視頻數據,但是現在攝像頭都是usb的,甚至筆記本屏幕都有攝像頭,這種情況下使用的解決方案采集卡二次開(kāi)發(fā)包不適用。你只能自己編寫(xiě)一個(gè)程序來(lái)做類(lèi)似“相機相機軟件”的事情。經(jīng)過(guò)一系列的分析,終于實(shí)現了在web程序中調用攝像頭,可以通過(guò)js代碼控制攝像頭,通過(guò)ajax技術(shù)上傳數據。雖然我沒(méi)有在程序中測試過(guò),但是應該支持.net技術(shù),也可以在采集Camera data的項目中實(shí)現,例如,
  啰嗦一大堆,程序放在csdn下載資源上面,以后不用到處找相機二次開(kāi)發(fā)了,直接下載使用就行了。
  攝像頭程序下載地址
  壓縮包中收錄一個(gè)基于純網(wǎng)頁(yè)采集的相機照片示例程序,以及一個(gè)基于jquery框架的ajax數據操作程序示例。調用攝像頭的方法詳見(jiàn)示例代碼。相信稍微懂一點(diǎn)技術(shù)的人應該都能看懂。了解了,有一個(gè)完整的基于java技術(shù)的photo采集示例程序,使用jsp頁(yè)面采集的照片,serlvet程序接收攝像頭照片數據。
  以下是程序運行效果示例:
  

文章采集調用(下采集神器:chromedp+HeadlessChrome安裝安裝)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 843 次瀏覽 ? 2022-02-14 22:03 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(下采集神器:chromedp+HeadlessChrome安裝安裝)
  最近在采集微信文章的時(shí)候,遇到了一個(gè)比較棘手的問(wèn)題。通過(guò)搜狗搜索的微信搜索模式,普通的直接爬取頁(yè)面的方式無(wú)法繞過(guò)搜狗搜索的驗證。于是使用gorequest成功采集到微信文章。
  選擇 chromedp + Headless Chrome
  面對采集的目標沒(méi)有達到的問(wèn)題,我是不是該放棄了?顯然不可能。你不是只有簽名驗證嗎?只要不需要驗證碼,總有辦法解決的(蒽,一般的驗證碼也可以解決)。于是犧牲了golang下的采集神器:chromedp。
  簡(jiǎn)單來(lái)說(shuō),chromedp是golang語(yǔ)言用來(lái)調用Chrome調試協(xié)議來(lái)模擬瀏覽器行為,以簡(jiǎn)單的方式驅動(dòng)瀏覽器的一個(gè)包。使用它只有一個(gè)簡(jiǎn)單的前提,那就是在你的電腦上安裝 Chrome 瀏覽器。
  Chrome瀏覽器的安裝在Windows和macOS下沒(méi)有問(wèn)題,在桌面版Linux下也沒(méi)有問(wèn)題。但是在Linux服務(wù)器版上安裝Chrome并不是那么簡(jiǎn)單,至少目前還沒(méi)有可以直接在服務(wù)器上安裝Chrome的包。
  但是你要放棄你剛才的想法嗎?當然這是不可能的。翻閱chromedp的文檔,剛好找到一段:
  最簡(jiǎn)單的方法是在 chromedp/headless-shell 映像中運行使用 chromedp 的 Go 程序。該圖像收錄無(wú)頭外殼,一種較小的無(wú)頭版本的 Chrome,chromedp 能夠開(kāi)箱即用地找到它。
  他的意思是:最簡(jiǎn)單的方法是使用 chromedp 調用 chromedp/headless-shell 鏡像。chromedp/headless-shell 是一個(gè) docker 鏡像,收錄較小的 Chrome 無(wú)頭瀏覽器。
  好吧,既然是docker鏡像,那就用docker來(lái)安裝吧。
  首先登錄我們的linux服務(wù)器,下面的操作就是你已經(jīng)登錄了linux服務(wù)器了。
  安裝 docker 并安裝 chromedp/headless-shell
  如果您的服務(wù)器已經(jīng)安裝了 docker,請跳過(guò)此步驟。
  用 yum 安裝 docker
  yum install docker
  安裝完成后,此時(shí)無(wú)法直接使用docker,需要執行以下命令激活
  systemctl daemon-reload
service docker restart
  然后安裝 chromedp/headless-shell 鏡像
  docker pull chromedp/headless-shell:latest
  等待安裝完成,然后運行docker鏡像
  docker run -d -p 9222:9222 --rm --name headless-shell chromedp/headless-shell
  運行后測試chrome是否正常:
  curl http://127.0.0.1:9222/json/version
  如果您看到類(lèi)似以下內容,則 chrome 瀏覽器工作正常
  { “瀏覽器”:“Chrome/96.0.4664.110”,“協(xié)議版本”:“1.3”,“用戶(hù)代理”:“ Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, 像 Gecko) Chrome/96.0.4664.110 Safari/537.36", "V8-版本": "9.6.180.21", "WebKit-版本": "537.36 (@d5ef0e8214bc14c9b5bbf69a1515e431394c62a6)", "webSocketDebuggerUrl": "ws://127.0.0.1:9222/devtools/browser/a41cd42b-99ef -4d5b-b9e6-37d634aa719a" }
  chromedp代碼調用chromedp/headless-shell的內容采集微信公眾號文章
  以上已經(jīng)可以在linux下正常使用Headless Chrome無(wú)頭瀏覽器了。剩下的就是調用它的代碼。
  下面開(kāi)始編寫(xiě)采集WeChat文章使用的chrome代碼:
  定義關(guān)鍵字,artile struct.go
  package main
type Keyword struct {
Id int64 `json:"id"`
Name string `json:"name"`
Level int `json:"level"`
ArticleCount int `json:"article_count"`
LastTime int64 `json:"last_time"` //上次執行時(shí)間
}
type Article struct {
Id int64 `json:"id"`
KeywordId int64 `json:"keyword_id"`
Title string `json:"title"`
Keywords string `json:"keywords"`
Description string `json:"description"`
OriginUrl string `json:"origin_url"`
Status int `json:"status"`
CreatedTime int `json:"created_time"`
UpdatedTime int `json:"updated_time"`
Content string `json:"content"`
ContentText string `json:"-"`
}
  編寫(xiě)核心代碼core.go
<p>package main
import (
"context"
"fmt"
"github.com/chromedp/cdproto/cdp"
"github.com/chromedp/chromedp"
"log"
"net"
"net/url"
"strings"
"time"
)
func CollectArticleFromWeixin(keyword *Keyword) []*Article {
timeCtx, cancel := context.WithTimeout(GetChromeCtx(false), 30*time.Second)
defer cancel()
var collectLink string
err := chromedp.Run(timeCtx,
chromedp.Navigate(fmt.Sprintf("https://weixin.sogou.com/weixi ... ot%3B, keyword.Name)),
chromedp.WaitVisible(`//ul[@class="news-list"]`),
chromedp.Location(&collectLink),
)
if err != nil {
log.Println("讀取搜狗搜索列表失敗1:", keyword.Name, err.Error())
return nil
}
log.Println("正在采集列表:", collectLink)
var aLinks []*cdp.Node
if err := chromedp.Run(timeCtx, chromedp.Nodes(`//ul[@class="news-list"]//h3//a`, &aLinks)); err != nil {
log.Println("讀取搜狗搜索列表失敗2:", keyword.Name, err.Error())
return nil
}
var articles []*Article
for i := 0; i 查看全部

  文章采集調用(下采集神器:chromedp+HeadlessChrome安裝安裝)
  最近在采集微信文章的時(shí)候,遇到了一個(gè)比較棘手的問(wèn)題。通過(guò)搜狗搜索的微信搜索模式,普通的直接爬取頁(yè)面的方式無(wú)法繞過(guò)搜狗搜索的驗證。于是使用gorequest成功采集到微信文章。
  選擇 chromedp + Headless Chrome
  面對采集的目標沒(méi)有達到的問(wèn)題,我是不是該放棄了?顯然不可能。你不是只有簽名驗證嗎?只要不需要驗證碼,總有辦法解決的(蒽,一般的驗證碼也可以解決)。于是犧牲了golang下的采集神器:chromedp。
  簡(jiǎn)單來(lái)說(shuō),chromedp是golang語(yǔ)言用來(lái)調用Chrome調試協(xié)議來(lái)模擬瀏覽器行為,以簡(jiǎn)單的方式驅動(dòng)瀏覽器的一個(gè)包。使用它只有一個(gè)簡(jiǎn)單的前提,那就是在你的電腦上安裝 Chrome 瀏覽器。
  Chrome瀏覽器的安裝在Windows和macOS下沒(méi)有問(wèn)題,在桌面版Linux下也沒(méi)有問(wèn)題。但是在Linux服務(wù)器版上安裝Chrome并不是那么簡(jiǎn)單,至少目前還沒(méi)有可以直接在服務(wù)器上安裝Chrome的包。
  但是你要放棄你剛才的想法嗎?當然這是不可能的。翻閱chromedp的文檔,剛好找到一段:
  最簡(jiǎn)單的方法是在 chromedp/headless-shell 映像中運行使用 chromedp 的 Go 程序。該圖像收錄無(wú)頭外殼,一種較小的無(wú)頭版本的 Chrome,chromedp 能夠開(kāi)箱即用地找到它。
  他的意思是:最簡(jiǎn)單的方法是使用 chromedp 調用 chromedp/headless-shell 鏡像。chromedp/headless-shell 是一個(gè) docker 鏡像,收錄較小的 Chrome 無(wú)頭瀏覽器。
  好吧,既然是docker鏡像,那就用docker來(lái)安裝吧。
  首先登錄我們的linux服務(wù)器,下面的操作就是你已經(jīng)登錄了linux服務(wù)器了。
  安裝 docker 并安裝 chromedp/headless-shell
  如果您的服務(wù)器已經(jīng)安裝了 docker,請跳過(guò)此步驟。
  用 yum 安裝 docker
  yum install docker
  安裝完成后,此時(shí)無(wú)法直接使用docker,需要執行以下命令激活
  systemctl daemon-reload
service docker restart
  然后安裝 chromedp/headless-shell 鏡像
  docker pull chromedp/headless-shell:latest
  等待安裝完成,然后運行docker鏡像
  docker run -d -p 9222:9222 --rm --name headless-shell chromedp/headless-shell
  運行后測試chrome是否正常:
  curl http://127.0.0.1:9222/json/version
  如果您看到類(lèi)似以下內容,則 chrome 瀏覽器工作正常
  { “瀏覽器”:“Chrome/96.0.4664.110”,“協(xié)議版本”:“1.3”,“用戶(hù)代理”:“ Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, 像 Gecko) Chrome/96.0.4664.110 Safari/537.36", "V8-版本": "9.6.180.21", "WebKit-版本": "537.36 (@d5ef0e8214bc14c9b5bbf69a1515e431394c62a6)", "webSocketDebuggerUrl": "ws://127.0.0.1:9222/devtools/browser/a41cd42b-99ef -4d5b-b9e6-37d634aa719a" }
  chromedp代碼調用chromedp/headless-shell的內容采集微信公眾號文章
  以上已經(jīng)可以在linux下正常使用Headless Chrome無(wú)頭瀏覽器了。剩下的就是調用它的代碼。
  下面開(kāi)始編寫(xiě)采集WeChat文章使用的chrome代碼:
  定義關(guān)鍵字,artile struct.go
  package main
type Keyword struct {
Id int64 `json:"id"`
Name string `json:"name"`
Level int `json:"level"`
ArticleCount int `json:"article_count"`
LastTime int64 `json:"last_time"` //上次執行時(shí)間
}
type Article struct {
Id int64 `json:"id"`
KeywordId int64 `json:"keyword_id"`
Title string `json:"title"`
Keywords string `json:"keywords"`
Description string `json:"description"`
OriginUrl string `json:"origin_url"`
Status int `json:"status"`
CreatedTime int `json:"created_time"`
UpdatedTime int `json:"updated_time"`
Content string `json:"content"`
ContentText string `json:"-"`
}
  編寫(xiě)核心代碼core.go
<p>package main
import (
"context"
"fmt"
"github.com/chromedp/cdproto/cdp"
"github.com/chromedp/chromedp"
"log"
"net"
"net/url"
"strings"
"time"
)
func CollectArticleFromWeixin(keyword *Keyword) []*Article {
timeCtx, cancel := context.WithTimeout(GetChromeCtx(false), 30*time.Second)
defer cancel()
var collectLink string
err := chromedp.Run(timeCtx,
chromedp.Navigate(fmt.Sprintf("https://weixin.sogou.com/weixi ... ot%3B, keyword.Name)),
chromedp.WaitVisible(`//ul[@class="news-list"]`),
chromedp.Location(&collectLink),
)
if err != nil {
log.Println("讀取搜狗搜索列表失敗1:", keyword.Name, err.Error())
return nil
}
log.Println("正在采集列表:", collectLink)
var aLinks []*cdp.Node
if err := chromedp.Run(timeCtx, chromedp.Nodes(`//ul[@class="news-list"]//h3//a`, &aLinks)); err != nil {
log.Println("讀取搜狗搜索列表失敗2:", keyword.Name, err.Error())
return nil
}
var articles []*Article
for i := 0; i

文章采集調用(閉包dep:來(lái)存儲依賴(lài)引用數據類(lèi)型的數據依賴(lài)收集 )

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 165 次瀏覽 ? 2022-02-14 22:02 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(閉包dep:來(lái)存儲依賴(lài)引用數據類(lèi)型的數據依賴(lài)收集
)
  上一篇我們分析了基礎數據類(lèi)型的依賴(lài)集合
  本文是關(guān)于引用數據類(lèi)型的數據依賴(lài)采集和分析,因為引用類(lèi)型數據比較復雜,必須單獨寫(xiě)
  文章很長(cháng),高能預警,做好準備,耐心等待,一定會(huì )有收獲
  不過(guò)這兩類(lèi)數據的處理有很多重復,所以我打算只寫(xiě)一些區別,否則會(huì )廢話(huà)很多。
  兩個(gè)步驟,兩者都不一樣
  1、數據初始化
  2、依賴(lài)集合
  數據初始化過(guò)程
  如果數據類(lèi)型是引用類(lèi)型,則需要對數據進(jìn)行額外處理。
  處理分為對象和數組兩種,分別討論。
  1 個(gè)對象
  1、 遍歷對象的各個(gè)屬性,也設置響應性。假設屬性都是基本類(lèi)型,處理流程和上一個(gè)一樣
  2、每個(gè)數據對象都會(huì )添加一個(gè)ob屬性
  例如,設置子數據對象
  
  在下圖中,可以看到子對象處理完后添加了一個(gè)ob屬性
  
  ob_ 屬性有什么用?
  你可以觀(guān)察到 ob 有一個(gè) dep 屬性。這個(gè) dep 是不是有點(diǎn)屬性?是的,在上一篇關(guān)于基本數據類(lèi)型的文章中提到過(guò)
  那么這個(gè)ob屬性有什么用呢?
  你可以觀(guān)察到 ob 有一個(gè) dep 屬性。這個(gè) dep 是不是有點(diǎn)屬性?是的,在上一篇關(guān)于基本數據類(lèi)型的文章中提到過(guò)
  dep 正是存儲依賴(lài)項的位置
  比如page指的是data child,watch指的是data child,那么child會(huì )將這兩個(gè)保存在dep.subs中
  dep.subs = [ 頁(yè)面-watcher,watch-watcher ]
  但是,在上一篇關(guān)于基本類(lèi)型的文章中,dep 作為閉包存在,而不是任何 [ob.dep]。
  是的,這就是引用類(lèi)型和原創(chuàng )類(lèi)型的區別
  基本數據類(lèi)型,僅使用 [closure dep] 存儲依賴(lài)關(guān)系
  引用數據類(lèi)型,使用[closure dep]和[ob.dep]存儲依賴(lài)
  什么?你說(shuō)關(guān)閉部門(mén)在哪里?嗯,在defineReactive的源碼中,大家可以看一下這個(gè)方法的源碼,下面是
  那么,為什么引用類(lèi)型需要使用 __ob__.dep 來(lái)存儲依賴(lài)呢?
  首先要明確一點(diǎn),存儲依賴(lài)就是在數據變化時(shí)通知依賴(lài),所以ob.dep也是為了變化后的通知
  閉包dep只存在于defineReactive中,不能在別處使用,所以需要另存一個(gè)以供別處使用
  它還會(huì )用在哪里?
  Vue掛載原型上的set和del方法中,源碼如下
  function set(target, key, val) {
var ob = (target).__ob__;
// 通知依賴(lài)更新
ob.dep.notify();
}
Vue.prototype.$set = set;
  function del(target, key) {
var ob = (target).__ob__;
delete target[key];
if (!ob) return
// 通知依賴(lài)更新
ob.dep.notify();
}
Vue.prototype.$delete = del;
  這兩個(gè)方法大家都應該用過(guò),為了對象的動(dòng)態(tài)增刪屬性
  但是如果直接添加屬性或者刪除屬性,Vue就無(wú)法監聽(tīng),比如下面
  child.xxxx=1
delete child.xxxx
  所以必須通過(guò)Vue封裝的set和del方法來(lái)操作
  執行完set和del后,需要通知依賴(lài)更新,但是怎么通知呢?
  此時(shí),[ob.dep] 發(fā)揮作用!正因為有依賴(lài)關(guān)系,所以在 ob.dep 中又采集了一份
  使用就是上面那句話(huà),通知更新
  ob.dep.notify();
  2、數組
  1、需要遍歷數組,可能數組是對象數組,如下
  [{name:1},{name:888}]
  遍歷的時(shí)候,如果子item是一個(gè)對象,會(huì )和上面解析對象一樣操作。
  2、保存一個(gè)ob屬性到數組
  例如,設置一個(gè) arr 數組
  
  看到arr數組增加了ob屬性
  
  其實(shí)這個(gè)ob屬性和上一段提到的對象的功能類(lèi)似,這里我們只說(shuō)ob.dep
  數組中的 Ob.dep 還存儲依賴(lài)項。它是給誰(shuí)的?
  要使用Vue封裝的數組方法,要知道如果數組的變化也被監聽(tīng)了,一定要使用Vue封裝的數組方法,否則無(wú)法實(shí)時(shí)更新
  這里是覆蓋方法之一,push,其他的是splice等,Vue官方文檔已經(jīng)說(shuō)明了。
  var original = Array.prototype.push;
Array.prototype.push = function() {
var args = [],
len = arguments.length;
// 復制 傳給 push 等方法的參數
while (len--) args[len] = arguments[len];
// 執行 原方法
var result = original.apply(this, args);
var ob = this.__ob__;
// notify change
ob.dep.notify();
return resul
}
  可見(jiàn),執行完數組方法后,還需要通知依賴(lài)更新,即通知ob.dep中采集的依賴(lài)更新
  現在,我們知道響應式數據對引用類(lèi)型做了哪些額外的處理,主要是添加一個(gè)ob屬性
  我們已經(jīng)知道ob是干什么用的了,現在看看源碼是怎么添加ob的
  // 初始化Vue組件的數據
function initData(vm) {
var data = vm.$options.data;
data = vm._data =
typeof data === &#39;function&#39; ?
data.call(vm, vm) : data || {};
....遍歷 data 數據對象的key ,重名檢測,合規檢測
observe(data, true);
}
function observe(value) {
if (Array.isArray(value) || typeof value == "object") {
ob = new Observer(value);
}
return ob
}
  function Observer(value) {
// 給對象生成依賴(lài)保存器
this.dep = new Dep();
// 給 每一個(gè)對象 添加一個(gè) __ob__ 屬性,值為 Observer 實(shí)例
value.__ob__ = this
if (Array.isArray(value)) {
// 遍歷數組,每一項都需要通過(guò) observe 處理,如果是對象就添加 __ob__
for (var i = 0, l =value.length; i < l; i++) {
observe(value[i]);
}
} else {
var keys = Object.keys(value);
// 給對象的每一個(gè)屬性設置響應式
for (var i = 0; i < keys.length; i++) {
defineReactive(value, keys[i]);
}
}
};
  源碼的處理過(guò)程和上一個(gè)類(lèi)似,但是處理引用數據類(lèi)型會(huì )多增加幾行對源碼的額外處理。
  我們之前只講過(guò)一種對象數據類(lèi)型,比如下面
  
  如果嵌套了多層對象怎么辦?例如,將如何
  
  是的,Vue 會(huì )遞歸處理。遍歷屬性,使用defineReactive處理時(shí),遞歸調用observe處理(源碼用紅色加粗標記)
  如果該值是一個(gè)對象,那么還要在該值上添加一個(gè) ob
  如果沒(méi)有,則正常下線(xiàn)并設置響應
  源代碼如下
  function defineReactive(obj, key, value) {
// dep 用于中收集所有 依賴(lài)我的 東西
var dep = new Dep();
var val = obj[key]
// 返回的 childOb 是一個(gè) Observer 實(shí)例
// 如果值是一個(gè)對象,需要遞歸遍歷對象
var childOb = observe(val);
Object.defineProperty(obj, key, {
get() {...依賴(lài)收集跟初始化無(wú)關(guān),下面會(huì )講},
set() { .... }
});
}
  繪制流程圖僅供參考
  
  哈哈哈,上面的很長(cháng),有一點(diǎn)點(diǎn),但是忍不住了。我想更詳細一點(diǎn)。好吧,還有一段,但它有點(diǎn)短。答應我,如果你仔細閱讀,請發(fā)表評論,讓我知道有人仔細閱讀過(guò)
  依賴(lài)采集過(guò)程
  采集過(guò)程重點(diǎn)是Object.defineProperty設置的get方法
  與基本類(lèi)型數據相比,引用類(lèi)型的采集方式只是多了幾行處理,區別就在于兩行代碼
  childOb.dep.depend,我將其簡(jiǎn)化為 childOb.dep.addSub(Dep.target)
  依賴(lài)數組(值)
  可以先看源碼,如下
  function defineReactive(obj, key, value) {
var dep = new Dep();
var val = obj[key]
var childOb = observe(val);
Object.defineProperty(obj, key, {
get() {
var value = val
if (Dep.target) {
// 收集依賴(lài)進(jìn) dep.subs
dep.addSub(Dep.target);
// 如果值是一個(gè)對象,Observer 實(shí)例的 dep 也收集一遍依賴(lài)
if (childOb) {
childOb.dep.addSub(Dep.target)
if (Array.isArray(value)) {
dependArray(value);
}
}
}
return value
}
});
}
  以上源碼混合了對象和數組的處理,我們分開(kāi)講
  1、對象
  在數據初始化的過(guò)程中,我們已經(jīng)知道如果值是一個(gè)對象,在ob.dep中會(huì )額外存儲一份依賴(lài)
  只有一句話(huà)
  childOb.dep.depend();
  數組有另一種處理方式,即
  dependArray(value);
  看源碼,如下
  function dependArray(value) {
for (var i = 0, l = value.length; i < l; i++) {
var e = value[i];
// 只有子項是對象的時(shí)候,收集依賴(lài)進(jìn) dep.subs
e && e.__ob__ && e.__ob__.dep.addSub(Dep.target);

// 如果子項還是 數組,那就繼續遞歸遍歷
if (Array.isArray(e)) {
dependArray(e);
}
}
}
  顯然,為了防止數組中的對象,需要保存數組的子項對象的副本。
  你一定要問(wèn),為什么子對象還要保存一個(gè)依賴(lài)?
  1、頁(yè)面依賴(lài)數組,數組的子項發(fā)生了變化。頁(yè)面是否也需要更新?但是子項的內部變化是如何通知頁(yè)面更新的呢?所以你還需要為子對象保存一個(gè)依賴(lài)項嗎?
  2、數組子項數組的變化就是對象屬性的增刪。必須使用 Vue 封裝方法 set 和 del。set和del會(huì )通知依賴(lài)更新,所以子項對象也要保存
  看栗子
  [外鏈圖片傳輸失敗(img-PuPHYChy-59)()]
  頁(yè)面模板
  
  看數組的數據,有兩個(gè)ob
  
  總結
  至此,引用類(lèi)型和基本類(lèi)型的區別就很清楚了。
  1、引用類(lèi)型會(huì )添加一個(gè)__ob__屬性,里面收錄dep,用來(lái)存放采集到的依賴(lài)
  2、對象使用ob.dep,作用于Vue的自定義方法set和del
  3、數組使用ob.dep,作用于Vue重寫(xiě)的數組方法push等。
  終于看完了,真的好長(cháng),不過(guò)我覺(jué)得值得
  
   查看全部

  文章采集調用(閉包dep:來(lái)存儲依賴(lài)引用數據類(lèi)型的數據依賴(lài)收集
)
  上一篇我們分析了基礎數據類(lèi)型的依賴(lài)集合
  本文是關(guān)于引用數據類(lèi)型的數據依賴(lài)采集和分析,因為引用類(lèi)型數據比較復雜,必須單獨寫(xiě)
  文章很長(cháng),高能預警,做好準備,耐心等待,一定會(huì )有收獲
  不過(guò)這兩類(lèi)數據的處理有很多重復,所以我打算只寫(xiě)一些區別,否則會(huì )廢話(huà)很多。
  兩個(gè)步驟,兩者都不一樣
  1、數據初始化
  2、依賴(lài)集合
  數據初始化過(guò)程
  如果數據類(lèi)型是引用類(lèi)型,則需要對數據進(jìn)行額外處理。
  處理分為對象和數組兩種,分別討論。
  1 個(gè)對象
  1、 遍歷對象的各個(gè)屬性,也設置響應性。假設屬性都是基本類(lèi)型,處理流程和上一個(gè)一樣
  2、每個(gè)數據對象都會(huì )添加一個(gè)ob屬性
  例如,設置子數據對象
  
  在下圖中,可以看到子對象處理完后添加了一個(gè)ob屬性
  
  ob_ 屬性有什么用?
  你可以觀(guān)察到 ob 有一個(gè) dep 屬性。這個(gè) dep 是不是有點(diǎn)屬性?是的,在上一篇關(guān)于基本數據類(lèi)型的文章中提到過(guò)
  那么這個(gè)ob屬性有什么用呢?
  你可以觀(guān)察到 ob 有一個(gè) dep 屬性。這個(gè) dep 是不是有點(diǎn)屬性?是的,在上一篇關(guān)于基本數據類(lèi)型的文章中提到過(guò)
  dep 正是存儲依賴(lài)項的位置
  比如page指的是data child,watch指的是data child,那么child會(huì )將這兩個(gè)保存在dep.subs中
  dep.subs = [ 頁(yè)面-watcher,watch-watcher ]
  但是,在上一篇關(guān)于基本類(lèi)型的文章中,dep 作為閉包存在,而不是任何 [ob.dep]。
  是的,這就是引用類(lèi)型和原創(chuàng )類(lèi)型的區別
  基本數據類(lèi)型,僅使用 [closure dep] 存儲依賴(lài)關(guān)系
  引用數據類(lèi)型,使用[closure dep]和[ob.dep]存儲依賴(lài)
  什么?你說(shuō)關(guān)閉部門(mén)在哪里?嗯,在defineReactive的源碼中,大家可以看一下這個(gè)方法的源碼,下面是
  那么,為什么引用類(lèi)型需要使用 __ob__.dep 來(lái)存儲依賴(lài)呢?
  首先要明確一點(diǎn),存儲依賴(lài)就是在數據變化時(shí)通知依賴(lài),所以ob.dep也是為了變化后的通知
  閉包dep只存在于defineReactive中,不能在別處使用,所以需要另存一個(gè)以供別處使用
  它還會(huì )用在哪里?
  Vue掛載原型上的set和del方法中,源碼如下
  function set(target, key, val) {
var ob = (target).__ob__;
// 通知依賴(lài)更新
ob.dep.notify();
}
Vue.prototype.$set = set;
  function del(target, key) {
var ob = (target).__ob__;
delete target[key];
if (!ob) return
// 通知依賴(lài)更新
ob.dep.notify();
}
Vue.prototype.$delete = del;
  這兩個(gè)方法大家都應該用過(guò),為了對象的動(dòng)態(tài)增刪屬性
  但是如果直接添加屬性或者刪除屬性,Vue就無(wú)法監聽(tīng),比如下面
  child.xxxx=1
delete child.xxxx
  所以必須通過(guò)Vue封裝的set和del方法來(lái)操作
  執行完set和del后,需要通知依賴(lài)更新,但是怎么通知呢?
  此時(shí),[ob.dep] 發(fā)揮作用!正因為有依賴(lài)關(guān)系,所以在 ob.dep 中又采集了一份
  使用就是上面那句話(huà),通知更新
  ob.dep.notify();
  2、數組
  1、需要遍歷數組,可能數組是對象數組,如下
  [{name:1},{name:888}]
  遍歷的時(shí)候,如果子item是一個(gè)對象,會(huì )和上面解析對象一樣操作。
  2、保存一個(gè)ob屬性到數組
  例如,設置一個(gè) arr 數組
  
  看到arr數組增加了ob屬性
  
  其實(shí)這個(gè)ob屬性和上一段提到的對象的功能類(lèi)似,這里我們只說(shuō)ob.dep
  數組中的 Ob.dep 還存儲依賴(lài)項。它是給誰(shuí)的?
  要使用Vue封裝的數組方法,要知道如果數組的變化也被監聽(tīng)了,一定要使用Vue封裝的數組方法,否則無(wú)法實(shí)時(shí)更新
  這里是覆蓋方法之一,push,其他的是splice等,Vue官方文檔已經(jīng)說(shuō)明了。
  var original = Array.prototype.push;
Array.prototype.push = function() {
var args = [],
len = arguments.length;
// 復制 傳給 push 等方法的參數
while (len--) args[len] = arguments[len];
// 執行 原方法
var result = original.apply(this, args);
var ob = this.__ob__;
// notify change
ob.dep.notify();
return resul
}
  可見(jiàn),執行完數組方法后,還需要通知依賴(lài)更新,即通知ob.dep中采集的依賴(lài)更新
  現在,我們知道響應式數據對引用類(lèi)型做了哪些額外的處理,主要是添加一個(gè)ob屬性
  我們已經(jīng)知道ob是干什么用的了,現在看看源碼是怎么添加ob的
  // 初始化Vue組件的數據
function initData(vm) {
var data = vm.$options.data;
data = vm._data =
typeof data === &#39;function&#39; ?
data.call(vm, vm) : data || {};
....遍歷 data 數據對象的key ,重名檢測,合規檢測
observe(data, true);
}
function observe(value) {
if (Array.isArray(value) || typeof value == "object") {
ob = new Observer(value);
}
return ob
}
  function Observer(value) {
// 給對象生成依賴(lài)保存器
this.dep = new Dep();
// 給 每一個(gè)對象 添加一個(gè) __ob__ 屬性,值為 Observer 實(shí)例
value.__ob__ = this
if (Array.isArray(value)) {
// 遍歷數組,每一項都需要通過(guò) observe 處理,如果是對象就添加 __ob__
for (var i = 0, l =value.length; i < l; i++) {
observe(value[i]);
}
} else {
var keys = Object.keys(value);
// 給對象的每一個(gè)屬性設置響應式
for (var i = 0; i < keys.length; i++) {
defineReactive(value, keys[i]);
}
}
};
  源碼的處理過(guò)程和上一個(gè)類(lèi)似,但是處理引用數據類(lèi)型會(huì )多增加幾行對源碼的額外處理。
  我們之前只講過(guò)一種對象數據類(lèi)型,比如下面
  
  如果嵌套了多層對象怎么辦?例如,將如何
  
  是的,Vue 會(huì )遞歸處理。遍歷屬性,使用defineReactive處理時(shí),遞歸調用observe處理(源碼用紅色加粗標記)
  如果該值是一個(gè)對象,那么還要在該值上添加一個(gè) ob
  如果沒(méi)有,則正常下線(xiàn)并設置響應
  源代碼如下
  function defineReactive(obj, key, value) {
// dep 用于中收集所有 依賴(lài)我的 東西
var dep = new Dep();
var val = obj[key]
// 返回的 childOb 是一個(gè) Observer 實(shí)例
// 如果值是一個(gè)對象,需要遞歸遍歷對象
var childOb = observe(val);
Object.defineProperty(obj, key, {
get() {...依賴(lài)收集跟初始化無(wú)關(guān),下面會(huì )講},
set() { .... }
});
}
  繪制流程圖僅供參考
  
  哈哈哈,上面的很長(cháng),有一點(diǎn)點(diǎn),但是忍不住了。我想更詳細一點(diǎn)。好吧,還有一段,但它有點(diǎn)短。答應我,如果你仔細閱讀,請發(fā)表評論,讓我知道有人仔細閱讀過(guò)
  依賴(lài)采集過(guò)程
  采集過(guò)程重點(diǎn)是Object.defineProperty設置的get方法
  與基本類(lèi)型數據相比,引用類(lèi)型的采集方式只是多了幾行處理,區別就在于兩行代碼
  childOb.dep.depend,我將其簡(jiǎn)化為 childOb.dep.addSub(Dep.target)
  依賴(lài)數組(值)
  可以先看源碼,如下
  function defineReactive(obj, key, value) {
var dep = new Dep();
var val = obj[key]
var childOb = observe(val);
Object.defineProperty(obj, key, {
get() {
var value = val
if (Dep.target) {
// 收集依賴(lài)進(jìn) dep.subs
dep.addSub(Dep.target);
// 如果值是一個(gè)對象,Observer 實(shí)例的 dep 也收集一遍依賴(lài)
if (childOb) {
childOb.dep.addSub(Dep.target)
if (Array.isArray(value)) {
dependArray(value);
}
}
}
return value
}
});
}
  以上源碼混合了對象和數組的處理,我們分開(kāi)講
  1、對象
  在數據初始化的過(guò)程中,我們已經(jīng)知道如果值是一個(gè)對象,在ob.dep中會(huì )額外存儲一份依賴(lài)
  只有一句話(huà)
  childOb.dep.depend();
  數組有另一種處理方式,即
  dependArray(value);
  看源碼,如下
  function dependArray(value) {
for (var i = 0, l = value.length; i < l; i++) {
var e = value[i];
// 只有子項是對象的時(shí)候,收集依賴(lài)進(jìn) dep.subs
e && e.__ob__ && e.__ob__.dep.addSub(Dep.target);

// 如果子項還是 數組,那就繼續遞歸遍歷
if (Array.isArray(e)) {
dependArray(e);
}
}
}
  顯然,為了防止數組中的對象,需要保存數組的子項對象的副本。
  你一定要問(wèn),為什么子對象還要保存一個(gè)依賴(lài)?
  1、頁(yè)面依賴(lài)數組,數組的子項發(fā)生了變化。頁(yè)面是否也需要更新?但是子項的內部變化是如何通知頁(yè)面更新的呢?所以你還需要為子對象保存一個(gè)依賴(lài)項嗎?
  2、數組子項數組的變化就是對象屬性的增刪。必須使用 Vue 封裝方法 set 和 del。set和del會(huì )通知依賴(lài)更新,所以子項對象也要保存
  看栗子
  [外鏈圖片傳輸失敗(img-PuPHYChy-59)()]
  頁(yè)面模板
  
  看數組的數據,有兩個(gè)ob
  
  總結
  至此,引用類(lèi)型和基本類(lèi)型的區別就很清楚了。
  1、引用類(lèi)型會(huì )添加一個(gè)__ob__屬性,里面收錄dep,用來(lái)存放采集到的依賴(lài)
  2、對象使用ob.dep,作用于Vue的自定義方法set和del
  3、數組使用ob.dep,作用于Vue重寫(xiě)的數組方法push等。
  終于看完了,真的好長(cháng),不過(guò)我覺(jué)得值得
  
  

文章采集調用(DS打數機才能自動(dòng)翻頁(yè)采集數據(圖)案例大全)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 150 次瀏覽 ? 2022-02-14 04:04 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(DS打數機才能自動(dòng)翻頁(yè)采集數據(圖)案例大全)
  一、操作步驟
  采集如果有多個(gè)頁(yè)面列表頁(yè),需要設置翻頁(yè),以便DS打印機自動(dòng)翻頁(yè)采集數據。選擇一個(gè)以翻頁(yè)為規則的示例URL,您可以使用該規則批量處理采集相似的URL(適用于一頁(yè)和多頁(yè))。以下是大眾點(diǎn)評網(wǎng)的一個(gè)例子。
  二、案例步驟
  先復制上面的例子,來(lái)到采集列出數據。本教程在上一篇文章文章中已經(jīng)提到過(guò),不再重復操作?!癎ooSeeker Copy Batch 采集 列出帶有樣本的數據”
  三、設置翻頁(yè)
  1.1、新建marker thread:選擇“Crawler Route”,點(diǎn)擊“New”,選擇“Marker Clue”,勾選“Continuous Grab”,“Target Subject Name”會(huì )自動(dòng)填寫(xiě)。這意味著(zhù)該規則被循環(huán)調用。
  
  1.2、一旦設置了標記線(xiàn)索,就做了兩個(gè)映射,第一個(gè)是映射翻頁(yè)塊的范圍,第二個(gè)是映射翻頁(yè)標記。
  第一次是選擇翻頁(yè)區的頁(yè)面節點(diǎn)進(jìn)行映射:點(diǎn)擊翻頁(yè)標志,定位到收錄它的翻頁(yè)區所在的頁(yè)面節點(diǎn)。這些翻頁(yè)按鈕的翻頁(yè)區域,然后右鍵節點(diǎn)選擇“Lead Mapping”-&gt;“Location”-&gt;“Clue*”,爬蟲(chóng)路由中的“Location Number”就會(huì )映射節點(diǎn)的編號。
  
  第二次是映射翻頁(yè)標記值所在的頁(yè)面節點(diǎn):雙擊翻頁(yè)區域節點(diǎn)逐層展開(kāi),找到翻頁(yè)標記所在的節點(diǎn),這里指的是翻頁(yè)按鈕的文本節點(diǎn)或屬性值節點(diǎn),右擊節點(diǎn)選擇“線(xiàn)索映射”-&gt;“標記映射”,爬蟲(chóng)路由中的“標記值”和“標記位置編號”會(huì )映射值和節點(diǎn)的編號。
  
  1.3、定位選項的默認項是數字id。由于不同頁(yè)碼的翻頁(yè)區的id值可能會(huì )發(fā)生變化,所以class值通常保持不變,所以最好改成preference class。
  
  四、保存規則并捕獲數據
  點(diǎn)擊保存規則,爬取數據,在DS計數器中查看翻頁(yè)是否成功。如果翻頁(yè)采集成功,會(huì )在本地DataScraperWorks文件夾中生成多個(gè)XML文件。詳見(jiàn)文章如何將采集中的xml文件轉換為Excel文件?”。 查看全部

  文章采集調用(DS打數機才能自動(dòng)翻頁(yè)采集數據(圖)案例大全)
  一、操作步驟
  采集如果有多個(gè)頁(yè)面列表頁(yè),需要設置翻頁(yè),以便DS打印機自動(dòng)翻頁(yè)采集數據。選擇一個(gè)以翻頁(yè)為規則的示例URL,您可以使用該規則批量處理采集相似的URL(適用于一頁(yè)和多頁(yè))。以下是大眾點(diǎn)評網(wǎng)的一個(gè)例子。
  二、案例步驟
  先復制上面的例子,來(lái)到采集列出數據。本教程在上一篇文章文章中已經(jīng)提到過(guò),不再重復操作?!癎ooSeeker Copy Batch 采集 列出帶有樣本的數據”
  三、設置翻頁(yè)
  1.1、新建marker thread:選擇“Crawler Route”,點(diǎn)擊“New”,選擇“Marker Clue”,勾選“Continuous Grab”,“Target Subject Name”會(huì )自動(dòng)填寫(xiě)。這意味著(zhù)該規則被循環(huán)調用。
  
  1.2、一旦設置了標記線(xiàn)索,就做了兩個(gè)映射,第一個(gè)是映射翻頁(yè)塊的范圍,第二個(gè)是映射翻頁(yè)標記。
  第一次是選擇翻頁(yè)區的頁(yè)面節點(diǎn)進(jìn)行映射:點(diǎn)擊翻頁(yè)標志,定位到收錄它的翻頁(yè)區所在的頁(yè)面節點(diǎn)。這些翻頁(yè)按鈕的翻頁(yè)區域,然后右鍵節點(diǎn)選擇“Lead Mapping”-&gt;“Location”-&gt;“Clue*”,爬蟲(chóng)路由中的“Location Number”就會(huì )映射節點(diǎn)的編號。
  
  第二次是映射翻頁(yè)標記值所在的頁(yè)面節點(diǎn):雙擊翻頁(yè)區域節點(diǎn)逐層展開(kāi),找到翻頁(yè)標記所在的節點(diǎn),這里指的是翻頁(yè)按鈕的文本節點(diǎn)或屬性值節點(diǎn),右擊節點(diǎn)選擇“線(xiàn)索映射”-&gt;“標記映射”,爬蟲(chóng)路由中的“標記值”和“標記位置編號”會(huì )映射值和節點(diǎn)的編號。
  
  1.3、定位選項的默認項是數字id。由于不同頁(yè)碼的翻頁(yè)區的id值可能會(huì )發(fā)生變化,所以class值通常保持不變,所以最好改成preference class。
  
  四、保存規則并捕獲數據
  點(diǎn)擊保存規則,爬取數據,在DS計數器中查看翻頁(yè)是否成功。如果翻頁(yè)采集成功,會(huì )在本地DataScraperWorks文件夾中生成多個(gè)XML文件。詳見(jiàn)文章如何將采集中的xml文件轉換為Excel文件?”。

文章采集調用(文章采集調用webhookspider與ss-send等接口采集,提供開(kāi)源接口)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 143 次瀏覽 ? 2022-02-12 22:02 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(文章采集調用webhookspider與ss-send等接口采集,提供開(kāi)源接口)
  文章采集調用webhookspider與ss-send等接口采集,提供開(kāi)源接口可以用在線(xiàn)-stats-api,
  第一,用golang寫(xiě)爬蟲(chóng),只要你熟悉golang一個(gè)星期學(xué)習就會(huì )了。這是我用過(guò)比較容易上手的一門(mén)語(yǔ)言,速度也快。但是,我現在是用ruby開(kāi)發(fā)爬蟲(chóng)。第二,推薦比較有名的gayhub上的一個(gè)開(kāi)源爬蟲(chóng)工具pokes,開(kāi)源,成熟。我用這個(gè)爬蟲(chóng)可以發(fā)布在快手、陌陌、探探、趣頭條等等。這個(gè)應該適合題主,如果有疑問(wèn)可以到pokesgithub頁(yè)面上留言。
  其實(shí)你就是想了解scrapy可以做到什么效果唄,請移步各種flatpages,各種scrapy示例和教程(xwliwubo/scrapy-doc:focusinlightweightscrapydocumentation),里面有很多入門(mén)介紹、數據加載和處理等等的算法、規則等等python程序員比較常用的庫,前端爬蟲(chóng)基本上也是通過(guò)python+beautifulsoup處理圖片、正則表達式等等。
  根據經(jīng)驗,大部分抓取的數據都可以用現成的庫封裝好,或者自己封裝python程序庫,最后通過(guò)工具鏈發(fā)送出去。
  可以看下我們公司出的這個(gè)爬蟲(chóng)系列教程,通俗易懂,分門(mén)別類(lèi)全面的講解了爬蟲(chóng)基礎、高效爬蟲(chóng)、scrapy快速入門(mén)及開(kāi)發(fā)等內容, 查看全部

  文章采集調用(文章采集調用webhookspider與ss-send等接口采集,提供開(kāi)源接口)
  文章采集調用webhookspider與ss-send等接口采集,提供開(kāi)源接口可以用在線(xiàn)-stats-api,
  第一,用golang寫(xiě)爬蟲(chóng),只要你熟悉golang一個(gè)星期學(xué)習就會(huì )了。這是我用過(guò)比較容易上手的一門(mén)語(yǔ)言,速度也快。但是,我現在是用ruby開(kāi)發(fā)爬蟲(chóng)。第二,推薦比較有名的gayhub上的一個(gè)開(kāi)源爬蟲(chóng)工具pokes,開(kāi)源,成熟。我用這個(gè)爬蟲(chóng)可以發(fā)布在快手、陌陌、探探、趣頭條等等。這個(gè)應該適合題主,如果有疑問(wèn)可以到pokesgithub頁(yè)面上留言。
  其實(shí)你就是想了解scrapy可以做到什么效果唄,請移步各種flatpages,各種scrapy示例和教程(xwliwubo/scrapy-doc:focusinlightweightscrapydocumentation),里面有很多入門(mén)介紹、數據加載和處理等等的算法、規則等等python程序員比較常用的庫,前端爬蟲(chóng)基本上也是通過(guò)python+beautifulsoup處理圖片、正則表達式等等。
  根據經(jīng)驗,大部分抓取的數據都可以用現成的庫封裝好,或者自己封裝python程序庫,最后通過(guò)工具鏈發(fā)送出去。
  可以看下我們公司出的這個(gè)爬蟲(chóng)系列教程,通俗易懂,分門(mén)別類(lèi)全面的講解了爬蟲(chóng)基礎、高效爬蟲(chóng)、scrapy快速入門(mén)及開(kāi)發(fā)等內容,

文章采集調用(如何直接在nodejs頁(yè)面中訪(fǎng)問(wèn)splash頁(yè)面上訪(fǎng)問(wèn)頁(yè)面)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 127 次瀏覽 ? 2022-02-11 17:06 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(如何直接在nodejs頁(yè)面中訪(fǎng)問(wèn)splash頁(yè)面上訪(fǎng)問(wèn)頁(yè)面)
  文章采集調用splash開(kāi)發(fā)通用githubpage的功能都采用wordpress編寫(xiě)。優(yōu)點(diǎn)是可擴展性強,通用性高,還可以像zendfish這種hook機制擴展各種參數及解析得到的github頁(yè)面。缺點(diǎn)是部署維護比較麻煩,且不像freelancer社區推崇的快速制作插件。對于vscode這種在線(xiàn)visualstudio可運行于瀏覽器上的編輯器支持一般,且ppt幾乎就是在nodejs上做的。
  訪(fǎng)問(wèn)官網(wǎng)可以直接在nodejs頁(yè)面中搜索splashpageforwordpress安裝擴展。下載地址,查看sfbeta版本,下載之后wordpress插件安裝好了,可以通過(guò)安裝npm包來(lái)創(chuàng )建github頁(yè)面。如何直接在nodejs頁(yè)面中訪(fǎng)問(wèn)splash頁(yè)面:wordpress-splash-page文章編輯器使用wordpress開(kāi)發(fā)的編輯器,也就是onepagebutton這種方式。
  優(yōu)點(diǎn)是可以復用原來(lái)的vue的頁(yè)面結構,同時(shí)方便維護及更換其他wordpress插件。缺點(diǎn)是nodejs支持度太差,如果你要追求巨大的流量,你就不用想其他插件的安裝和運行了。同時(shí)你要有一定的開(kāi)發(fā)語(yǔ)言和運行環(huán)境基礎。對于vscode這種在線(xiàn)visualstudio可運行于瀏覽器上的編輯器支持一般,且ppt幾乎就是在nodejs上做的。
  訪(fǎng)問(wèn)官網(wǎng)可以直接在nodejs頁(yè)面中訪(fǎng)問(wèn)splash頁(yè)面。安裝php開(kāi)發(fā)工具。沒(méi)有解決nodejs兼容性問(wèn)題。也就是數據類(lèi)型顯示的各種問(wèn)題,為了避免這個(gè)問(wèn)題,可以把php安裝類(lèi)型設置為bash及gvim等visualstudio支持的編輯器。對于vscode這種在線(xiàn)visualstudio可運行于瀏覽器上的編輯器支持一般,且ppt幾乎就是在nodejs上做的。
  訪(fǎng)問(wèn)官網(wǎng)可以直接在nodejs頁(yè)面中訪(fǎng)問(wèn)splash頁(yè)面。引入wordpress開(kāi)發(fā)的url模板文件。對于php的splash頁(yè)面而言,是用ruby\java\go或wordpress.php等路徑來(lái)定義的頁(yè)面。而對于ps/ppt等其他圖形語(yǔ)言而言,是用pathname來(lái)定義頁(yè)面,如下圖所示:1.在php/extensions/urls.php中添加相應的url資源路徑,重定向到對應頁(yè)面。
  最后在瀏覽器訪(fǎng)問(wèn)/splash/可以訪(fǎng)問(wèn)以上頁(yè)面。2.在php/extensions/urls.php中添加相應的url資源路徑,重定向到對應頁(yè)面。最后在瀏覽器訪(fǎng)問(wèn)/splash/可以訪(fǎng)問(wèn)以上頁(yè)面。3.加入瀏覽器loading緩存,如果瀏覽器都是在vscode環(huán)境下運行,那么跳轉到頁(yè)面cd,wordpress這種在線(xiàn)visualstudio可運行于瀏覽器上的編輯器就會(huì )重定向在php端。
  4.使用spacerebug插件掃描瀏覽器loading緩存記錄如果你的wordpress擁有loading緩存功能,那么可以?huà)呙铻g覽器的loading緩存記錄,這樣當訪(fǎng)問(wèn)該鏈接時(shí),前端代碼就不需要后端代碼來(lái)初始化你的請求,就可以在瀏覽器端安全地訪(fǎng)問(wèn)你要爬取的頁(yè)面。githubpie這個(gè)插件。 查看全部

  文章采集調用(如何直接在nodejs頁(yè)面中訪(fǎng)問(wèn)splash頁(yè)面上訪(fǎng)問(wèn)頁(yè)面)
  文章采集調用splash開(kāi)發(fā)通用githubpage的功能都采用wordpress編寫(xiě)。優(yōu)點(diǎn)是可擴展性強,通用性高,還可以像zendfish這種hook機制擴展各種參數及解析得到的github頁(yè)面。缺點(diǎn)是部署維護比較麻煩,且不像freelancer社區推崇的快速制作插件。對于vscode這種在線(xiàn)visualstudio可運行于瀏覽器上的編輯器支持一般,且ppt幾乎就是在nodejs上做的。
  訪(fǎng)問(wèn)官網(wǎng)可以直接在nodejs頁(yè)面中搜索splashpageforwordpress安裝擴展。下載地址,查看sfbeta版本,下載之后wordpress插件安裝好了,可以通過(guò)安裝npm包來(lái)創(chuàng )建github頁(yè)面。如何直接在nodejs頁(yè)面中訪(fǎng)問(wèn)splash頁(yè)面:wordpress-splash-page文章編輯器使用wordpress開(kāi)發(fā)的編輯器,也就是onepagebutton這種方式。
  優(yōu)點(diǎn)是可以復用原來(lái)的vue的頁(yè)面結構,同時(shí)方便維護及更換其他wordpress插件。缺點(diǎn)是nodejs支持度太差,如果你要追求巨大的流量,你就不用想其他插件的安裝和運行了。同時(shí)你要有一定的開(kāi)發(fā)語(yǔ)言和運行環(huán)境基礎。對于vscode這種在線(xiàn)visualstudio可運行于瀏覽器上的編輯器支持一般,且ppt幾乎就是在nodejs上做的。
  訪(fǎng)問(wèn)官網(wǎng)可以直接在nodejs頁(yè)面中訪(fǎng)問(wèn)splash頁(yè)面。安裝php開(kāi)發(fā)工具。沒(méi)有解決nodejs兼容性問(wèn)題。也就是數據類(lèi)型顯示的各種問(wèn)題,為了避免這個(gè)問(wèn)題,可以把php安裝類(lèi)型設置為bash及gvim等visualstudio支持的編輯器。對于vscode這種在線(xiàn)visualstudio可運行于瀏覽器上的編輯器支持一般,且ppt幾乎就是在nodejs上做的。
  訪(fǎng)問(wèn)官網(wǎng)可以直接在nodejs頁(yè)面中訪(fǎng)問(wèn)splash頁(yè)面。引入wordpress開(kāi)發(fā)的url模板文件。對于php的splash頁(yè)面而言,是用ruby\java\go或wordpress.php等路徑來(lái)定義的頁(yè)面。而對于ps/ppt等其他圖形語(yǔ)言而言,是用pathname來(lái)定義頁(yè)面,如下圖所示:1.在php/extensions/urls.php中添加相應的url資源路徑,重定向到對應頁(yè)面。
  最后在瀏覽器訪(fǎng)問(wèn)/splash/可以訪(fǎng)問(wèn)以上頁(yè)面。2.在php/extensions/urls.php中添加相應的url資源路徑,重定向到對應頁(yè)面。最后在瀏覽器訪(fǎng)問(wèn)/splash/可以訪(fǎng)問(wèn)以上頁(yè)面。3.加入瀏覽器loading緩存,如果瀏覽器都是在vscode環(huán)境下運行,那么跳轉到頁(yè)面cd,wordpress這種在線(xiàn)visualstudio可運行于瀏覽器上的編輯器就會(huì )重定向在php端。
  4.使用spacerebug插件掃描瀏覽器loading緩存記錄如果你的wordpress擁有loading緩存功能,那么可以?huà)呙铻g覽器的loading緩存記錄,這樣當訪(fǎng)問(wèn)該鏈接時(shí),前端代碼就不需要后端代碼來(lái)初始化你的請求,就可以在瀏覽器端安全地訪(fǎng)問(wèn)你要爬取的頁(yè)面。githubpie這個(gè)插件。

文章采集調用(爬蟲(chóng)應該怎么進(jìn)行測試?的測試方法應該如何進(jìn)行?)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 127 次瀏覽 ? 2022-02-10 13:18 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(爬蟲(chóng)應該怎么進(jìn)行測試?的測試方法應該如何進(jìn)行?)
  很多同學(xué)不知道應該如何測試爬蟲(chóng)。我也是剛接觸一點(diǎn)爬蟲(chóng)測試的新手。通過(guò)對爬蟲(chóng)的分析,總結了爬蟲(chóng)的測試方法。其他建議歡迎補充。
  一、測試階段
  對于data采集調用第三方平臺(比如scorpion)的流程大家可能比較熟悉。在第三方頁(yè)面授權后,第三方會(huì )幫我們完成data采集的任務(wù)。我們只需要等待結果被回調。但是如果要自己做爬蟲(chóng),又是一個(gè)什么樣的過(guò)程呢?
  其實(shí)爬蟲(chóng)和其他業(yè)務(wù)一樣,也是有流程的。一般是先觸發(fā)創(chuàng )建任務(wù),爬蟲(chóng)模塊對數據采集進(jìn)行處理,采集完成后,對數據進(jìn)行解析和存儲。對于授權爬蟲(chóng)來(lái)說(shuō),有SDK頁(yè)面的也可以直接通過(guò)頁(yè)面進(jìn)行請求,其他的只能通過(guò)請求接口實(shí)現。還有一種爬蟲(chóng),在后臺配置好任務(wù)后,會(huì )定期去網(wǎng)站爬取數據,更新數據庫。當然還有很多其他的交互邏輯,每一步都需要分析評估。
  因此,我們可以從創(chuàng )建任務(wù)的界面入手,連接整個(gè)流程,在界面的響應中加入簡(jiǎn)單的驗證。比如創(chuàng )建任務(wù)后有任務(wù)編號,通過(guò)查詢(xún)接口可以得到任務(wù)的結果數據。然后檢查數據是否存儲,存儲是否準確,是否會(huì )出現亂碼等。從界面入手的好處是我們可以自動(dòng)化檢查爬蟲(chóng)任務(wù),檢查數據是否可以創(chuàng )建,是否爬蟲(chóng)能否正常爬取,爬取結果是否入庫。解析的邏輯和存儲的準確性需要注意。爬蟲(chóng)結果數據的存儲與數據分析和應用有關(guān)。對于數據分析,如果源數據有誤,那么無(wú)論分析結果如何,都是沒(méi)有意義的。.
  
  總結
  1.接口測試,調用數據接口采集,測試爬蟲(chóng)進(jìn)程;接口基礎測試和弱網(wǎng)、接口安全、接口性能等。
  2.可以通過(guò)接口或者SDK測試場(chǎng)景,包括爬取成功的場(chǎng)景和失敗的場(chǎng)景,比如無(wú)數據和無(wú)效數據。
  3.完成采集后的分析和存儲測試,數據分析和存儲邏輯檢查。
  4.異常測試,主要針對系統間交互的處理邏輯,如失敗重試機制、服務(wù)間容錯機制等。
  5.爬蟲(chóng)質(zhì)量和效率,主要從整體設計和代碼實(shí)現來(lái)分析爬蟲(chóng)的處理方式是否高可用。
  二、在線(xiàn)階段
  一旦爬蟲(chóng)上線(xiàn)供其他業(yè)務(wù)方使用,就需要保證可用性和可靠性。對于爬蟲(chóng)來(lái)說(shuō),在線(xiàn)監控非常重要!不僅要保證提供的爬蟲(chóng)能夠正常運行,還要保證出現異常時(shí),能夠在最短的時(shí)間內解決。因此,監測應從以下三個(gè)方面入手:
  1.在線(xiàn)運行接口腳本監控提供的接口可以正常使用,而不是等業(yè)務(wù)方調整好基礎接口,再反饋修復,成本比較大。主動(dòng)調整界面,判斷程序是否正常。您只能驗證該接口是否可以運行。如果條件允許,在線(xiàn)運行真實(shí)數據并驗證結果。
  2.監控線(xiàn)上發(fā)生的異常情況,如創(chuàng )建任務(wù)失敗、登錄失敗、數據采集失敗、數據解析失敗、回調失敗、數據存儲失敗等。發(fā)展應盡快查明原因,盡快找到解決。
  3.監控目標網(wǎng)站的狀態(tài),可以通過(guò)web自動(dòng)監控目標網(wǎng)站是否可用,是否發(fā)生變化等。
  對于爬蟲(chóng)來(lái)說(shuō),穩定性很重要,但是很多不可控的因素會(huì )導致爬蟲(chóng)的成功率下降。通過(guò)采取良好的監控和預防措施,我們可以將事故發(fā)生時(shí)的風(fēng)險降到最低。 查看全部

  文章采集調用(爬蟲(chóng)應該怎么進(jìn)行測試?的測試方法應該如何進(jìn)行?)
  很多同學(xué)不知道應該如何測試爬蟲(chóng)。我也是剛接觸一點(diǎn)爬蟲(chóng)測試的新手。通過(guò)對爬蟲(chóng)的分析,總結了爬蟲(chóng)的測試方法。其他建議歡迎補充。
  一、測試階段
  對于data采集調用第三方平臺(比如scorpion)的流程大家可能比較熟悉。在第三方頁(yè)面授權后,第三方會(huì )幫我們完成data采集的任務(wù)。我們只需要等待結果被回調。但是如果要自己做爬蟲(chóng),又是一個(gè)什么樣的過(guò)程呢?
  其實(shí)爬蟲(chóng)和其他業(yè)務(wù)一樣,也是有流程的。一般是先觸發(fā)創(chuàng )建任務(wù),爬蟲(chóng)模塊對數據采集進(jìn)行處理,采集完成后,對數據進(jìn)行解析和存儲。對于授權爬蟲(chóng)來(lái)說(shuō),有SDK頁(yè)面的也可以直接通過(guò)頁(yè)面進(jìn)行請求,其他的只能通過(guò)請求接口實(shí)現。還有一種爬蟲(chóng),在后臺配置好任務(wù)后,會(huì )定期去網(wǎng)站爬取數據,更新數據庫。當然還有很多其他的交互邏輯,每一步都需要分析評估。
  因此,我們可以從創(chuàng )建任務(wù)的界面入手,連接整個(gè)流程,在界面的響應中加入簡(jiǎn)單的驗證。比如創(chuàng )建任務(wù)后有任務(wù)編號,通過(guò)查詢(xún)接口可以得到任務(wù)的結果數據。然后檢查數據是否存儲,存儲是否準確,是否會(huì )出現亂碼等。從界面入手的好處是我們可以自動(dòng)化檢查爬蟲(chóng)任務(wù),檢查數據是否可以創(chuàng )建,是否爬蟲(chóng)能否正常爬取,爬取結果是否入庫。解析的邏輯和存儲的準確性需要注意。爬蟲(chóng)結果數據的存儲與數據分析和應用有關(guān)。對于數據分析,如果源數據有誤,那么無(wú)論分析結果如何,都是沒(méi)有意義的。.
  
  總結
  1.接口測試,調用數據接口采集,測試爬蟲(chóng)進(jìn)程;接口基礎測試和弱網(wǎng)、接口安全、接口性能等。
  2.可以通過(guò)接口或者SDK測試場(chǎng)景,包括爬取成功的場(chǎng)景和失敗的場(chǎng)景,比如無(wú)數據和無(wú)效數據。
  3.完成采集后的分析和存儲測試,數據分析和存儲邏輯檢查。
  4.異常測試,主要針對系統間交互的處理邏輯,如失敗重試機制、服務(wù)間容錯機制等。
  5.爬蟲(chóng)質(zhì)量和效率,主要從整體設計和代碼實(shí)現來(lái)分析爬蟲(chóng)的處理方式是否高可用。
  二、在線(xiàn)階段
  一旦爬蟲(chóng)上線(xiàn)供其他業(yè)務(wù)方使用,就需要保證可用性和可靠性。對于爬蟲(chóng)來(lái)說(shuō),在線(xiàn)監控非常重要!不僅要保證提供的爬蟲(chóng)能夠正常運行,還要保證出現異常時(shí),能夠在最短的時(shí)間內解決。因此,監測應從以下三個(gè)方面入手:
  1.在線(xiàn)運行接口腳本監控提供的接口可以正常使用,而不是等業(yè)務(wù)方調整好基礎接口,再反饋修復,成本比較大。主動(dòng)調整界面,判斷程序是否正常。您只能驗證該接口是否可以運行。如果條件允許,在線(xiàn)運行真實(shí)數據并驗證結果。
  2.監控線(xiàn)上發(fā)生的異常情況,如創(chuàng )建任務(wù)失敗、登錄失敗、數據采集失敗、數據解析失敗、回調失敗、數據存儲失敗等。發(fā)展應盡快查明原因,盡快找到解決。
  3.監控目標網(wǎng)站的狀態(tài),可以通過(guò)web自動(dòng)監控目標網(wǎng)站是否可用,是否發(fā)生變化等。
  對于爬蟲(chóng)來(lái)說(shuō),穩定性很重要,但是很多不可控的因素會(huì )導致爬蟲(chóng)的成功率下降。通過(guò)采取良好的監控和預防措施,我們可以將事故發(fā)生時(shí)的風(fēng)險降到最低。

文章采集調用(文章采集調用的高級設置-extensions-advanced-script查看userprofile以及timeline的計數)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 146 次瀏覽 ? 2022-02-10 05:05 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(文章采集調用的高級設置-extensions-advanced-script查看userprofile以及timeline的計數)
  文章采集調用的kpi_based_login接口(感謝@rhomy的指正),請在chrome的設置-高級設置-extensions-advanced-script查看userprofile以及timeline下面的計數。ps:建議讀者先看看官方文檔:-based-login安裝indexjs依賴(lài):這是個(gè)很大的坑,我建議直接在文章里面做腳本,webpack-plugin-script-advanced-script-start:先編譯vue-markouth.css,發(fā)布到indexjs項目:編譯的流程如下圖所示:編譯indexjs的源代碼:設置extensions的advancedscript:找到輸出中的userprofiles,點(diǎn)擊進(jìn)入login列表:點(diǎn)擊view,瀏覽器會(huì )顯示賬號的狀態(tài)(安全、非安全)以及一個(gè)cookie,用戶(hù)通過(guò)cookie的唯一標識:用戶(hù)輸入賬號密碼,只要輸入一次,賬號密碼可以推送到服務(wù)器,這樣就可以實(shí)現你需要的效果了。
  @吳澤龍回答里已經(jīng)給出了,我也補充一下他的誤區吧1.hookextensions只是為原來(lái)的需要抽樣的腳本提供了多一次構造時(shí)間戳的方法,應該是為了模擬類(lèi)似cookie/httpsocket這樣的事件。2.github的timeline瀏覽時(shí)點(diǎn)擊時(shí)間是按照kpi-id-login獲取的。一次構造一個(gè)時(shí)間戳,并且每個(gè)時(shí)間戳不重復3.時(shí)間戳的形式不知道是什么形式。
  你描述里面顯示的列表時(shí)間是datetime_index.html,kpi的時(shí)間戳是通過(guò)useragent獲取的時(shí)間戳,也是按照kpi-id-login獲取的。 查看全部

  文章采集調用(文章采集調用的高級設置-extensions-advanced-script查看userprofile以及timeline的計數)
  文章采集調用的kpi_based_login接口(感謝@rhomy的指正),請在chrome的設置-高級設置-extensions-advanced-script查看userprofile以及timeline下面的計數。ps:建議讀者先看看官方文檔:-based-login安裝indexjs依賴(lài):這是個(gè)很大的坑,我建議直接在文章里面做腳本,webpack-plugin-script-advanced-script-start:先編譯vue-markouth.css,發(fā)布到indexjs項目:編譯的流程如下圖所示:編譯indexjs的源代碼:設置extensions的advancedscript:找到輸出中的userprofiles,點(diǎn)擊進(jìn)入login列表:點(diǎn)擊view,瀏覽器會(huì )顯示賬號的狀態(tài)(安全、非安全)以及一個(gè)cookie,用戶(hù)通過(guò)cookie的唯一標識:用戶(hù)輸入賬號密碼,只要輸入一次,賬號密碼可以推送到服務(wù)器,這樣就可以實(shí)現你需要的效果了。
  @吳澤龍回答里已經(jīng)給出了,我也補充一下他的誤區吧1.hookextensions只是為原來(lái)的需要抽樣的腳本提供了多一次構造時(shí)間戳的方法,應該是為了模擬類(lèi)似cookie/httpsocket這樣的事件。2.github的timeline瀏覽時(shí)點(diǎn)擊時(shí)間是按照kpi-id-login獲取的。一次構造一個(gè)時(shí)間戳,并且每個(gè)時(shí)間戳不重復3.時(shí)間戳的形式不知道是什么形式。
  你描述里面顯示的列表時(shí)間是datetime_index.html,kpi的時(shí)間戳是通過(guò)useragent獲取的時(shí)間戳,也是按照kpi-id-login獲取的。

文章采集調用(無(wú)界數據來(lái)源于正則表達式Filter幫您解決數據的問(wèn)題!)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 210 次瀏覽 ? 2022-02-07 06:19 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(無(wú)界數據來(lái)源于正則表達式Filter幫您解決數據的問(wèn)題!)
  介紹
  
  AnyMetrics - 面向開(kāi)發(fā)人員的、聲明性的 Metrics 采集 和監控系統,可以對結構化和非結構化、有界和無(wú)界數據執行 采集,通過(guò)提取、過(guò)濾、邏輯運算等,將結果存儲起來(lái)在流行的監控系統或存儲引擎(如Prometheus、ES)中構建完整的監控系統,用grafana完成數據可視化
  數據采集、提取、過(guò)濾、存儲等都是由配置驅動(dòng),無(wú)需額外開(kāi)發(fā)。對應AnyMetrics,分別配置數據源、采集規則、采集器?;谶@些配置,AnyMetrics 將使用 pipeline 的方式自動(dòng)完成從 data采集 到數據存儲的所有工作
  對于有界數據的任務(wù),AnyMetrics 將以固定頻率從數據源中提取數據。AnyMetrics 具有內置的 MySQL 數據源。對于具有無(wú)限數據的任務(wù),AnyMetrics 會(huì )在一個(gè)時(shí)間窗口內從數據源中拉取數據。批量拉取數據,AnyMetrics 內置 Kafka 類(lèi)型無(wú)界數據源
  AnyMetrics的數據源可以是任何系統,例如可以將HTTP請求結果作為數據源,也可以將ES檢索結果作為數據源
  將非結構化數據轉換為結構化數據的目的,可以通過(guò)對數據源的原創(chuàng )數據進(jìn)行提取和過(guò)濾來(lái)實(shí)現。AnyMetrics 中有兩個(gè)內置的采集規則(Filter),正則表達式和 Spring EL 表達式。完成數據的提取和過(guò)濾,使用Spring EL表達式對原創(chuàng )數據和正則表達式提取后的數據完成邏輯運算。過(guò)濾器可單獨使用或組合使用。FilterChain的方式是順序執行的
  數據提取和過(guò)濾后,下一步就是將數據以指定的方式存儲在目標系統中。Prometheus 采集器內置于 AnyMetrics 中。通過(guò)定義 Metrics,可以將數據推送到 Prometheus 的 PushGateway。
  AnyMetrics 的采集器可以將數據推送到任何系統,例如 MySQL、ES 甚至是 WebHook
  無(wú)論是采集規則配置還是采集器配置,都可以通過(guò)可變配置來(lái)完成動(dòng)態(tài)配置的替換。變量數據來(lái)自正則表達式Filter,通過(guò)定義如(.*)可以得到一個(gè)名為$1的變量,有Spring EL的地方可以使用#$1來(lái)使用變量,其他地方可以使用$1使用變量,以滿(mǎn)足從數據提取到數據的重組或者操作操作,什么配置可以支持變量或者Spring EL表達式 根據采集規則和采集器的具體實(shí)現,Spring內置的表達式配置AnyMetrics 的 EL 過(guò)濾器和 Prometheus 采集器中的值配置支持 Spring EL 表達式和變量(#$1),
  AnyMetrics采用插件化設計方式,無(wú)論是數據源、采集規則還是采集器都可以擴展。甚至 AnyMetrics 中的內置插件也是以點(diǎn)對點(diǎn)的方式實(shí)現的。加載和使用什么插件完全由聲明決定。配置
  建筑學(xué)
  
  技術(shù)棧
  SpringBoot + Nacos + Vue + ElementUI
  安裝
  啟動(dòng)前需要安裝的依賴(lài)
  安裝 nacos(必填)
  安裝普羅米修斯(可選)
  安裝推送網(wǎng)關(guān)(可選)
  啟動(dòng)
  啟動(dòng) AnyMeitris
  1 mvn clean package
2 cd boot/target
3 java -Dnacos.address=nacos.ip:8848 -Dnacos.config.dataId=AnyMetricsConfig -Dnacos.config.group=config.app.AnyMetrics -Dauto=true -jar AnyMetrics-boot.jar
  啟動(dòng)參數說(shuō)明
  通過(guò) nacos.address 參數指定nacos地址
通過(guò) nacos.config.dataId 參數指定配置在nacos的dataId,默認值為 AnyMetricsConfig
通過(guò) nacos.config.group 參數指定配置在nacos的group,默認值為 DEFAULT
通過(guò) auto 參數控制任務(wù)是否自啟動(dòng),默認值為 false
  啟動(dòng)后訪(fǎng)問(wèn):8080/index.html
  如何配置
  1、選擇任務(wù)類(lèi)型
  
  2.1、有界數據
  
  選擇調度間隔,以秒為單位
  2.2、選擇數據源
  
  選擇數據源為mysql(目前只支持mysql),并完善相關(guān)配置
  3.1、無(wú)限數據
  
  輸入時(shí)間窗口,單位:秒
  3.2、選擇數據源
  
  選擇kafka作為數據源(目前只支持kafka),并完善相關(guān)配置
  4、采集規則
  
  過(guò)濾器支持兩種類(lèi)型,regular 和 el。在正則中使用括號來(lái)提取所需的變量。多個(gè)變量以 $1、$2 ... $N 的形式命名。在el中,可以使用_#$1 _變量來(lái)執行操作
  5、采集器
  
  選擇prometheus(目前只支持prometheus)并完善metrics相關(guān)配置信息,type支持gauge、counter、histogram類(lèi)型,labels支持$1變量,value支持Spring EL表達式變量操作
  運行任務(wù)
  1、開(kāi)始任務(wù)
  
  點(diǎn)擊開(kāi)始按鈕開(kāi)始任務(wù)
  2、查看運行日志
  
  點(diǎn)擊日志選項卡,查詢(xún)任務(wù)運行日志
  3、iframe
  
  點(diǎn)擊iframe Tab,將外部系統嵌入到任務(wù)中,比如將grafana的dashboard鏈接嵌入到系統中進(jìn)行展示
  4、停止任務(wù)
  
  單擊停止按鈕以停止任務(wù)
  例子
  示例一:APM 監控 - 采集 所有執行時(shí)間超過(guò) 3 秒的慢速鏈接并配置警報策略
  1、設置kafka為數據源
  從 kafka 讀取跟蹤日志
  {
"groupId":"anymetrics_apm_slow_trace",
"kafkaAddress":"192.168.0.1:9092",
"topic":"p_bigtracer_metric_log",
"type":"kafka"
}
  2、設置采集規則
  通話(huà)記錄是結構化數據,例如:
  1617953102329,operation-admin-web,10.8.60.41,RESOURCE_MYSQL_LOG,com.yxy.operation.dao.IHotBroadcastEpisodesDao.getNeedOnlineList,1,1,0,0,1
  因此,第一步是使用正則規則對數據進(jìn)行提取和過(guò)濾,對應的正則規則為:
  (.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?)
  提取的數據為:
  {
"$4":"RESOURCE_MYSQL_LOG",
"$5":"com.yxy.operation.dao.IHotBroadcastEpisodesDao.getNeedOnlineList",
"$6":"1",
"$7":"1",
"$10":"1",
"$8":"0",
"$9":"0",
"$1":"1617953102329",
"$2":"operation-admin-web",
"$3":"10.8.60.41"
}
  我們有 10 個(gè)變量,從 1 美元到 10 美元。由于我們監控的是超過(guò)3秒的慢速鏈接,我們只需要采集RT超過(guò)3秒的日志數據,所以我們需要定義一個(gè)邏輯運算表達式Filter,對應的EL表達式公式為:
  (new java.lang.Double(#$10) / #$6) > 3000
  其中#$10是鏈接的總響應時(shí)間,#$6是接口的總調用次數,先通過(guò)#$10/#$6運算得到平均RT,再通過(guò)(#$10/#$過(guò)濾掉3 6) &gt; 3000 幾秒內的慢速鏈接數據
  根據以上兩條采集規則,完整配置為:
  {
"timeWindow": 40,
"kind": "stream",
"filters": [
{
"expression": "(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\n",
"type": "regular"
},
{
"expression": "(new java.lang.Double(#$10) / #$6) > 3000",
"type": "el"
}
]
}
  3、設置采集器
  將數據采集到普羅米修斯
  {
"pushGateway": "192.168.0.1:9091",
"metrics": [
{
"help": "anymetrics_apm_slow_trace",
"labelNames": [
"application",
"type",
"endpoint"
],
"name": "anymetrics_apm_slow_trace",
"type": "gauge",
"value": "new java.lang.Double(#$10) / #$6",
"labels": [
"$2",
"$4",
"$5"
]
}
],
"type": "prometheus",
"job": "anymetrics_apm_slow_trace"
}
  promethus的metrics需要定義,名字是anymetrics_apm_slow_trace,類(lèi)型是gauge,lableNames使用application,type,endpoint,對應變量$2、$4、$5,因為響應時(shí)間采集RT,所以值為#$10 / #$6
  其中#$10是鏈接的總響應時(shí)間,#$6是接口的總調用次數,通過(guò)#$10/#$6的運算得到平均RT
  4、配置警報和可視化
  4.1 可視化
  打開(kāi)Grafana,創(chuàng )建一個(gè)Panel,選擇數據源為promethus,圖標類(lèi)型為Graph,在Metrics中輸入PromQL語(yǔ)法anymetrics_apm_slow_trace{}
  
  關(guān)于 PromQL 可以參考
  4.2 配置 Grafana 警報
  在面板中選擇警報選項卡以定義警報規則,例如:
  
  每 1m 評估 1m
  條件
  NoData 和錯誤處理
  通知
  一個(gè)比較完整的APM監控組合如下:
  通過(guò)調用鏈log采集不同維度的metrics,完成對鏈路RT、項目錯誤數、項目平均RT、鏈路RT分布等的多維度監控。
  
  示例2:可視化注冊用戶(hù)總數
  1、設置mysql為數據源
  根據sql查詢(xún)總用戶(hù)數
  {
"password": "root",
"jdbcurl": "jdbc:mysql://192.168.0.1:3306/user",
"type": "mysql",
"sql": "select count(1) from user",
"username": "root"
}
  2、設置采集規則
  根據sql查詢(xún)的結果,提取count(1),用正則表達式采集規則:
  {
"kind": "schedule",
"interval": 5,
"filters": [
{
"expression": "\\{\\\"count\\(1\\)\\\":(.*)\\}",
"type": "regular"
}
]
}
  3、設置采集器
  將數據采集到普羅米修斯
  {
"pushGateway": "192.168.0.1:9091",
"metrics": [
{
"help": "anymetrics_member_count",
"name": "anymetrics_member_count",
"type": "gauge",
"value": "#$1"
}
],
"type": "prometheus",
"job": "anymetrics_member_count"
}
  promethus的metrics需要定義,名字是anymetrics_member_count,類(lèi)型是gauge,因為只需要采集用戶(hù)總數,所以不需要定義labels和labelNames,值為#$1
  4、配置可視化
  打開(kāi)Grafana,創(chuàng )建一個(gè)Panel,選擇數據源為promethus,圖標類(lèi)型為Graph,在Metrics中輸入PromQL語(yǔ)法anymetrics_member_count{}
  
  示例 3:Nginx 日志監控
  Nginx請求延遲監控,Nginx狀態(tài)碼監控
  1、設置kafka為數據源
  使用 nginx access_log 日志
  {
"groupId":"anymetrics_nginx",
"kafkaAddress":"192.168.0.1:9092",
"topic":"nginx_access_log",
"type":"kafka"
}
  2、設置采集規則
  假設nginx的log_format配置如下:
  log_format main &#39;"$http_x_forwarded_for" $remote_addr - $remote_user [$time_local] $http_host "$request" &#39; &#39;$status $body_bytes_sent "$http_referer" &#39; &#39;"$http_user_agent" $upstream_addr $request_method $upstream_status $upstream_response_time&#39;;
  因此,在第一步中,使用正則Filter對數據進(jìn)行提取和過(guò)濾,對應的正則為:
  (.*?)\\s+(.*?)\\s+-(.*?)\\s+\\[(.*?)\\]\\s+(.*?)\\s+\\\"(.*?)\\s+(.*?)\\s+(.*?)\\s+\\\"?(\\d+)\\s+(\\d+)\\s\\\"(.*?)\\\"\\s+\\\"(.*?)\\\"\\s+(.*?)\\s+(.*?)\\s+(\\d+)\\s+(.*)",
  提取的數據為:
  $1:"-"
$2:192.168.198.17
$3: -
$4:13/Apr/2021:10:48:14 +0800
$5:dev.api.com
$6:POST
$7:/yxy-api-gateway/api/json/yuandouActivity/access
$8:HTTP/1.1"
$9:200
$10:87
$11:http://192.168.0.1:8100/yxy-ed ... 3D123
$12:Mozilla/5.0 (iPhone; CPU iPhone OS 13_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko)Mobile/15E148 MicroMessenger/7.0.11(0x17000b21)NetType/WIFI Language/zh_CN
$13:10.8.43.18:8080
$14:POST
$15:200
$16:0.005
  一共得到了16個(gè)變量,通過(guò)對比log_format就可以知道每個(gè)變量的含義
  完整的采集規則配置為:
  {
"timeWindow": 30,
"kind": "stream",
"filters": [
{
"expression": "(.*?)\\s+(.*?)\\s+-(.*?)\\s+\\[(.*?)\\]\\s+(.*?)\\s+\\\"(.*?)\\s+(.*?)\\s+(.*?)\\s+\\\"?(\\d+)\\s+(\\d+)\\s\\\"(.*?)\\\"\\s+\\\"(.*?)\\\"\\s+(.*?)\\s+(.*?)\\s+(\\d+)\\s+(.*)",
"type": "regular"
}
]
}
  3、設置采集器
  采集每個(gè)請求的響應時(shí)間和請求的狀態(tài)碼,并將數據存儲在promethus中
  {
"pushGateway": "192.168.0.1:9091",
"metrics": [
{
"help": "nginx_log_host_status",
"labelNames": [
"host",
"status"
],
"name": "nginx_log_host_status",
"type": "gauge",
"value": "1",
"labels": [
"$5",
"$9"
]
},
{
"help": "nginx_log_req_rt (seconds)",
"labelNames": [
"host",
"endpoint"
],
"name": "nginx_log_req_rt",
"type": "gauge",
"value": "new java.lang.Double(#$16)",
"labels": [
"$5",
"$7"
]
}
],
"type": "prometheus",
"job": "anymetrics_nginx_log"
}
  4、配置可視化
  Nginx狀態(tài)碼監控
  打開(kāi)Grafana,創(chuàng )建一個(gè)Panel,選擇數據源為promethus,圖標類(lèi)型為Graph,在Metrics中輸入PromQL語(yǔ)法nginx_log_host_status{}
  
  Nginx 請求延遲監控
  打開(kāi)Grafana,創(chuàng )建一個(gè)Panel,選擇數據源為promethus,圖標類(lèi)型為Graph,在Metrics中輸入PromQL語(yǔ)法nginx_log_req_rt{}
  
  問(wèn)答
  如何采集 APM 日志?
  如果系統中有調用鏈跟蹤系統,可以使用調用鏈日志,或者通過(guò)定義攔截器來(lái)記錄目標方法。定義好日志格式后,可以直接逐行打印,也可以在內存中聚合后以固定頻率打印,日志一般收錄RT延遲、錯誤/成功次數、端點(diǎn)、應用等關(guān)鍵數據。
  日志是如何采集到kafka的?
  可以使用filebeat采集nginx的access_log和tomcat的應用日志到kafka
  目前支持哪些數據源?
  有界數據目前支持mysql、http;無(wú)界數據目前支持kafka
  目前支持哪些采集器?
  目前只支持prometheus,使用pushgateway推送數據到prometheus
  如果我已經(jīng)使用了 Skywalking 和 Zipkin 等呼叫鏈跟蹤系統,是否需要使用 AnyMetrics?
  兩者之間沒(méi)有沖突。調用鏈跟蹤系統采集鏈路的調用關(guān)系和APM指標數據。AnyMetrics不僅可以將結構化調用鏈跟蹤系統的指標日志作為數據源來(lái)監控系統,還可以將結構化日志作為數據源來(lái)監控系統運行,比如監控一些Exception事件,還可以可視化或監控數據庫表數據。同時(shí),AnyMetrics 支持跨平臺系統,任何系統生成的日志都可以作為數據源。監控系統運行
  最后附上github項目地址: 查看全部

  文章采集調用(無(wú)界數據來(lái)源于正則表達式Filter幫您解決數據的問(wèn)題!)
  介紹
  
  AnyMetrics - 面向開(kāi)發(fā)人員的、聲明性的 Metrics 采集 和監控系統,可以對結構化和非結構化、有界和無(wú)界數據執行 采集,通過(guò)提取、過(guò)濾、邏輯運算等,將結果存儲起來(lái)在流行的監控系統或存儲引擎(如Prometheus、ES)中構建完整的監控系統,用grafana完成數據可視化
  數據采集、提取、過(guò)濾、存儲等都是由配置驅動(dòng),無(wú)需額外開(kāi)發(fā)。對應AnyMetrics,分別配置數據源、采集規則、采集器?;谶@些配置,AnyMetrics 將使用 pipeline 的方式自動(dòng)完成從 data采集 到數據存儲的所有工作
  對于有界數據的任務(wù),AnyMetrics 將以固定頻率從數據源中提取數據。AnyMetrics 具有內置的 MySQL 數據源。對于具有無(wú)限數據的任務(wù),AnyMetrics 會(huì )在一個(gè)時(shí)間窗口內從數據源中拉取數據。批量拉取數據,AnyMetrics 內置 Kafka 類(lèi)型無(wú)界數據源
  AnyMetrics的數據源可以是任何系統,例如可以將HTTP請求結果作為數據源,也可以將ES檢索結果作為數據源
  將非結構化數據轉換為結構化數據的目的,可以通過(guò)對數據源的原創(chuàng )數據進(jìn)行提取和過(guò)濾來(lái)實(shí)現。AnyMetrics 中有兩個(gè)內置的采集規則(Filter),正則表達式和 Spring EL 表達式。完成數據的提取和過(guò)濾,使用Spring EL表達式對原創(chuàng )數據和正則表達式提取后的數據完成邏輯運算。過(guò)濾器可單獨使用或組合使用。FilterChain的方式是順序執行的
  數據提取和過(guò)濾后,下一步就是將數據以指定的方式存儲在目標系統中。Prometheus 采集器內置于 AnyMetrics 中。通過(guò)定義 Metrics,可以將數據推送到 Prometheus 的 PushGateway。
  AnyMetrics 的采集器可以將數據推送到任何系統,例如 MySQL、ES 甚至是 WebHook
  無(wú)論是采集規則配置還是采集器配置,都可以通過(guò)可變配置來(lái)完成動(dòng)態(tài)配置的替換。變量數據來(lái)自正則表達式Filter,通過(guò)定義如(.*)可以得到一個(gè)名為$1的變量,有Spring EL的地方可以使用#$1來(lái)使用變量,其他地方可以使用$1使用變量,以滿(mǎn)足從數據提取到數據的重組或者操作操作,什么配置可以支持變量或者Spring EL表達式 根據采集規則和采集器的具體實(shí)現,Spring內置的表達式配置AnyMetrics 的 EL 過(guò)濾器和 Prometheus 采集器中的值配置支持 Spring EL 表達式和變量(#$1),
  AnyMetrics采用插件化設計方式,無(wú)論是數據源、采集規則還是采集器都可以擴展。甚至 AnyMetrics 中的內置插件也是以點(diǎn)對點(diǎn)的方式實(shí)現的。加載和使用什么插件完全由聲明決定。配置
  建筑學(xué)
  
  技術(shù)棧
  SpringBoot + Nacos + Vue + ElementUI
  安裝
  啟動(dòng)前需要安裝的依賴(lài)
  安裝 nacos(必填)
  安裝普羅米修斯(可選)
  安裝推送網(wǎng)關(guān)(可選)
  啟動(dòng)
  啟動(dòng) AnyMeitris
  1 mvn clean package
2 cd boot/target
3 java -Dnacos.address=nacos.ip:8848 -Dnacos.config.dataId=AnyMetricsConfig -Dnacos.config.group=config.app.AnyMetrics -Dauto=true -jar AnyMetrics-boot.jar
  啟動(dòng)參數說(shuō)明
  通過(guò) nacos.address 參數指定nacos地址
通過(guò) nacos.config.dataId 參數指定配置在nacos的dataId,默認值為 AnyMetricsConfig
通過(guò) nacos.config.group 參數指定配置在nacos的group,默認值為 DEFAULT
通過(guò) auto 參數控制任務(wù)是否自啟動(dòng),默認值為 false
  啟動(dòng)后訪(fǎng)問(wèn):8080/index.html
  如何配置
  1、選擇任務(wù)類(lèi)型
  
  2.1、有界數據
  
  選擇調度間隔,以秒為單位
  2.2、選擇數據源
  
  選擇數據源為mysql(目前只支持mysql),并完善相關(guān)配置
  3.1、無(wú)限數據
  
  輸入時(shí)間窗口,單位:秒
  3.2、選擇數據源
  
  選擇kafka作為數據源(目前只支持kafka),并完善相關(guān)配置
  4、采集規則
  
  過(guò)濾器支持兩種類(lèi)型,regular 和 el。在正則中使用括號來(lái)提取所需的變量。多個(gè)變量以 $1、$2 ... $N 的形式命名。在el中,可以使用_#$1 _變量來(lái)執行操作
  5、采集器
  
  選擇prometheus(目前只支持prometheus)并完善metrics相關(guān)配置信息,type支持gauge、counter、histogram類(lèi)型,labels支持$1變量,value支持Spring EL表達式變量操作
  運行任務(wù)
  1、開(kāi)始任務(wù)
  
  點(diǎn)擊開(kāi)始按鈕開(kāi)始任務(wù)
  2、查看運行日志
  
  點(diǎn)擊日志選項卡,查詢(xún)任務(wù)運行日志
  3、iframe
  
  點(diǎn)擊iframe Tab,將外部系統嵌入到任務(wù)中,比如將grafana的dashboard鏈接嵌入到系統中進(jìn)行展示
  4、停止任務(wù)
  
  單擊停止按鈕以停止任務(wù)
  例子
  示例一:APM 監控 - 采集 所有執行時(shí)間超過(guò) 3 秒的慢速鏈接并配置警報策略
  1、設置kafka為數據源
  從 kafka 讀取跟蹤日志
  {
"groupId":"anymetrics_apm_slow_trace",
"kafkaAddress":"192.168.0.1:9092",
"topic":"p_bigtracer_metric_log",
"type":"kafka"
}
  2、設置采集規則
  通話(huà)記錄是結構化數據,例如:
  1617953102329,operation-admin-web,10.8.60.41,RESOURCE_MYSQL_LOG,com.yxy.operation.dao.IHotBroadcastEpisodesDao.getNeedOnlineList,1,1,0,0,1
  因此,第一步是使用正則規則對數據進(jìn)行提取和過(guò)濾,對應的正則規則為:
  (.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?)
  提取的數據為:
  {
"$4":"RESOURCE_MYSQL_LOG",
"$5":"com.yxy.operation.dao.IHotBroadcastEpisodesDao.getNeedOnlineList",
"$6":"1",
"$7":"1",
"$10":"1",
"$8":"0",
"$9":"0",
"$1":"1617953102329",
"$2":"operation-admin-web",
"$3":"10.8.60.41"
}
  我們有 10 個(gè)變量,從 1 美元到 10 美元。由于我們監控的是超過(guò)3秒的慢速鏈接,我們只需要采集RT超過(guò)3秒的日志數據,所以我們需要定義一個(gè)邏輯運算表達式Filter,對應的EL表達式公式為:
  (new java.lang.Double(#$10) / #$6) > 3000
  其中#$10是鏈接的總響應時(shí)間,#$6是接口的總調用次數,先通過(guò)#$10/#$6運算得到平均RT,再通過(guò)(#$10/#$過(guò)濾掉3 6) &gt; 3000 幾秒內的慢速鏈接數據
  根據以上兩條采集規則,完整配置為:
  {
"timeWindow": 40,
"kind": "stream",
"filters": [
{
"expression": "(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\n",
"type": "regular"
},
{
"expression": "(new java.lang.Double(#$10) / #$6) > 3000",
"type": "el"
}
]
}
  3、設置采集器
  將數據采集到普羅米修斯
  {
"pushGateway": "192.168.0.1:9091",
"metrics": [
{
"help": "anymetrics_apm_slow_trace",
"labelNames": [
"application",
"type",
"endpoint"
],
"name": "anymetrics_apm_slow_trace",
"type": "gauge",
"value": "new java.lang.Double(#$10) / #$6",
"labels": [
"$2",
"$4",
"$5"
]
}
],
"type": "prometheus",
"job": "anymetrics_apm_slow_trace"
}
  promethus的metrics需要定義,名字是anymetrics_apm_slow_trace,類(lèi)型是gauge,lableNames使用application,type,endpoint,對應變量$2、$4、$5,因為響應時(shí)間采集RT,所以值為#$10 / #$6
  其中#$10是鏈接的總響應時(shí)間,#$6是接口的總調用次數,通過(guò)#$10/#$6的運算得到平均RT
  4、配置警報和可視化
  4.1 可視化
  打開(kāi)Grafana,創(chuàng )建一個(gè)Panel,選擇數據源為promethus,圖標類(lèi)型為Graph,在Metrics中輸入PromQL語(yǔ)法anymetrics_apm_slow_trace{}
  
  關(guān)于 PromQL 可以參考
  4.2 配置 Grafana 警報
  在面板中選擇警報選項卡以定義警報規則,例如:
  
  每 1m 評估 1m
  條件
  NoData 和錯誤處理
  通知
  一個(gè)比較完整的APM監控組合如下:
  通過(guò)調用鏈log采集不同維度的metrics,完成對鏈路RT、項目錯誤數、項目平均RT、鏈路RT分布等的多維度監控。
  
  示例2:可視化注冊用戶(hù)總數
  1、設置mysql為數據源
  根據sql查詢(xún)總用戶(hù)數
  {
"password": "root",
"jdbcurl": "jdbc:mysql://192.168.0.1:3306/user",
"type": "mysql",
"sql": "select count(1) from user",
"username": "root"
}
  2、設置采集規則
  根據sql查詢(xún)的結果,提取count(1),用正則表達式采集規則:
  {
"kind": "schedule",
"interval": 5,
"filters": [
{
"expression": "\\{\\\"count\\(1\\)\\\":(.*)\\}",
"type": "regular"
}
]
}
  3、設置采集器
  將數據采集到普羅米修斯
  {
"pushGateway": "192.168.0.1:9091",
"metrics": [
{
"help": "anymetrics_member_count",
"name": "anymetrics_member_count",
"type": "gauge",
"value": "#$1"
}
],
"type": "prometheus",
"job": "anymetrics_member_count"
}
  promethus的metrics需要定義,名字是anymetrics_member_count,類(lèi)型是gauge,因為只需要采集用戶(hù)總數,所以不需要定義labels和labelNames,值為#$1
  4、配置可視化
  打開(kāi)Grafana,創(chuàng )建一個(gè)Panel,選擇數據源為promethus,圖標類(lèi)型為Graph,在Metrics中輸入PromQL語(yǔ)法anymetrics_member_count{}
  
  示例 3:Nginx 日志監控
  Nginx請求延遲監控,Nginx狀態(tài)碼監控
  1、設置kafka為數據源
  使用 nginx access_log 日志
  {
"groupId":"anymetrics_nginx",
"kafkaAddress":"192.168.0.1:9092",
"topic":"nginx_access_log",
"type":"kafka"
}
  2、設置采集規則
  假設nginx的log_format配置如下:
  log_format main &#39;"$http_x_forwarded_for" $remote_addr - $remote_user [$time_local] $http_host "$request" &#39; &#39;$status $body_bytes_sent "$http_referer" &#39; &#39;"$http_user_agent" $upstream_addr $request_method $upstream_status $upstream_response_time&#39;;
  因此,在第一步中,使用正則Filter對數據進(jìn)行提取和過(guò)濾,對應的正則為:
  (.*?)\\s+(.*?)\\s+-(.*?)\\s+\\[(.*?)\\]\\s+(.*?)\\s+\\\"(.*?)\\s+(.*?)\\s+(.*?)\\s+\\\"?(\\d+)\\s+(\\d+)\\s\\\"(.*?)\\\"\\s+\\\"(.*?)\\\"\\s+(.*?)\\s+(.*?)\\s+(\\d+)\\s+(.*)",
  提取的數據為:
  $1:"-"
$2:192.168.198.17
$3: -
$4:13/Apr/2021:10:48:14 +0800
$5:dev.api.com
$6:POST
$7:/yxy-api-gateway/api/json/yuandouActivity/access
$8:HTTP/1.1"
$9:200
$10:87
$11:http://192.168.0.1:8100/yxy-ed ... 3D123
$12:Mozilla/5.0 (iPhone; CPU iPhone OS 13_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko)Mobile/15E148 MicroMessenger/7.0.11(0x17000b21)NetType/WIFI Language/zh_CN
$13:10.8.43.18:8080
$14:POST
$15:200
$16:0.005
  一共得到了16個(gè)變量,通過(guò)對比log_format就可以知道每個(gè)變量的含義
  完整的采集規則配置為:
  {
"timeWindow": 30,
"kind": "stream",
"filters": [
{
"expression": "(.*?)\\s+(.*?)\\s+-(.*?)\\s+\\[(.*?)\\]\\s+(.*?)\\s+\\\"(.*?)\\s+(.*?)\\s+(.*?)\\s+\\\"?(\\d+)\\s+(\\d+)\\s\\\"(.*?)\\\"\\s+\\\"(.*?)\\\"\\s+(.*?)\\s+(.*?)\\s+(\\d+)\\s+(.*)",
"type": "regular"
}
]
}
  3、設置采集器
  采集每個(gè)請求的響應時(shí)間和請求的狀態(tài)碼,并將數據存儲在promethus中
  {
"pushGateway": "192.168.0.1:9091",
"metrics": [
{
"help": "nginx_log_host_status",
"labelNames": [
"host",
"status"
],
"name": "nginx_log_host_status",
"type": "gauge",
"value": "1",
"labels": [
"$5",
"$9"
]
},
{
"help": "nginx_log_req_rt (seconds)",
"labelNames": [
"host",
"endpoint"
],
"name": "nginx_log_req_rt",
"type": "gauge",
"value": "new java.lang.Double(#$16)",
"labels": [
"$5",
"$7"
]
}
],
"type": "prometheus",
"job": "anymetrics_nginx_log"
}
  4、配置可視化
  Nginx狀態(tài)碼監控
  打開(kāi)Grafana,創(chuàng )建一個(gè)Panel,選擇數據源為promethus,圖標類(lèi)型為Graph,在Metrics中輸入PromQL語(yǔ)法nginx_log_host_status{}
  
  Nginx 請求延遲監控
  打開(kāi)Grafana,創(chuàng )建一個(gè)Panel,選擇數據源為promethus,圖標類(lèi)型為Graph,在Metrics中輸入PromQL語(yǔ)法nginx_log_req_rt{}
  
  問(wèn)答
  如何采集 APM 日志?
  如果系統中有調用鏈跟蹤系統,可以使用調用鏈日志,或者通過(guò)定義攔截器來(lái)記錄目標方法。定義好日志格式后,可以直接逐行打印,也可以在內存中聚合后以固定頻率打印,日志一般收錄RT延遲、錯誤/成功次數、端點(diǎn)、應用等關(guān)鍵數據。
  日志是如何采集到kafka的?
  可以使用filebeat采集nginx的access_log和tomcat的應用日志到kafka
  目前支持哪些數據源?
  有界數據目前支持mysql、http;無(wú)界數據目前支持kafka
  目前支持哪些采集器?
  目前只支持prometheus,使用pushgateway推送數據到prometheus
  如果我已經(jīng)使用了 Skywalking 和 Zipkin 等呼叫鏈跟蹤系統,是否需要使用 AnyMetrics?
  兩者之間沒(méi)有沖突。調用鏈跟蹤系統采集鏈路的調用關(guān)系和APM指標數據。AnyMetrics不僅可以將結構化調用鏈跟蹤系統的指標日志作為數據源來(lái)監控系統,還可以將結構化日志作為數據源來(lái)監控系統運行,比如監控一些Exception事件,還可以可視化或監控數據庫表數據。同時(shí),AnyMetrics 支持跨平臺系統,任何系統生成的日志都可以作為數據源。監控系統運行
  最后附上github項目地址:

文章采集調用(講講如何在首頁(yè)和列表頁(yè)實(shí)時(shí)動(dòng)態(tài)調用文章點(diǎn)擊次數)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 133 次瀏覽 ? 2022-02-07 04:23 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(講講如何在首頁(yè)和列表頁(yè)實(shí)時(shí)動(dòng)態(tài)調用文章點(diǎn)擊次數)
  我們都知道,Dedecms中的首頁(yè)和列表頁(yè)的文章點(diǎn)擊默認不是動(dòng)態(tài)調用的,而是通過(guò)一個(gè)標簽來(lái)調用的,只有首頁(yè)之后才會(huì )更新點(diǎn)擊并生成列表頁(yè)面。頻率。但是有時(shí)候我們的網(wǎng)站更新不是那么頻繁,所以我們需要使用點(diǎn)擊的動(dòng)態(tài)調用。接下來(lái),織夢(mèng)技術(shù)研究中心將告訴你如何在首頁(yè)和列表頁(yè)面實(shí)時(shí)動(dòng)態(tài)調用文章@。&gt;點(diǎn)擊次數,具體方法如下:
  首先找到plus/count.php文件,復制并命名為viewclick.php,然后打開(kāi)文件,在里面找到如下代碼:
  
<a herf="http://www.genban.org" title="織夢(mèng)源碼">
if(!empty($maintable))
{
$dsql->ExecuteNoneQuery(" UPDATE `{$maintable}` SET click=click+1 WHERE {$idtype}=&#39;$aid&#39; ");
}
if(!empty($mid))
{
$dsql->ExecuteNoneQuery(" UPDATE `dede_member_tj` SET pagecount=pagecount+1 WHERE mid=&#39;$mid&#39; ");
}</a>
  刪除上面的代碼,然后在需要動(dòng)態(tài)調用點(diǎn)擊次數的首頁(yè)和列表頁(yè)面模板中添加如下代碼:
  
<a herf="http://www.genban.org" title="織夢(mèng)源碼">
</a>
  然后重新生成首頁(yè)和列表頁(yè),然后就可以實(shí)時(shí)動(dòng)態(tài)調用文章的點(diǎn)擊次數而不生成。 查看全部

  文章采集調用(講講如何在首頁(yè)和列表頁(yè)實(shí)時(shí)動(dòng)態(tài)調用文章點(diǎn)擊次數)
  我們都知道,Dedecms中的首頁(yè)和列表頁(yè)的文章點(diǎn)擊默認不是動(dòng)態(tài)調用的,而是通過(guò)一個(gè)標簽來(lái)調用的,只有首頁(yè)之后才會(huì )更新點(diǎn)擊并生成列表頁(yè)面。頻率。但是有時(shí)候我們的網(wǎng)站更新不是那么頻繁,所以我們需要使用點(diǎn)擊的動(dòng)態(tài)調用。接下來(lái),織夢(mèng)技術(shù)研究中心將告訴你如何在首頁(yè)和列表頁(yè)面實(shí)時(shí)動(dòng)態(tài)調用文章@。&gt;點(diǎn)擊次數,具體方法如下:
  首先找到plus/count.php文件,復制并命名為viewclick.php,然后打開(kāi)文件,在里面找到如下代碼:
  
<a herf="http://www.genban.org" title="織夢(mèng)源碼">
if(!empty($maintable))
{
$dsql->ExecuteNoneQuery(" UPDATE `{$maintable}` SET click=click+1 WHERE {$idtype}=&#39;$aid&#39; ");
}
if(!empty($mid))
{
$dsql->ExecuteNoneQuery(" UPDATE `dede_member_tj` SET pagecount=pagecount+1 WHERE mid=&#39;$mid&#39; ");
}</a>
  刪除上面的代碼,然后在需要動(dòng)態(tài)調用點(diǎn)擊次數的首頁(yè)和列表頁(yè)面模板中添加如下代碼:
  
<a herf="http://www.genban.org" title="織夢(mèng)源碼">
</a>
  然后重新生成首頁(yè)和列表頁(yè),然后就可以實(shí)時(shí)動(dòng)態(tài)調用文章的點(diǎn)擊次數而不生成。

文章采集調用(數據具體的采集方案是什么?四種數據采集方法對比 )

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 135 次瀏覽 ? 2022-03-02 08:11 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(數據具體的采集方案是什么?四種數據采集方法對比
)
  根據企業(yè)在生產(chǎn)經(jīng)營(yíng)過(guò)程中會(huì )產(chǎn)生的數據類(lèi)型,提供鏈接標簽、SDK和API三種采集方法,以及基于UTSE數據采集模型對用戶(hù)的整個(gè)生命周期。
  那么,數據的具體采集計劃是什么?
  
  四種數據采集方法對比
  Data采集是通過(guò)埋點(diǎn)實(shí)現的。諸葛io提供了非常完善的數據訪(fǎng)問(wèn)解決方案,支持代碼埋、全埋、可視埋、服務(wù)端埋等數據采集方式。
  1.代碼被埋沒(méi)
  說(shuō)明:嵌入SDK定義事件和添加事件代碼是一種常用的數據采集方法,主要包括網(wǎng)頁(yè)和h5頁(yè)面的JS嵌入、移動(dòng)端的iOS和Android嵌入、微信小程序等。
  優(yōu)點(diǎn):按需采集,業(yè)務(wù)信息更全,數據分析更專(zhuān)注,數據采集全面準確,便于后續深入分析。
  缺點(diǎn):需要研發(fā)人員配合,有一定的工作量。
  2.全葬
  說(shuō)明:通過(guò)SDK自動(dòng)采集頁(yè)面所有可點(diǎn)擊元素的操作數據,無(wú)需定義事件,適用于活動(dòng)頁(yè)面、登陸頁(yè)面、關(guān)鍵頁(yè)面的設計體驗測量。
  優(yōu)點(diǎn):更簡(jiǎn)單快捷,可以看到頁(yè)面元素的點(diǎn)擊,更好的了解自己產(chǎn)品的特點(diǎn)。
  缺點(diǎn):采集的數據太多,只要是可點(diǎn)擊的元素就會(huì )是采集,上傳數據很多,消耗流量也很大。無(wú)法采集到更深層次的維度信息,比如事件的屬性、用戶(hù)的屬性等。
  3.可視化埋點(diǎn)
  注意:視覺(jué)嵌入基于完全嵌入。技術(shù)同事整合后,業(yè)務(wù)同事需要圈出頁(yè)面的元素,選中的元素會(huì )是采集。
  優(yōu)點(diǎn):基于接口配置,無(wú)需開(kāi)發(fā),易于更新,快速生效。
  缺點(diǎn):對自定義屬性的支持范圍有限;重構或頁(yè)面更改時(shí)需要重新配置。
  4.服務(wù)器埋點(diǎn)
  描述:通過(guò)API對存儲在服務(wù)器上的數據進(jìn)行結構化處理,通過(guò)接口調用其他業(yè)務(wù)數據采集和集成,比如CRM等用戶(hù)數據,對數據進(jìn)行結構化處理,即適合擁有 采集 @采集 能力客戶(hù)端的用戶(hù)。
  優(yōu)點(diǎn):服務(wù)端embedding更有針對性,數據更準確,減少編碼embedding的發(fā)布過(guò)程,數據上傳更及時(shí)。
  缺點(diǎn):用戶(hù)的一些簡(jiǎn)單操作,比如點(diǎn)擊按鈕、切換模塊,這些數據不能采集,用戶(hù)行為不夠完整。
  總結:以上是諸葛io提供的四種data采集解決方案:code embedding、full embedding、visual embedding、server embedding,data采集目的是為了滿(mǎn)足采集詳細分析和操作然后執行需求。只有能夠達到這個(gè)目標,才有可能選擇一種或多種采集形式的組合。在企業(yè)業(yè)務(wù)中,選擇哪種采集方式要根據企業(yè)自身的具體業(yè)務(wù)需求來(lái)決定。
   查看全部

  文章采集調用(數據具體的采集方案是什么?四種數據采集方法對比
)
  根據企業(yè)在生產(chǎn)經(jīng)營(yíng)過(guò)程中會(huì )產(chǎn)生的數據類(lèi)型,提供鏈接標簽、SDK和API三種采集方法,以及基于UTSE數據采集模型對用戶(hù)的整個(gè)生命周期。
  那么,數據的具體采集計劃是什么?
  
  四種數據采集方法對比
  Data采集是通過(guò)埋點(diǎn)實(shí)現的。諸葛io提供了非常完善的數據訪(fǎng)問(wèn)解決方案,支持代碼埋、全埋、可視埋、服務(wù)端埋等數據采集方式。
  1.代碼被埋沒(méi)
  說(shuō)明:嵌入SDK定義事件和添加事件代碼是一種常用的數據采集方法,主要包括網(wǎng)頁(yè)和h5頁(yè)面的JS嵌入、移動(dòng)端的iOS和Android嵌入、微信小程序等。
  優(yōu)點(diǎn):按需采集,業(yè)務(wù)信息更全,數據分析更專(zhuān)注,數據采集全面準確,便于后續深入分析。
  缺點(diǎn):需要研發(fā)人員配合,有一定的工作量。
  2.全葬
  說(shuō)明:通過(guò)SDK自動(dòng)采集頁(yè)面所有可點(diǎn)擊元素的操作數據,無(wú)需定義事件,適用于活動(dòng)頁(yè)面、登陸頁(yè)面、關(guān)鍵頁(yè)面的設計體驗測量。
  優(yōu)點(diǎn):更簡(jiǎn)單快捷,可以看到頁(yè)面元素的點(diǎn)擊,更好的了解自己產(chǎn)品的特點(diǎn)。
  缺點(diǎn):采集的數據太多,只要是可點(diǎn)擊的元素就會(huì )是采集,上傳數據很多,消耗流量也很大。無(wú)法采集到更深層次的維度信息,比如事件的屬性、用戶(hù)的屬性等。
  3.可視化埋點(diǎn)
  注意:視覺(jué)嵌入基于完全嵌入。技術(shù)同事整合后,業(yè)務(wù)同事需要圈出頁(yè)面的元素,選中的元素會(huì )是采集。
  優(yōu)點(diǎn):基于接口配置,無(wú)需開(kāi)發(fā),易于更新,快速生效。
  缺點(diǎn):對自定義屬性的支持范圍有限;重構或頁(yè)面更改時(shí)需要重新配置。
  4.服務(wù)器埋點(diǎn)
  描述:通過(guò)API對存儲在服務(wù)器上的數據進(jìn)行結構化處理,通過(guò)接口調用其他業(yè)務(wù)數據采集和集成,比如CRM等用戶(hù)數據,對數據進(jìn)行結構化處理,即適合擁有 采集 @采集 能力客戶(hù)端的用戶(hù)。
  優(yōu)點(diǎn):服務(wù)端embedding更有針對性,數據更準確,減少編碼embedding的發(fā)布過(guò)程,數據上傳更及時(shí)。
  缺點(diǎn):用戶(hù)的一些簡(jiǎn)單操作,比如點(diǎn)擊按鈕、切換模塊,這些數據不能采集,用戶(hù)行為不夠完整。
  總結:以上是諸葛io提供的四種data采集解決方案:code embedding、full embedding、visual embedding、server embedding,data采集目的是為了滿(mǎn)足采集詳細分析和操作然后執行需求。只有能夠達到這個(gè)目標,才有可能選擇一種或多種采集形式的組合。在企業(yè)業(yè)務(wù)中,選擇哪種采集方式要根據企業(yè)自身的具體業(yè)務(wù)需求來(lái)決定。
  

文章采集調用(利用白帽SEO優(yōu)化方法快速提升網(wǎng)站權重值的方法有哪些)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 115 次瀏覽 ? 2022-03-01 19:02 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(利用白帽SEO優(yōu)化方法快速提升網(wǎng)站權重值的方法有哪些)
  文章采集,使得網(wǎng)站有內容,只有有內容才有可能被收錄推廣,只有收錄才能推廣能不能提高網(wǎng)站權重。 網(wǎng)站權重是對網(wǎng)站綜合價(jià)值的總稱(chēng),包括網(wǎng)站運營(yíng)能力、用戶(hù)體驗、內容質(zhì)量、用戶(hù)熱度、SEO指標。綜合性能統一名稱(chēng)。
  
  文章采集如何增加網(wǎng)站的權重:日常正規管理和運營(yíng)網(wǎng)站,使用正規白帽方法來(lái)操作網(wǎng)站,比如比如更新內容、檢查維護等等,這些都是站長(cháng)必須要做的事情。挖礦優(yōu)化精準關(guān)鍵詞,根據自己的網(wǎng)站行業(yè),挖礦優(yōu)化精準網(wǎng)站關(guān)鍵詞,必須有流量關(guān)鍵詞,如果挖礦關(guān)鍵詞@ >與網(wǎng)站的主題定位無(wú)關(guān),那么網(wǎng)站的權重就很難增加,甚至網(wǎng)站都會(huì )被搜索引擎懲罰。
  
  文章采集改進(jìn)網(wǎng)站和收錄的內容,網(wǎng)站收錄索引數據和網(wǎng)站的數量?jì)热莞率浅杀壤年P(guān)系,如果你長(cháng)時(shí)間不更新網(wǎng)站,那么你的網(wǎng)站索引數據不僅會(huì )增加還會(huì )減少。如果你想改進(jìn)網(wǎng)站網(wǎng)站@收錄的內容,那么你需要不斷更新網(wǎng)站的優(yōu)質(zhì)內容。
  
  同時(shí),站內和站外的SEO也需要做好。除了文章采集還要更新內容,內鏈優(yōu)化,網(wǎng)站結構優(yōu)化,404、網(wǎng)站Sitemap地圖和機器人都屬于到現場(chǎng)搜索引擎優(yōu)化的類(lèi)別。如果你不做好站內優(yōu)化,你的外鏈再好也沒(méi)用,因為你的網(wǎng)站留不住用戶(hù),所以站內優(yōu)化大于站外-網(wǎng)站優(yōu)化,而外部鏈接的作用近年來(lái)逐漸減弱。如果想通過(guò)累計外鏈數量來(lái)增加網(wǎng)站的權重,目前可能很難實(shí)現。 .
  
  使用白帽SEO形式優(yōu)化,為什么一定要使用白帽SEO優(yōu)化網(wǎng)站?因為有的站長(cháng)想用黑帽SEO優(yōu)化方法來(lái)快速提升網(wǎng)站的權重值,如果使用這些黑帽SEO,一旦被搜索引擎發(fā)現,就等待網(wǎng)站的結果只能被處罰或K站。搜索引擎支持用戶(hù)使用正式的白帽SEO優(yōu)化方式,因為這種優(yōu)化方式可以持續為用戶(hù)提供有價(jià)值的內容。
  我們在優(yōu)化網(wǎng)站的時(shí)候,建議不要用黑帽作弊的操作方法優(yōu)化網(wǎng)站,因為到最后你很可能會(huì )花費時(shí)間和精力,但是網(wǎng)站 還不是很好的流程。
  新站前期以文章采集和挖礦網(wǎng)站長(cháng)尾關(guān)鍵詞為主。長(cháng)尾關(guān)鍵詞不僅競爭程度低,而且排名時(shí)間長(cháng)。短,優(yōu)化長(cháng)尾關(guān)鍵詞可能只需要幾個(gè)星期,最長(cháng)不會(huì )超過(guò)一個(gè)月,新站沒(méi)有優(yōu)化基礎,搜索引擎對新站信任度不高網(wǎng)站,我們通過(guò)優(yōu)化文章采集和長(cháng)尾關(guān)鍵詞,可以實(shí)現更快的收錄網(wǎng)站頁(yè)面,更快的流量獲取,然后繼續積累,提升網(wǎng)站的流量和權重,最后爭奪一些高指數高流量的關(guān)鍵詞,新的網(wǎng)站傾向于前期做內容, 文章采集讓新站點(diǎn)的內容快寫(xiě)完的時(shí)候,我們可以?xún)?yōu)化站點(diǎn),交換一些優(yōu)質(zhì)的鏈接。
  
  老站意味著(zhù)已經(jīng)有一定的流量基礎,但是流量不是特別高。老的網(wǎng)站可以?xún)A向于挖一些有一定索引的關(guān)鍵詞,但是不建議選擇索引太高的關(guān)鍵詞,300到500的索引關(guān)鍵詞是比較合適,通過(guò)索引關(guān)鍵詞來(lái)帶動(dòng)全站流量的增加,老的網(wǎng)站權重的增加和高索引流量關(guān)鍵詞有一定的關(guān)系流量詞越多,網(wǎng)站的權重就越高,流量關(guān)鍵詞的不斷積累,搜索引擎對你網(wǎng)站的信任度會(huì )不斷增加。老的網(wǎng)站傾向于后期做流量。返回搜狐,查看更多 查看全部

  文章采集調用(利用白帽SEO優(yōu)化方法快速提升網(wǎng)站權重值的方法有哪些)
  文章采集,使得網(wǎng)站有內容,只有有內容才有可能被收錄推廣,只有收錄才能推廣能不能提高網(wǎng)站權重。 網(wǎng)站權重是對網(wǎng)站綜合價(jià)值的總稱(chēng),包括網(wǎng)站運營(yíng)能力、用戶(hù)體驗、內容質(zhì)量、用戶(hù)熱度、SEO指標。綜合性能統一名稱(chēng)。
  
  文章采集如何增加網(wǎng)站的權重:日常正規管理和運營(yíng)網(wǎng)站,使用正規白帽方法來(lái)操作網(wǎng)站,比如比如更新內容、檢查維護等等,這些都是站長(cháng)必須要做的事情。挖礦優(yōu)化精準關(guān)鍵詞,根據自己的網(wǎng)站行業(yè),挖礦優(yōu)化精準網(wǎng)站關(guān)鍵詞,必須有流量關(guān)鍵詞,如果挖礦關(guān)鍵詞@ >與網(wǎng)站的主題定位無(wú)關(guān),那么網(wǎng)站的權重就很難增加,甚至網(wǎng)站都會(huì )被搜索引擎懲罰。
  
  文章采集改進(jìn)網(wǎng)站和收錄的內容,網(wǎng)站收錄索引數據和網(wǎng)站的數量?jì)热莞率浅杀壤年P(guān)系,如果你長(cháng)時(shí)間不更新網(wǎng)站,那么你的網(wǎng)站索引數據不僅會(huì )增加還會(huì )減少。如果你想改進(jìn)網(wǎng)站網(wǎng)站@收錄的內容,那么你需要不斷更新網(wǎng)站的優(yōu)質(zhì)內容。
  
  同時(shí),站內和站外的SEO也需要做好。除了文章采集還要更新內容,內鏈優(yōu)化,網(wǎng)站結構優(yōu)化,404、網(wǎng)站Sitemap地圖和機器人都屬于到現場(chǎng)搜索引擎優(yōu)化的類(lèi)別。如果你不做好站內優(yōu)化,你的外鏈再好也沒(méi)用,因為你的網(wǎng)站留不住用戶(hù),所以站內優(yōu)化大于站外-網(wǎng)站優(yōu)化,而外部鏈接的作用近年來(lái)逐漸減弱。如果想通過(guò)累計外鏈數量來(lái)增加網(wǎng)站的權重,目前可能很難實(shí)現。 .
  
  使用白帽SEO形式優(yōu)化,為什么一定要使用白帽SEO優(yōu)化網(wǎng)站?因為有的站長(cháng)想用黑帽SEO優(yōu)化方法來(lái)快速提升網(wǎng)站的權重值,如果使用這些黑帽SEO,一旦被搜索引擎發(fā)現,就等待網(wǎng)站的結果只能被處罰或K站。搜索引擎支持用戶(hù)使用正式的白帽SEO優(yōu)化方式,因為這種優(yōu)化方式可以持續為用戶(hù)提供有價(jià)值的內容。
  我們在優(yōu)化網(wǎng)站的時(shí)候,建議不要用黑帽作弊的操作方法優(yōu)化網(wǎng)站,因為到最后你很可能會(huì )花費時(shí)間和精力,但是網(wǎng)站 還不是很好的流程。
  新站前期以文章采集和挖礦網(wǎng)站長(cháng)尾關(guān)鍵詞為主。長(cháng)尾關(guān)鍵詞不僅競爭程度低,而且排名時(shí)間長(cháng)。短,優(yōu)化長(cháng)尾關(guān)鍵詞可能只需要幾個(gè)星期,最長(cháng)不會(huì )超過(guò)一個(gè)月,新站沒(méi)有優(yōu)化基礎,搜索引擎對新站信任度不高網(wǎng)站,我們通過(guò)優(yōu)化文章采集和長(cháng)尾關(guān)鍵詞,可以實(shí)現更快的收錄網(wǎng)站頁(yè)面,更快的流量獲取,然后繼續積累,提升網(wǎng)站的流量和權重,最后爭奪一些高指數高流量的關(guān)鍵詞,新的網(wǎng)站傾向于前期做內容, 文章采集讓新站點(diǎn)的內容快寫(xiě)完的時(shí)候,我們可以?xún)?yōu)化站點(diǎn),交換一些優(yōu)質(zhì)的鏈接。
  
  老站意味著(zhù)已經(jīng)有一定的流量基礎,但是流量不是特別高。老的網(wǎng)站可以?xún)A向于挖一些有一定索引的關(guān)鍵詞,但是不建議選擇索引太高的關(guān)鍵詞,300到500的索引關(guān)鍵詞是比較合適,通過(guò)索引關(guān)鍵詞來(lái)帶動(dòng)全站流量的增加,老的網(wǎng)站權重的增加和高索引流量關(guān)鍵詞有一定的關(guān)系流量詞越多,網(wǎng)站的權重就越高,流量關(guān)鍵詞的不斷積累,搜索引擎對你網(wǎng)站的信任度會(huì )不斷增加。老的網(wǎng)站傾向于后期做流量。返回搜狐,查看更多

文章采集調用(dedecms如何修改這一上限值)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 129 次瀏覽 ? 2022-02-22 11:11 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(dedecms如何修改這一上限值)
  dedecmssystem文章調用描述最大字符數為250字節,文章summary(可以通過(guò)infolen或description相關(guān)標簽調用)設置為最大250 個(gè)字符。上限的主要目的是減少數據庫的冗余,保證網(wǎng)絡(luò )的良好性能。所以,不給配置文件的內容設置一個(gè)上限顯然是不合理的,但是如果可以自由控制這個(gè)上限,那么就會(huì )給網(wǎng)頁(yè)內容的布局帶來(lái)積極的影響。NET 源代碼在網(wǎng)頁(yè)設計過(guò)程中。dedecms 經(jīng)常需要在頻道列表頁(yè)面調用文章 的摘要。如果文章的摘要中的字數可以得到有效控制,那么頁(yè)面布局就可以變得非常靈活。
  先說(shuō)一下如何修改這個(gè)上限值,從而體現[field:description function="cn_substr(@me, number of characters)"/]的重要性。
  在Dedecms系統中,與抽象文章相關(guān)的php文件如下:
  /dede/archives_add.php
  /dede/archives_edit.php
  /dede/article_add.php
  /dede/article_edit.php
  /dede/article_description_main.php
  在添加頁(yè)面中,有一句:$description = cn_substrR($description, $cfg_auot_description); 這句話(huà)實(shí)現了[field:description function="cn_substr(@me, number of characters)"/]的功能。由于此聲明確實(shí)有利于頁(yè)面布局,因此我們正在嘗試不做任何更改。
  我在編輯頁(yè)面,有一句話(huà): $description = cn_substrR($description, 250); ,這句話(huà)顯示了一個(gè)熟悉的字符數 250,也就是 文章 的摘要字符集系統個(gè)數的上限,如果是gbk編碼,會(huì )顯示125個(gè)字符,如果是utf-8編碼,會(huì )是81個(gè)字符。顯然,如果我們要打破抽象字符個(gè)數的上限,一定要搞定。是的,你可以在這里把250改成別的值,比如500。這里不建議設置太高。一個(gè)是不需要在列表頁(yè)顯示太多的內容(最好直接使用body來(lái)顯示過(guò)多的內容),另一個(gè)是避免數據庫冗余。
  完成以上修改還不夠,還需要修改article_description_main.php
  在 article_description_main.php 頁(yè)面上,找到 if($dsize&gt;250) $dsize = 250; 語(yǔ)句,它限制了后臺從摘要中提取的字符數。將此處的 250 更改為 500, 織夢(mèng) 仿站的意思是和之前修改的字符數不同。(如果你確認你的每一個(gè)文章都是手動(dòng)添加的,如果手動(dòng)完成就不需要修改這個(gè)文件了抽象的采集。按照抽象 次要采集保留給大部分 文章 和 采集。)
  最初登錄后臺,在系統-系統基本參數-其他選項中,后續摘要的長(cháng)度可以改為500,即可以和之前修改的字符數不同。
  完成以上修改后,我們進(jìn)入頻道列表頁(yè)面,通過(guò)標簽調用。示例標簽如下:
  {dede:list typeid="row='5' titlelen='100' orderby='new' pagesize='5'}
  [字段:標題/]
  [字段:描述函數='cn_substr(@me,500)'/]…
  {/dede:列表}
  通過(guò)以上方法,我們實(shí)現了被調用的文章摘要字符為500個(gè)字符,完全突破了文章摘要250個(gè)字符的系統限制,為網(wǎng)頁(yè)布局提供了更廣闊的空間。
  先說(shuō)一下常用的Dedecms文章或者列表頁(yè)調用文章summary方法。
  1:[字段:信息/]
  2:[字段:描述/]
  3: [field:info function="cn_substr(@me, 字符數)"/]
  4: [field:description function="cn_substr(@me, 字符數)"/]
  1、的第二種方法是間接調用文章的抽象。關(guān)于被調用字數的問(wèn)題,在使用[field:info /]時(shí),可以調用{dede:arclist infolen=' ' }{/dede :arclist},設置調用摘要的字符數(最大可以設置為系統設置的250);如果使用[field:description/],則間接使用后臺設置的抽象字符上限(后臺也有上限250字符)字符)。顯然這兩種方法是被動(dòng)的和靈活的。
  3、的第四種方法通過(guò)function函數實(shí)現了對文章摘要中顯示字符的靈活調整。當然,當文章的抽象內容中的字符上限沒(méi)有正常修改的情況下,這四種方式的區別并不大。
  ============================
  1:[字段:信息/]
  2:[字段:描述/]
  3:[field:info function="cn_substr(@me, 字符數)"/]
  4:[field:description function="cn_substr(@me, 字符數)"/]
  這四種方法用于調用文章描述標簽。但它最多只能調用前 250 個(gè)字符。如果要調用更多,需要修改幾個(gè)地方:
  1.article_description_main.php頁(yè)面,找到“if ($dsize&gt;250) $dsize = 250;”語(yǔ)句,將250改為500
  2.登錄后臺,在System-System Basic Parameters-Other Options中,將自動(dòng)匯總長(cháng)度改為500.
  3.登錄后臺執行SQL語(yǔ)句:alter table `dede_archives` change `description` `description` varchar ( 1000 )
  調用標簽{dede:field.description function='cn_substr(@me,500)'/}.可以顯示500個(gè)字符 查看全部

  文章采集調用(dedecms如何修改這一上限值)
  dedecmssystem文章調用描述最大字符數為250字節,文章summary(可以通過(guò)infolen或description相關(guān)標簽調用)設置為最大250 個(gè)字符。上限的主要目的是減少數據庫的冗余,保證網(wǎng)絡(luò )的良好性能。所以,不給配置文件的內容設置一個(gè)上限顯然是不合理的,但是如果可以自由控制這個(gè)上限,那么就會(huì )給網(wǎng)頁(yè)內容的布局帶來(lái)積極的影響。NET 源代碼在網(wǎng)頁(yè)設計過(guò)程中。dedecms 經(jīng)常需要在頻道列表頁(yè)面調用文章 的摘要。如果文章的摘要中的字數可以得到有效控制,那么頁(yè)面布局就可以變得非常靈活。
  先說(shuō)一下如何修改這個(gè)上限值,從而體現[field:description function="cn_substr(@me, number of characters)"/]的重要性。
  在Dedecms系統中,與抽象文章相關(guān)的php文件如下:
  /dede/archives_add.php
  /dede/archives_edit.php
  /dede/article_add.php
  /dede/article_edit.php
  /dede/article_description_main.php
  在添加頁(yè)面中,有一句:$description = cn_substrR($description, $cfg_auot_description); 這句話(huà)實(shí)現了[field:description function="cn_substr(@me, number of characters)"/]的功能。由于此聲明確實(shí)有利于頁(yè)面布局,因此我們正在嘗試不做任何更改。
  我在編輯頁(yè)面,有一句話(huà): $description = cn_substrR($description, 250); ,這句話(huà)顯示了一個(gè)熟悉的字符數 250,也就是 文章 的摘要字符集系統個(gè)數的上限,如果是gbk編碼,會(huì )顯示125個(gè)字符,如果是utf-8編碼,會(huì )是81個(gè)字符。顯然,如果我們要打破抽象字符個(gè)數的上限,一定要搞定。是的,你可以在這里把250改成別的值,比如500。這里不建議設置太高。一個(gè)是不需要在列表頁(yè)顯示太多的內容(最好直接使用body來(lái)顯示過(guò)多的內容),另一個(gè)是避免數據庫冗余。
  完成以上修改還不夠,還需要修改article_description_main.php
  在 article_description_main.php 頁(yè)面上,找到 if($dsize&gt;250) $dsize = 250; 語(yǔ)句,它限制了后臺從摘要中提取的字符數。將此處的 250 更改為 500, 織夢(mèng) 仿站的意思是和之前修改的字符數不同。(如果你確認你的每一個(gè)文章都是手動(dòng)添加的,如果手動(dòng)完成就不需要修改這個(gè)文件了抽象的采集。按照抽象 次要采集保留給大部分 文章 和 采集。)
  最初登錄后臺,在系統-系統基本參數-其他選項中,后續摘要的長(cháng)度可以改為500,即可以和之前修改的字符數不同。
  完成以上修改后,我們進(jìn)入頻道列表頁(yè)面,通過(guò)標簽調用。示例標簽如下:
  {dede:list typeid="row='5' titlelen='100' orderby='new' pagesize='5'}
  [字段:標題/]
  [字段:描述函數='cn_substr(@me,500)'/]…
  {/dede:列表}
  通過(guò)以上方法,我們實(shí)現了被調用的文章摘要字符為500個(gè)字符,完全突破了文章摘要250個(gè)字符的系統限制,為網(wǎng)頁(yè)布局提供了更廣闊的空間。
  先說(shuō)一下常用的Dedecms文章或者列表頁(yè)調用文章summary方法。
  1:[字段:信息/]
  2:[字段:描述/]
  3: [field:info function="cn_substr(@me, 字符數)"/]
  4: [field:description function="cn_substr(@me, 字符數)"/]
  1、的第二種方法是間接調用文章的抽象。關(guān)于被調用字數的問(wèn)題,在使用[field:info /]時(shí),可以調用{dede:arclist infolen=' ' }{/dede :arclist},設置調用摘要的字符數(最大可以設置為系統設置的250);如果使用[field:description/],則間接使用后臺設置的抽象字符上限(后臺也有上限250字符)字符)。顯然這兩種方法是被動(dòng)的和靈活的。
  3、的第四種方法通過(guò)function函數實(shí)現了對文章摘要中顯示字符的靈活調整。當然,當文章的抽象內容中的字符上限沒(méi)有正常修改的情況下,這四種方式的區別并不大。
  ============================
  1:[字段:信息/]
  2:[字段:描述/]
  3:[field:info function="cn_substr(@me, 字符數)"/]
  4:[field:description function="cn_substr(@me, 字符數)"/]
  這四種方法用于調用文章描述標簽。但它最多只能調用前 250 個(gè)字符。如果要調用更多,需要修改幾個(gè)地方:
  1.article_description_main.php頁(yè)面,找到“if ($dsize&gt;250) $dsize = 250;”語(yǔ)句,將250改為500
  2.登錄后臺,在System-System Basic Parameters-Other Options中,將自動(dòng)匯總長(cháng)度改為500.
  3.登錄后臺執行SQL語(yǔ)句:alter table `dede_archives` change `description` `description` varchar ( 1000 )
  調用標簽{dede:field.description function='cn_substr(@me,500)'/}.可以顯示500個(gè)字符

文章采集調用(用python+selenuim自動(dòng)框架來(lái)爬取京東商品信息(不要))

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 435 次瀏覽 ? 2022-02-21 23:28 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(用python+selenuim自動(dòng)框架來(lái)爬取京東商品信息(不要))
  今天我們使用python+ selenium 自動(dòng)框架爬取京東商品信息(不要再問(wèn)我為什么是京東了,因為京東不用登錄也可以搜索商品),Selenium是用來(lái)模仿人類(lèi)操作的,免費的手,生產(chǎn)力提升,哈哈,這里是對selenuim的一點(diǎn)介紹。
  硒簡(jiǎn)介
  Selenium 是一個(gè) Web 應用程序測試工具,Selenium 測試直接在瀏覽器中運行,就像真正的用戶(hù)一樣。一般的爬蟲(chóng)方法是使用python腳本直接訪(fǎng)問(wèn)目標網(wǎng)站,并且只對目標數據執行采集,訪(fǎng)問(wèn)速度非???,這樣目標網(wǎng)站就可以輕松識別您這是機器人,它阻止了您。使用selenium寫(xiě)爬蟲(chóng),python腳本控制瀏覽器進(jìn)行訪(fǎng)問(wèn),也就是說(shuō)python腳本和目標網(wǎng)站之間多了一個(gè)瀏覽器操作,這個(gè)行為更像是人的行為,這么多難以爬取網(wǎng)站你也可以輕松抓取數據。
  準備
  首先安裝selenuim,方法和其他第三方庫的安裝方法一樣,使用pip命令
  點(diǎn)安裝硒
  安裝 selenuim 后,您必須安裝驅動(dòng)程序才能使其正常工作。因為我使用的是 Google Chrome,所以我下載了 Google Drive,當然還有 Firefox。下載對應瀏覽器版本的驅動(dòng)(如果沒(méi)有對應版本,也可以下載接近的版本)。以下是兩款驅動(dòng)的下載地址:
  - 谷歌云端硬盤(pán):(點(diǎn)擊下載)
  - 火狐驅動(dòng):(點(diǎn)擊下載)
  
  下載完成后,驅動(dòng)就安裝好了。Firefox驅動(dòng)的安裝方法與Chrome驅動(dòng)相同。把下載好的驅動(dòng)放到你的python安裝路徑下的Script目錄下即可(放到Script文件夾下即可,無(wú)需配置環(huán)境變量)
  
  至此,selenuim的相關(guān)安裝就完成了,接下來(lái)開(kāi)始我們今天的任務(wù)。
  1.導入相關(guān)依賴(lài)
  import time
import json
from pyquery import PyQuery as pq
#pyquery是個(gè)解析庫
from selenium import webdriver
#導入驅動(dòng)webdriver
from selenium.webdriver.common.by import By
#By是selenium中內置的一個(gè)class,在這個(gè)class中有各種方法來(lái)定位元素
from selenium.webdriver.support.ui import WebDriverWait
#設置瀏覽器驅動(dòng)休眠等待,避免頻繁操作封ip
from selenium.webdriver.support import expected_conditions as EC
#判斷一個(gè)元素是否存在,是否加載完畢等一系列的場(chǎng)景判斷方法
  二、使用selenium EC操作瀏覽器
  首先,用Chrome瀏覽器打開(kāi)產(chǎn)品首頁(yè)。我們很容易發(fā)現該網(wǎng)頁(yè)是一個(gè)動(dòng)態(tài)加載的網(wǎng)頁(yè)。首次打開(kāi)網(wǎng)頁(yè)時(shí),僅顯示 30 種產(chǎn)品的信息。只有當網(wǎng)頁(yè)被向下拖動(dòng)時(shí),它才會(huì )加載其余部分。30 項信息。這里我們可以使用selenium模擬瀏覽器拉下網(wǎng)頁(yè),判斷網(wǎng)頁(yè)元素是否通過(guò)EC加載,從而獲取所有產(chǎn)品網(wǎng)站的信息。
  def search():
browser.get(&#39;https://www.jd.com/&#39;)
try:
input = wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#key"))
) # 等待搜索框加載出來(lái)
submit = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, "#search > div > div.form > button"))
) # 等待搜索按鈕可以被點(diǎn)擊
input[0].send_keys(keyword) # 向搜索框內輸入關(guān)鍵詞
submit.click() # 點(diǎn)擊搜索
time.sleep(2) # 加入時(shí)間間隔,速度太快可能會(huì )抓不到數據
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 下拉到網(wǎng)頁(yè)底部
wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(60)"))
) # 等待最后一個(gè)商品信息加載完畢
html = browser.page_source
except TimeoutError:
search()
  三、使用selenium EC實(shí)現翻頁(yè)操作
  與第一頁(yè)類(lèi)似,它也使用EC來(lái)判斷頁(yè)面元素是否加載,并添加延遲以防止數據被抓到。
  def next_page(page_number):
try:
button = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, &#39;#J_bottomPage > span.p-num > a.pn-next > em&#39;))
) # 等待翻頁(yè)按鈕可以點(diǎn)擊
button.click() # 點(diǎn)擊翻頁(yè)按鈕
wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(30)"))
) # 等到30個(gè)商品都加載出來(lái)
time.sleep(2)
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)
wait.until(# 等到60個(gè)商品都加載出來(lái)
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(60)"))
)
html = browser.page_source
find_save(html) # 調用函數篩選數據
except TimeoutError:
return next_page(page_number)
  四、提取數據并保存
  這里使用pyquery庫解析網(wǎng)頁(yè)源代碼,使用CSS_SELECTOR選擇元素。一定要找到參考元素。例如,將鼠標放在搜索框中,右鍵查看,然后跳轉到搜索框中對應的代碼處。右鍵點(diǎn)擊它,點(diǎn)擊Copy &gt; Copy selector,我們得到我們需要的#key,然后通過(guò).text()獲取內容,最后將python對象轉換成json數據寫(xiě)入json文件。
  def find_save(html):
doc = pq(html)
items = doc(&#39;#J_goodsList > ul > li&#39;).items()
for item in items:
product = {
&#39;name&#39;: item(&#39;.p-name a&#39;).text(),
&#39;price&#39;: item(&#39;.p-price i&#39;).text(),
&#39;commit&#39;: item(&#39;.p-commit a&#39;).text()
}
data_list.append(product) # 寫(xiě)入全局變量
# 把全局變量轉化為json數據
content = json.dumps(data_list, ensure_ascii=False, indent=2)
with open("E:\python\project\selenium\info.json", "w", encoding="utf-8") as f:
f.write(content)
print("json文件寫(xiě)入成功")
  五、編寫(xiě)和調用main函數
  使用for循環(huán)控制爬取的頁(yè)面數并添加延遲
  def main():
print("第", 1, "頁(yè):")
search()
for i in range(2, 6): # 爬取2-5頁(yè)
time.sleep(2) # 設置延遲
print("第", i, "頁(yè):")
next_page(i)
if __name__ == "__main__":
main()
  補充:
  為了提高爬蟲(chóng)的效率,可以將瀏覽器設置為無(wú)圖片模式,即不加載圖片,這樣可以提高采集的速度
  options = webdriver.ChromeOptions()
options.add_experimental_option(&#39;prefs&#39;{&#39;profile.managed_default_content_settings.images&#39;: 2})
browser = webdriver.Chrome(options=options)
  看看結果:
  
  
  附上完整代碼:
  import time
import json
from pyquery import PyQuery as pq
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
# 不加載圖片
options = webdriver.ChromeOptions()
options.add_experimental_option(&#39;prefs&#39;, {&#39;profile.managed_default_content_settings.images&#39;: 2})
browser = webdriver.Chrome(options=options)
wait = WebDriverWait(browser, 20) # 設置等待時(shí)間
data_list = [] # 設置全局變量用來(lái)存儲數據
keyword = "平凡的世界" # 商品名稱(chēng)
def search():
browser.get(&#39;https://www.jd.com/&#39;)
try:
input = wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#key"))
) # 等待搜索框加載出來(lái)
submit = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, "#search > div > div.form > button"))
) # 等待搜索按鈕可以被點(diǎn)擊
input[0].send_keys(keyword) # 向搜索框內輸入關(guān)鍵詞
submit.click() # 點(diǎn)擊搜索
time.sleep(2) # 加入時(shí)間間隔,速度太快可能會(huì )抓不到數據
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 滑動(dòng)到底部
wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(60)"))
) # 等待最后一個(gè)商品信息加載完畢
html = browser.page_source
find_save(html) # 調用函數篩選數據
except TimeoutError:
search()
def next_page(page_number):
try:
button = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, &#39;#J_bottomPage > span.p-num > a.pn-next > em&#39;))
) # 等待翻頁(yè)按鈕可以點(diǎn)擊
button.click() # 點(diǎn)擊翻頁(yè)按鈕
wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(30)"))
) # 等到30個(gè)商品都加載出來(lái)
time.sleep(2)
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)
wait.until(# 等到60個(gè)商品都加載出來(lái)
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(60)"))
)
html = browser.page_source
find_save(html) # 調用函數篩選數據
except TimeoutError:
return next_page(page_number)
def find_save(html):
doc = pq(html)
items = doc(&#39;#J_goodsList > ul > li&#39;).items()
# print(items)
for item in items:
product = {
&#39;name&#39;: item(&#39;.p-name a&#39;).text(),
&#39;price&#39;: item(&#39;.p-price i&#39;).text(),
&#39;commit&#39;: item(&#39;.p-commit a&#39;).text()
}
data_list.append(product) # 寫(xiě)入全局變量
# 把全局變量轉化為json數據
content = json.dumps(data_list, ensure_ascii=False, indent=2)
with open("E:\python\project\selenium\info.json", "w", encoding="utf-8") as f:
f.write(content)
print("json文件寫(xiě)入成功")
def main():
print("第", 1, "頁(yè):")
search()
for i in range(2, 6): # 爬取2-5頁(yè)
time.sleep(2) # 設置延遲
print("第", i, "頁(yè):")
next_page(i)
if __name__ == "__main__":
main()
  如有錯誤,請私信指正,謝謝支持! 查看全部

  文章采集調用(用python+selenuim自動(dòng)框架來(lái)爬取京東商品信息(不要))
  今天我們使用python+ selenium 自動(dòng)框架爬取京東商品信息(不要再問(wèn)我為什么是京東了,因為京東不用登錄也可以搜索商品),Selenium是用來(lái)模仿人類(lèi)操作的,免費的手,生產(chǎn)力提升,哈哈,這里是對selenuim的一點(diǎn)介紹。
  硒簡(jiǎn)介
  Selenium 是一個(gè) Web 應用程序測試工具,Selenium 測試直接在瀏覽器中運行,就像真正的用戶(hù)一樣。一般的爬蟲(chóng)方法是使用python腳本直接訪(fǎng)問(wèn)目標網(wǎng)站,并且只對目標數據執行采集,訪(fǎng)問(wèn)速度非???,這樣目標網(wǎng)站就可以輕松識別您這是機器人,它阻止了您。使用selenium寫(xiě)爬蟲(chóng),python腳本控制瀏覽器進(jìn)行訪(fǎng)問(wèn),也就是說(shuō)python腳本和目標網(wǎng)站之間多了一個(gè)瀏覽器操作,這個(gè)行為更像是人的行為,這么多難以爬取網(wǎng)站你也可以輕松抓取數據。
  準備
  首先安裝selenuim,方法和其他第三方庫的安裝方法一樣,使用pip命令
  點(diǎn)安裝硒
  安裝 selenuim 后,您必須安裝驅動(dòng)程序才能使其正常工作。因為我使用的是 Google Chrome,所以我下載了 Google Drive,當然還有 Firefox。下載對應瀏覽器版本的驅動(dòng)(如果沒(méi)有對應版本,也可以下載接近的版本)。以下是兩款驅動(dòng)的下載地址:
  - 谷歌云端硬盤(pán):(點(diǎn)擊下載)
  - 火狐驅動(dòng):(點(diǎn)擊下載)
  
  下載完成后,驅動(dòng)就安裝好了。Firefox驅動(dòng)的安裝方法與Chrome驅動(dòng)相同。把下載好的驅動(dòng)放到你的python安裝路徑下的Script目錄下即可(放到Script文件夾下即可,無(wú)需配置環(huán)境變量)
  
  至此,selenuim的相關(guān)安裝就完成了,接下來(lái)開(kāi)始我們今天的任務(wù)。
  1.導入相關(guān)依賴(lài)
  import time
import json
from pyquery import PyQuery as pq
#pyquery是個(gè)解析庫
from selenium import webdriver
#導入驅動(dòng)webdriver
from selenium.webdriver.common.by import By
#By是selenium中內置的一個(gè)class,在這個(gè)class中有各種方法來(lái)定位元素
from selenium.webdriver.support.ui import WebDriverWait
#設置瀏覽器驅動(dòng)休眠等待,避免頻繁操作封ip
from selenium.webdriver.support import expected_conditions as EC
#判斷一個(gè)元素是否存在,是否加載完畢等一系列的場(chǎng)景判斷方法
  二、使用selenium EC操作瀏覽器
  首先,用Chrome瀏覽器打開(kāi)產(chǎn)品首頁(yè)。我們很容易發(fā)現該網(wǎng)頁(yè)是一個(gè)動(dòng)態(tài)加載的網(wǎng)頁(yè)。首次打開(kāi)網(wǎng)頁(yè)時(shí),僅顯示 30 種產(chǎn)品的信息。只有當網(wǎng)頁(yè)被向下拖動(dòng)時(shí),它才會(huì )加載其余部分。30 項信息。這里我們可以使用selenium模擬瀏覽器拉下網(wǎng)頁(yè),判斷網(wǎng)頁(yè)元素是否通過(guò)EC加載,從而獲取所有產(chǎn)品網(wǎng)站的信息。
  def search():
browser.get(&#39;https://www.jd.com/&#39;)
try:
input = wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#key"))
) # 等待搜索框加載出來(lái)
submit = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, "#search > div > div.form > button"))
) # 等待搜索按鈕可以被點(diǎn)擊
input[0].send_keys(keyword) # 向搜索框內輸入關(guān)鍵詞
submit.click() # 點(diǎn)擊搜索
time.sleep(2) # 加入時(shí)間間隔,速度太快可能會(huì )抓不到數據
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 下拉到網(wǎng)頁(yè)底部
wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(60)"))
) # 等待最后一個(gè)商品信息加載完畢
html = browser.page_source
except TimeoutError:
search()
  三、使用selenium EC實(shí)現翻頁(yè)操作
  與第一頁(yè)類(lèi)似,它也使用EC來(lái)判斷頁(yè)面元素是否加載,并添加延遲以防止數據被抓到。
  def next_page(page_number):
try:
button = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, &#39;#J_bottomPage > span.p-num > a.pn-next > em&#39;))
) # 等待翻頁(yè)按鈕可以點(diǎn)擊
button.click() # 點(diǎn)擊翻頁(yè)按鈕
wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(30)"))
) # 等到30個(gè)商品都加載出來(lái)
time.sleep(2)
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)
wait.until(# 等到60個(gè)商品都加載出來(lái)
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(60)"))
)
html = browser.page_source
find_save(html) # 調用函數篩選數據
except TimeoutError:
return next_page(page_number)
  四、提取數據并保存
  這里使用pyquery庫解析網(wǎng)頁(yè)源代碼,使用CSS_SELECTOR選擇元素。一定要找到參考元素。例如,將鼠標放在搜索框中,右鍵查看,然后跳轉到搜索框中對應的代碼處。右鍵點(diǎn)擊它,點(diǎn)擊Copy &gt; Copy selector,我們得到我們需要的#key,然后通過(guò).text()獲取內容,最后將python對象轉換成json數據寫(xiě)入json文件。
  def find_save(html):
doc = pq(html)
items = doc(&#39;#J_goodsList > ul > li&#39;).items()
for item in items:
product = {
&#39;name&#39;: item(&#39;.p-name a&#39;).text(),
&#39;price&#39;: item(&#39;.p-price i&#39;).text(),
&#39;commit&#39;: item(&#39;.p-commit a&#39;).text()
}
data_list.append(product) # 寫(xiě)入全局變量
# 把全局變量轉化為json數據
content = json.dumps(data_list, ensure_ascii=False, indent=2)
with open("E:\python\project\selenium\info.json", "w", encoding="utf-8") as f:
f.write(content)
print("json文件寫(xiě)入成功")
  五、編寫(xiě)和調用main函數
  使用for循環(huán)控制爬取的頁(yè)面數并添加延遲
  def main():
print("第", 1, "頁(yè):")
search()
for i in range(2, 6): # 爬取2-5頁(yè)
time.sleep(2) # 設置延遲
print("第", i, "頁(yè):")
next_page(i)
if __name__ == "__main__":
main()
  補充:
  為了提高爬蟲(chóng)的效率,可以將瀏覽器設置為無(wú)圖片模式,即不加載圖片,這樣可以提高采集的速度
  options = webdriver.ChromeOptions()
options.add_experimental_option(&#39;prefs&#39;{&#39;profile.managed_default_content_settings.images&#39;: 2})
browser = webdriver.Chrome(options=options)
  看看結果:
  
  
  附上完整代碼:
  import time
import json
from pyquery import PyQuery as pq
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
# 不加載圖片
options = webdriver.ChromeOptions()
options.add_experimental_option(&#39;prefs&#39;, {&#39;profile.managed_default_content_settings.images&#39;: 2})
browser = webdriver.Chrome(options=options)
wait = WebDriverWait(browser, 20) # 設置等待時(shí)間
data_list = [] # 設置全局變量用來(lái)存儲數據
keyword = "平凡的世界" # 商品名稱(chēng)
def search():
browser.get(&#39;https://www.jd.com/&#39;)
try:
input = wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#key"))
) # 等待搜索框加載出來(lái)
submit = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, "#search > div > div.form > button"))
) # 等待搜索按鈕可以被點(diǎn)擊
input[0].send_keys(keyword) # 向搜索框內輸入關(guān)鍵詞
submit.click() # 點(diǎn)擊搜索
time.sleep(2) # 加入時(shí)間間隔,速度太快可能會(huì )抓不到數據
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 滑動(dòng)到底部
wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(60)"))
) # 等待最后一個(gè)商品信息加載完畢
html = browser.page_source
find_save(html) # 調用函數篩選數據
except TimeoutError:
search()
def next_page(page_number):
try:
button = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, &#39;#J_bottomPage > span.p-num > a.pn-next > em&#39;))
) # 等待翻頁(yè)按鈕可以點(diǎn)擊
button.click() # 點(diǎn)擊翻頁(yè)按鈕
wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(30)"))
) # 等到30個(gè)商品都加載出來(lái)
time.sleep(2)
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)
wait.until(# 等到60個(gè)商品都加載出來(lái)
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(60)"))
)
html = browser.page_source
find_save(html) # 調用函數篩選數據
except TimeoutError:
return next_page(page_number)
def find_save(html):
doc = pq(html)
items = doc(&#39;#J_goodsList > ul > li&#39;).items()
# print(items)
for item in items:
product = {
&#39;name&#39;: item(&#39;.p-name a&#39;).text(),
&#39;price&#39;: item(&#39;.p-price i&#39;).text(),
&#39;commit&#39;: item(&#39;.p-commit a&#39;).text()
}
data_list.append(product) # 寫(xiě)入全局變量
# 把全局變量轉化為json數據
content = json.dumps(data_list, ensure_ascii=False, indent=2)
with open("E:\python\project\selenium\info.json", "w", encoding="utf-8") as f:
f.write(content)
print("json文件寫(xiě)入成功")
def main():
print("第", 1, "頁(yè):")
search()
for i in range(2, 6): # 爬取2-5頁(yè)
time.sleep(2) # 設置延遲
print("第", i, "頁(yè):")
next_page(i)
if __name__ == "__main__":
main()
  如有錯誤,請私信指正,謝謝支持!

文章采集調用(小蜜蜂公眾號文章助手上線(xiàn),復制文字還沒(méi)有什么?)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 166 次瀏覽 ? 2022-02-21 23:27 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(小蜜蜂公眾號文章助手上線(xiàn),復制文字還沒(méi)有什么?)
  現在小蜜蜂公眾號文章助手上線(xiàn),可以采集任意公眾號歷史文章,支持點(diǎn)贊數、閱讀數、評論數采集,支持導出PDF ,Excel,HTML,TXT格式導出,支持關(guān)鍵詞搜索,可以去官網(wǎng)查看
  許多微信公眾號作者(個(gè)人、組織、公司)不僅在微信公眾平臺上寫(xiě)作,而且通常文章在多個(gè)平臺上推送,例如今日頭條、知乎專(zhuān)欄、短書(shū)等,甚至有自己的網(wǎng)站(官網(wǎng)),但是在多個(gè)平臺上發(fā)布文章是一項非常耗時(shí)的工作。
  大多數 網(wǎng)站 構建都基于 WordPress,因為該平臺非常簡(jiǎn)單實(shí)用,并且有大量插件。因此,我也不例外。當我選擇建站系統時(shí),首先選擇的是 WordPress。不過(guò)我經(jīng)常寫(xiě)文章發(fā)現一個(gè)問(wèn)題,就是每次在公眾號寫(xiě)文章,我把文章@文章手動(dòng)復制到WordPress上,復制文字沒(méi)什么,但復制圖片會(huì )殺了我。微信公眾號文章的圖片不能直接復制到WordPress,會(huì )顯示為“無(wú)法顯示。這張圖片”,因為微信對圖片做了防盜鏈措施。
  這時(shí)候嘗試搜索了一個(gè)這樣的插件,可以通過(guò)粘貼公眾號文章的鏈接直接將內容導入WordPress,并將圖片下載到本地(媒體庫),于是開(kāi)發(fā)了一個(gè)插件名為Bee采集,除了微信公眾號文章,還可以導入今日頭條、短書(shū)、知乎欄目的文章,以及有多種可選功能,除此之外,還可以采集other網(wǎng)站,只要配置好相應的規則即可
  
  使用也很簡(jiǎn)單,粘貼鏈接即可,可以同時(shí)導入多個(gè)文章,即批量導入功能,自動(dòng)同步采集公眾號功能文章
  下載的話(huà)直接在安裝插件頁(yè)面搜索蜜蜂采集就可以看到
  
  希望這篇筆記可以幫到你 查看全部

  文章采集調用(小蜜蜂公眾號文章助手上線(xiàn),復制文字還沒(méi)有什么?)
  現在小蜜蜂公眾號文章助手上線(xiàn),可以采集任意公眾號歷史文章,支持點(diǎn)贊數、閱讀數、評論數采集,支持導出PDF ,Excel,HTML,TXT格式導出,支持關(guān)鍵詞搜索,可以去官網(wǎng)查看
  許多微信公眾號作者(個(gè)人、組織、公司)不僅在微信公眾平臺上寫(xiě)作,而且通常文章在多個(gè)平臺上推送,例如今日頭條、知乎專(zhuān)欄、短書(shū)等,甚至有自己的網(wǎng)站(官網(wǎng)),但是在多個(gè)平臺上發(fā)布文章是一項非常耗時(shí)的工作。
  大多數 網(wǎng)站 構建都基于 WordPress,因為該平臺非常簡(jiǎn)單實(shí)用,并且有大量插件。因此,我也不例外。當我選擇建站系統時(shí),首先選擇的是 WordPress。不過(guò)我經(jīng)常寫(xiě)文章發(fā)現一個(gè)問(wèn)題,就是每次在公眾號寫(xiě)文章,我把文章@文章手動(dòng)復制到WordPress上,復制文字沒(méi)什么,但復制圖片會(huì )殺了我。微信公眾號文章的圖片不能直接復制到WordPress,會(huì )顯示為“無(wú)法顯示。這張圖片”,因為微信對圖片做了防盜鏈措施。
  這時(shí)候嘗試搜索了一個(gè)這樣的插件,可以通過(guò)粘貼公眾號文章的鏈接直接將內容導入WordPress,并將圖片下載到本地(媒體庫),于是開(kāi)發(fā)了一個(gè)插件名為Bee采集,除了微信公眾號文章,還可以導入今日頭條、短書(shū)、知乎欄目的文章,以及有多種可選功能,除此之外,還可以采集other網(wǎng)站,只要配置好相應的規則即可
  
  使用也很簡(jiǎn)單,粘貼鏈接即可,可以同時(shí)導入多個(gè)文章,即批量導入功能,自動(dòng)同步采集公眾號功能文章
  下載的話(huà)直接在安裝插件頁(yè)面搜索蜜蜂采集就可以看到
  
  希望這篇筆記可以幫到你

文章采集調用(結構圖代理中增強類(lèi)Enhancer應該是核心配置功能類(lèi)的)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 147 次瀏覽 ? 2022-02-21 23:25 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(結構圖代理中增強類(lèi)Enhancer應該是核心配置功能類(lèi)的)
  背景
  通過(guò)開(kāi)發(fā)插件包采集部門(mén)內的trace的鏈接信息,包括RPC mock工具。采集的調用鏈如下所示:
  1589802250554|0b51063f15898022505134582ec1dc|RPC|com.service.bindReadService#getBindModelByUserId|[2988166812]|{"@type":"com.service.models.ResultVOModel","succeed":true,"valueObject":{"@type":"com.service.models.bind1688Model","accountNo":"2088422864957283","accountType":3,"bindFrom":"activeAccount","enable":true,"enableStatus":1,"memberId":"b2b-2988166812dc3ef","modifyDate":1509332355000,"userId":2988166812}}|2|0.1.1.4.4|11.181.112.68|C:membercenterhost|DPathBaseEnv|N||
  不僅會(huì )打印trace,還會(huì )打印輸入輸出參數、目標IP和源IP??梢钥吹竭€是很清晰的,大大提高了我們聯(lián)查排查的效率。
  但是,隨著(zhù)產(chǎn)品的不斷迭代,jar的形式還是存在不少問(wèn)題。首先,接入成本高,版本不穩定,導致快速升級。相應的服務(wù)必須不斷升級。相信大家都經(jīng)歷過(guò)升級fastjson的陣痛。另外,由于多版本兼容,數據不能一致,處理起來(lái)很麻煩。為此,您唯一能想到的就是對相應的集合和模擬進(jìn)行代理增強操作。
  結構圖
  代理中的增強類(lèi)Enhancer應該是核心配置功能類(lèi)。通過(guò)繼承或者SPI擴展,我們可以實(shí)現不同增強點(diǎn)的配置。
  
  相關(guān)代碼
  BootStrapAgent 入口類(lèi):
  /** * @author wanghao * @date 2020/5/6 */public class BootStrapAgent { public static void main(String[] args) { System.out.println("====main 方法執行"); } public static void premain(String agentArgs, Instrumentation inst) { System.out.println("====premain 方法執行"); new BootInitializer(inst, true).init(); } public static void agentmain(String agentOps, Instrumentation inst) { System.out.println("====agentmain 方法執行"); new BootInitializer(inst, false).init(); }}
  agent的入口類(lèi),premain支持的agent掛載方式,agentmain支持的attach api方式,agent方式需要指定-javaagent參數,項目中的docker文件需要配置。attach api的使用方法。BootInitializer 主要代碼:
  public class BootInitializer { public BootInitializer(Instrumentation instrumentation, boolean isPreAgent) { this.instrumentation = instrumentation; this.isPreAgent = isPreAgent; } public void init() { this.instrumentation.addTransformer(new EnhanceClassTransfer(), true); if (!isPreAgent) { try { // TODO 此處暫硬編碼,后續修改 this.instrumentation.retransformClasses(Class.forName("com.abb.ReflectInvocationHandler")); } catch (UnmodifiableClassException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }}
  這里需要注意的一點(diǎn)是addTransformer中的參數canRetransform需要設置為true,表示可以重新轉換表名,否則即使調用retransformClasses方法也無(wú)法重新定義指定的類(lèi)。需要注意的是,新加載的類(lèi)不能修改舊的類(lèi)聲明,例如添加屬性和修改方法聲明。EnhanceClassTransfer 主要代碼:
  @Overridepublic byte[] transform(ClassLoader loader, String className, Class> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { if (className == null) { return null; } String name = className.replace("/", "."); byte[] bytes = enhanceEngine.getEnhancedByteByClassName(name, classfileBuffer, loader); return bytes;}
  EnhanceClassTransfer 做的很簡(jiǎn)單,直接調用 EnhanceEngine 生成字節碼 EnhanceEngine 主代碼:
  private static Map enhancerMap = new ConcurrentHashMap();public byte[] getEnhancedByteByClassName(String className, byte[] bytes, ClassLoader classLoader, Enhancer enhancerProvide) { byte[] classBytes = bytes; boolean isNeedEnhance = false; Enhancer enhancer = null; // 兩次enhancer匹配校驗 // 具體類(lèi)名匹配 enhancer = enhancerMap.get(className); if (enhancer != null) { isNeedEnhance = true; } // 類(lèi)名正則匹配 if (!isNeedEnhance) { for (Enhancer classNamePtnEnhancer : classNamePtnEnhancers) { if (classNamePtnEnhancer.isClassMatch(className)) { enhancer = classNamePtnEnhancer; break; } } } if (enhancer != null) { System.out.println(enhancer.getClassName()); MethodAopContext methodAopContext = GlobalAopContext.buildMethodAopContext(enhancer.getClassName(), enhancer.getInvocationInterceptor() ,classLoader, enhancer.getMethodFilter()); try { classBytes = ClassProxyUtil.buildInjectByteCodeByJavaAssist(methodAopContext, bytes); } catch (Exception e) { e.printStackTrace(); } } return classBytes; }
  類(lèi)名匹配在這里進(jìn)行了兩次。增強器映射保存了需要增強的類(lèi)名與增強的擴展類(lèi)的關(guān)系。Enhancer中的變量很簡(jiǎn)單,如下:
  private String className;private Pattern classNamePattern;private Pattern methodPattern;private InvocationInterceptor invocationInterceptor;
  只有匹配到對應的增強器后,才會(huì )進(jìn)行增強處理,比如后面提到的DubboProviderEnhancer。
  字節碼操作工具
  目前主流的字節碼操作工具包括以下asmJavaassistbytebuddy
  三個(gè)文章的比較有很多,大家可以自己搜索看看。
  目前asm的使用門(mén)檻最高,調試的門(mén)檻也很高。Idea有一個(gè)非常強大的插件ASM Bytecode Outline。它可以根據當前的java類(lèi)生成相應的asm指令。效果圖如下:
  
  但是,使用 asm 還是需要開(kāi)發(fā)者對字節碼指令、局部變量表、操作樹(shù)棧有很好的理解,才能寫(xiě)好相關(guān)的代碼。
  bytebuddy 完全以鏈式編程的方式構建了一套用于方法切面編織的字節碼操作。從編碼的角度來(lái)看,它是比較簡(jiǎn)單的。目前,bytebuddy的代理操作已經(jīng)很完善了。它是根據類(lèi)名和方法名過(guò)濾的。提供了一套鏈式操作,如果業(yè)務(wù)邏輯不復雜,推薦使用。
  代理實(shí)現
  代理類(lèi)的實(shí)現大家一定不會(huì )陌生。我們有許多代理類(lèi)的入口點(diǎn)。我們可以在方法的before、after、afterReturn、afterThrowing等進(jìn)行相應的操作。當然,所有這些都可以通過(guò)模板來(lái)實(shí)現。這里我稍微簡(jiǎn)化一下,整體實(shí)現代理類(lèi)的增強操作。類(lèi)似于java動(dòng)態(tài)代理,大家都知道實(shí)現java動(dòng)態(tài)代理必須實(shí)現的類(lèi)InvocationHandler,改寫(xiě)方法:
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
  大致思路是比較動(dòng)態(tài)代理的方式,封裝需要代理的類(lèi),將類(lèi)類(lèi)型、入參和對象帶入代理方法,重寫(xiě)需要增強的方法,將重寫(xiě)前的方法作為基類(lèi)和修改方法名,這里分兩步操作。
  1.重寫(xiě)之前的方法
  2.添加新方法并復制之前的方法體
  需要注意的是這里沒(méi)有違反retransformClasses的規則,沒(méi)有添加屬性,也沒(méi)有修改方法聲明
  RPC中間件相關(guān)類(lèi)的增強實(shí)現效果如下:
  代碼顯示如下:
<p>public static byte[] buildInjectByteCodeByJavaAssist(MethodAopContext methodAopContext, byte[] classBytes) throws Exception { CtClass ctclass = null; try { ClassPool classPool = new ClassPool(); // 使用加載該類(lèi)的classLoader進(jìn)行classPool的構造,而不能使用ClassPool.getDefault()的方式 classPool.appendClassPath(new LoaderClassPath(methodAopContext.getLoader())); ctclass = classPool.get(methodAopContext.getClassName()); CtMethod[] declaredMethods = ctclass.getDeclaredMethods(); for (CtMethod method : declaredMethods) { String methodName = method.getName(); if (methodAopContext.matchs(methodName)) { System.out.println("methodName:" + methodName); String outputStr = "System.out.println("this method " + methodName + " cost:" +(endTime - startTime) +"ms.");"; // 定義新方法名,修改原名 String oldMethodName = methodName + "$old"; // 將原來(lái)的方法名字修改 method.setName(oldMethodName); // 創(chuàng )建新的方法,復制原來(lái)的方法,名字為原來(lái)的名字 CtMethod newMethod = CtNewMethod.copy(method, methodName, ctclass, null); int modifiers = newMethod.getModifiers(); String type = newMethod.getReturnType().getName(); CtClass[] parameterJaTypes = newMethod.getParameterTypes(); // 獲取參數 Class>[] parameterTypes = new Class[parameterJaTypes.length]; for (int var1 = 0; var1 查看全部

  文章采集調用(結構圖代理中增強類(lèi)Enhancer應該是核心配置功能類(lèi)的)
  背景
  通過(guò)開(kāi)發(fā)插件包采集部門(mén)內的trace的鏈接信息,包括RPC mock工具。采集的調用鏈如下所示:
  1589802250554|0b51063f15898022505134582ec1dc|RPC|com.service.bindReadService#getBindModelByUserId|[2988166812]|{"@type":"com.service.models.ResultVOModel","succeed":true,"valueObject":{"@type":"com.service.models.bind1688Model","accountNo":"2088422864957283","accountType":3,"bindFrom":"activeAccount","enable":true,"enableStatus":1,"memberId":"b2b-2988166812dc3ef","modifyDate":1509332355000,"userId":2988166812}}|2|0.1.1.4.4|11.181.112.68|C:membercenterhost|DPathBaseEnv|N||
  不僅會(huì )打印trace,還會(huì )打印輸入輸出參數、目標IP和源IP??梢钥吹竭€是很清晰的,大大提高了我們聯(lián)查排查的效率。
  但是,隨著(zhù)產(chǎn)品的不斷迭代,jar的形式還是存在不少問(wèn)題。首先,接入成本高,版本不穩定,導致快速升級。相應的服務(wù)必須不斷升級。相信大家都經(jīng)歷過(guò)升級fastjson的陣痛。另外,由于多版本兼容,數據不能一致,處理起來(lái)很麻煩。為此,您唯一能想到的就是對相應的集合和模擬進(jìn)行代理增強操作。
  結構圖
  代理中的增強類(lèi)Enhancer應該是核心配置功能類(lèi)。通過(guò)繼承或者SPI擴展,我們可以實(shí)現不同增強點(diǎn)的配置。
  
  相關(guān)代碼
  BootStrapAgent 入口類(lèi):
  /** * @author wanghao * @date 2020/5/6 */public class BootStrapAgent { public static void main(String[] args) { System.out.println("====main 方法執行"); } public static void premain(String agentArgs, Instrumentation inst) { System.out.println("====premain 方法執行"); new BootInitializer(inst, true).init(); } public static void agentmain(String agentOps, Instrumentation inst) { System.out.println("====agentmain 方法執行"); new BootInitializer(inst, false).init(); }}
  agent的入口類(lèi),premain支持的agent掛載方式,agentmain支持的attach api方式,agent方式需要指定-javaagent參數,項目中的docker文件需要配置。attach api的使用方法。BootInitializer 主要代碼:
  public class BootInitializer { public BootInitializer(Instrumentation instrumentation, boolean isPreAgent) { this.instrumentation = instrumentation; this.isPreAgent = isPreAgent; } public void init() { this.instrumentation.addTransformer(new EnhanceClassTransfer(), true); if (!isPreAgent) { try { // TODO 此處暫硬編碼,后續修改 this.instrumentation.retransformClasses(Class.forName("com.abb.ReflectInvocationHandler")); } catch (UnmodifiableClassException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }}
  這里需要注意的一點(diǎn)是addTransformer中的參數canRetransform需要設置為true,表示可以重新轉換表名,否則即使調用retransformClasses方法也無(wú)法重新定義指定的類(lèi)。需要注意的是,新加載的類(lèi)不能修改舊的類(lèi)聲明,例如添加屬性和修改方法聲明。EnhanceClassTransfer 主要代碼:
  @Overridepublic byte[] transform(ClassLoader loader, String className, Class> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { if (className == null) { return null; } String name = className.replace("/", "."); byte[] bytes = enhanceEngine.getEnhancedByteByClassName(name, classfileBuffer, loader); return bytes;}
  EnhanceClassTransfer 做的很簡(jiǎn)單,直接調用 EnhanceEngine 生成字節碼 EnhanceEngine 主代碼:
  private static Map enhancerMap = new ConcurrentHashMap();public byte[] getEnhancedByteByClassName(String className, byte[] bytes, ClassLoader classLoader, Enhancer enhancerProvide) { byte[] classBytes = bytes; boolean isNeedEnhance = false; Enhancer enhancer = null; // 兩次enhancer匹配校驗 // 具體類(lèi)名匹配 enhancer = enhancerMap.get(className); if (enhancer != null) { isNeedEnhance = true; } // 類(lèi)名正則匹配 if (!isNeedEnhance) { for (Enhancer classNamePtnEnhancer : classNamePtnEnhancers) { if (classNamePtnEnhancer.isClassMatch(className)) { enhancer = classNamePtnEnhancer; break; } } } if (enhancer != null) { System.out.println(enhancer.getClassName()); MethodAopContext methodAopContext = GlobalAopContext.buildMethodAopContext(enhancer.getClassName(), enhancer.getInvocationInterceptor() ,classLoader, enhancer.getMethodFilter()); try { classBytes = ClassProxyUtil.buildInjectByteCodeByJavaAssist(methodAopContext, bytes); } catch (Exception e) { e.printStackTrace(); } } return classBytes; }
  類(lèi)名匹配在這里進(jìn)行了兩次。增強器映射保存了需要增強的類(lèi)名與增強的擴展類(lèi)的關(guān)系。Enhancer中的變量很簡(jiǎn)單,如下:
  private String className;private Pattern classNamePattern;private Pattern methodPattern;private InvocationInterceptor invocationInterceptor;
  只有匹配到對應的增強器后,才會(huì )進(jìn)行增強處理,比如后面提到的DubboProviderEnhancer。
  字節碼操作工具
  目前主流的字節碼操作工具包括以下asmJavaassistbytebuddy
  三個(gè)文章的比較有很多,大家可以自己搜索看看。
  目前asm的使用門(mén)檻最高,調試的門(mén)檻也很高。Idea有一個(gè)非常強大的插件ASM Bytecode Outline。它可以根據當前的java類(lèi)生成相應的asm指令。效果圖如下:
  
  但是,使用 asm 還是需要開(kāi)發(fā)者對字節碼指令、局部變量表、操作樹(shù)棧有很好的理解,才能寫(xiě)好相關(guān)的代碼。
  bytebuddy 完全以鏈式編程的方式構建了一套用于方法切面編織的字節碼操作。從編碼的角度來(lái)看,它是比較簡(jiǎn)單的。目前,bytebuddy的代理操作已經(jīng)很完善了。它是根據類(lèi)名和方法名過(guò)濾的。提供了一套鏈式操作,如果業(yè)務(wù)邏輯不復雜,推薦使用。
  代理實(shí)現
  代理類(lèi)的實(shí)現大家一定不會(huì )陌生。我們有許多代理類(lèi)的入口點(diǎn)。我們可以在方法的before、after、afterReturn、afterThrowing等進(jìn)行相應的操作。當然,所有這些都可以通過(guò)模板來(lái)實(shí)現。這里我稍微簡(jiǎn)化一下,整體實(shí)現代理類(lèi)的增強操作。類(lèi)似于java動(dòng)態(tài)代理,大家都知道實(shí)現java動(dòng)態(tài)代理必須實(shí)現的類(lèi)InvocationHandler,改寫(xiě)方法:
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
  大致思路是比較動(dòng)態(tài)代理的方式,封裝需要代理的類(lèi),將類(lèi)類(lèi)型、入參和對象帶入代理方法,重寫(xiě)需要增強的方法,將重寫(xiě)前的方法作為基類(lèi)和修改方法名,這里分兩步操作。
  1.重寫(xiě)之前的方法
  2.添加新方法并復制之前的方法體
  需要注意的是這里沒(méi)有違反retransformClasses的規則,沒(méi)有添加屬性,也沒(méi)有修改方法聲明
  RPC中間件相關(guān)類(lèi)的增強實(shí)現效果如下:
  代碼顯示如下:
<p>public static byte[] buildInjectByteCodeByJavaAssist(MethodAopContext methodAopContext, byte[] classBytes) throws Exception { CtClass ctclass = null; try { ClassPool classPool = new ClassPool(); // 使用加載該類(lèi)的classLoader進(jìn)行classPool的構造,而不能使用ClassPool.getDefault()的方式 classPool.appendClassPath(new LoaderClassPath(methodAopContext.getLoader())); ctclass = classPool.get(methodAopContext.getClassName()); CtMethod[] declaredMethods = ctclass.getDeclaredMethods(); for (CtMethod method : declaredMethods) { String methodName = method.getName(); if (methodAopContext.matchs(methodName)) { System.out.println("methodName:" + methodName); String outputStr = "System.out.println("this method " + methodName + " cost:" +(endTime - startTime) +"ms.");"; // 定義新方法名,修改原名 String oldMethodName = methodName + "$old"; // 將原來(lái)的方法名字修改 method.setName(oldMethodName); // 創(chuàng )建新的方法,復制原來(lái)的方法,名字為原來(lái)的名字 CtMethod newMethod = CtNewMethod.copy(method, methodName, ctclass, null); int modifiers = newMethod.getModifiers(); String type = newMethod.getReturnType().getName(); CtClass[] parameterJaTypes = newMethod.getParameterTypes(); // 獲取參數 Class>[] parameterTypes = new Class[parameterJaTypes.length]; for (int var1 = 0; var1

文章采集調用(文章采集調用excel,簡(jiǎn)單,基本就是:1.2)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 122 次瀏覽 ? 2022-02-21 16:02 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(文章采集調用excel,簡(jiǎn)單,基本就是:1.2)
  文章采集調用excel,簡(jiǎn)單,基本就是:1采集工作表中的圖片文字2導出為圖片或者其他類(lèi)型的數據3整理,導出.至于怎么實(shí)現?下載個(gè)rvest就行.
  通過(guò)excel采集電子表格中的內容并直接保存為excel格式
  謝邀目前我還不會(huì )看我看最近會(huì )不會(huì )有類(lèi)似的爬蟲(chóng)項目
  爬蟲(chóng)技術(shù)應該沒(méi)有要求吧?不會(huì )下載rvest嗎?windows直接用filezilla瀏覽器(safari也行)直接登錄就可以了,
  1.excel2.txt+list3.爬蟲(chóng)順便這個(gè)業(yè)余的,
  騰訊xx地圖,
  你可以爬,爬完了批量導出,做個(gè)爬蟲(chóng)app,
  還好我讀書(shū)少,大概覺(jué)得是excel。
  txt
  各大衛視所有電視臺的視頻圖片。
  提取圖片上的文字識別關(guān)鍵詞提取聯(lián)系方式。
  rvest,jieba,sunset_login,ggplot2+lattice基本算是比較精確又簡(jiǎn)單的還要更精確可以借助relaxmat
  respin的代碼
  xlcrollback
  必須是lllllllllllll
  題主都沒(méi)有細化要求,
  vba進(jìn)程中打開(kāi)lllllllllllllw才能完整下載
  當然是我們電視臺??!發(fā)生在湖南某電視臺一個(gè)月,男女老少通吃的驚天大節目,用的工具是啥不知道,具體代碼私信問(wèn)我,懶得碼一大堆。 查看全部

  文章采集調用(文章采集調用excel,簡(jiǎn)單,基本就是:1.2)
  文章采集調用excel,簡(jiǎn)單,基本就是:1采集工作表中的圖片文字2導出為圖片或者其他類(lèi)型的數據3整理,導出.至于怎么實(shí)現?下載個(gè)rvest就行.
  通過(guò)excel采集電子表格中的內容并直接保存為excel格式
  謝邀目前我還不會(huì )看我看最近會(huì )不會(huì )有類(lèi)似的爬蟲(chóng)項目
  爬蟲(chóng)技術(shù)應該沒(méi)有要求吧?不會(huì )下載rvest嗎?windows直接用filezilla瀏覽器(safari也行)直接登錄就可以了,
  1.excel2.txt+list3.爬蟲(chóng)順便這個(gè)業(yè)余的,
  騰訊xx地圖,
  你可以爬,爬完了批量導出,做個(gè)爬蟲(chóng)app,
  還好我讀書(shū)少,大概覺(jué)得是excel。
  txt
  各大衛視所有電視臺的視頻圖片。
  提取圖片上的文字識別關(guān)鍵詞提取聯(lián)系方式。
  rvest,jieba,sunset_login,ggplot2+lattice基本算是比較精確又簡(jiǎn)單的還要更精確可以借助relaxmat
  respin的代碼
  xlcrollback
  必須是lllllllllllll
  題主都沒(méi)有細化要求,
  vba進(jìn)程中打開(kāi)lllllllllllllw才能完整下載
  當然是我們電視臺??!發(fā)生在湖南某電視臺一個(gè)月,男女老少通吃的驚天大節目,用的工具是啥不知道,具體代碼私信問(wèn)我,懶得碼一大堆。

文章采集調用(【干貨】文章采集調用webframework,的處理流程(二))

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 115 次瀏覽 ? 2022-02-20 21:02 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(【干貨】文章采集調用webframework,的處理流程(二))
  文章采集調用webframework,一般都有framework相關(guān)的配置頁(yè)面,
  我們在拿到數據之后,需要先做處理,大致的處理流程如下:獲取對應的sql數據1。將數據存入freesoftwareresources庫2。調用framework相關(guān)的函數來(lái)處理數據cache數據1。寫(xiě)文件,查詢(xún)文件2。寫(xiě)文件加載到存儲池1。遍歷加載器freesoftwareresources庫2。遍歷已經(jīng)加載到存儲池的數據3。讀取文件(對于apollo是直接對數據進(jìn)行分析,對于js來(lái)說(shuō)是解析)。
  文件放在linux的/etc/freebsd下
  文件系統文件夾里~.
  對于文本文件的處理,可以使用thread,并發(fā)處理文件。
  標準是,在單節點(diǎn)環(huán)境下,1,如果兩個(gè)guest同在一個(gè)freebsd集群中,使用nodelocal,2,如果第一個(gè)節點(diǎn)集群關(guān)閉,會(huì )走guest的mapjoin互相peer3,若多個(gè)節點(diǎn)同在一個(gè)freebsd集群中,那么guest之間peer互相轉。因為節點(diǎn)cluster是獨立的。
  一個(gè)freebsd進(jìn)程內共享一個(gè)文件系統。在該文件系統上,webid登記了兩種操作,具體也可以類(lèi)比為java中的session,從guest(創(chuàng )建)到guestparent(usercreate)到guestuser(usercreate)的user操作。有兩種策略可以實(shí)現同一臺設備內的peer互相轉發(fā):每一個(gè)freebsd進(jìn)程都將本機上共享的文件共享給自己。
  用來(lái)保證這種共享互相轉發(fā)的可行性:可以實(shí)現guest對于本機來(lái)說(shuō)都是存在的,所以freebsd集群內不必存在guest對本機共享的文件?;蛘哌x擇利用userprotocolswitch。開(kāi)端點(diǎn),停止點(diǎn),主機復制。你可以研究下nodelocalwebprotocolpaths的實(shí)現,能很好地解決這個(gè)問(wèn)題。
  tls也是基于userprotocol。usermap到文件/path分布中,usermap到文件/fsuserprotocol主要處理的問(wèn)題是文件/fs開(kāi)端點(diǎn)到userprotocolswitch連接,這個(gè)都可以通過(guò)protocolentryvesting做到。 查看全部

  文章采集調用(【干貨】文章采集調用webframework,的處理流程(二))
  文章采集調用webframework,一般都有framework相關(guān)的配置頁(yè)面,
  我們在拿到數據之后,需要先做處理,大致的處理流程如下:獲取對應的sql數據1。將數據存入freesoftwareresources庫2。調用framework相關(guān)的函數來(lái)處理數據cache數據1。寫(xiě)文件,查詢(xún)文件2。寫(xiě)文件加載到存儲池1。遍歷加載器freesoftwareresources庫2。遍歷已經(jīng)加載到存儲池的數據3。讀取文件(對于apollo是直接對數據進(jìn)行分析,對于js來(lái)說(shuō)是解析)。
  文件放在linux的/etc/freebsd下
  文件系統文件夾里~.
  對于文本文件的處理,可以使用thread,并發(fā)處理文件。
  標準是,在單節點(diǎn)環(huán)境下,1,如果兩個(gè)guest同在一個(gè)freebsd集群中,使用nodelocal,2,如果第一個(gè)節點(diǎn)集群關(guān)閉,會(huì )走guest的mapjoin互相peer3,若多個(gè)節點(diǎn)同在一個(gè)freebsd集群中,那么guest之間peer互相轉。因為節點(diǎn)cluster是獨立的。
  一個(gè)freebsd進(jìn)程內共享一個(gè)文件系統。在該文件系統上,webid登記了兩種操作,具體也可以類(lèi)比為java中的session,從guest(創(chuàng )建)到guestparent(usercreate)到guestuser(usercreate)的user操作。有兩種策略可以實(shí)現同一臺設備內的peer互相轉發(fā):每一個(gè)freebsd進(jìn)程都將本機上共享的文件共享給自己。
  用來(lái)保證這種共享互相轉發(fā)的可行性:可以實(shí)現guest對于本機來(lái)說(shuō)都是存在的,所以freebsd集群內不必存在guest對本機共享的文件?;蛘哌x擇利用userprotocolswitch。開(kāi)端點(diǎn),停止點(diǎn),主機復制。你可以研究下nodelocalwebprotocolpaths的實(shí)現,能很好地解決這個(gè)問(wèn)題。
  tls也是基于userprotocol。usermap到文件/path分布中,usermap到文件/fsuserprotocol主要處理的問(wèn)題是文件/fs開(kāi)端點(diǎn)到userprotocolswitch連接,這個(gè)都可以通過(guò)protocolentryvesting做到。

文章采集調用(小蜜蜂公眾號文章助手上線(xiàn),復制文字還沒(méi)有什么?)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 157 次瀏覽 ? 2022-02-17 11:16 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(小蜜蜂公眾號文章助手上線(xiàn),復制文字還沒(méi)有什么?)
  現在小蜜蜂公眾號文章助手上線(xiàn),可以采集任意公眾號歷史文章,支持點(diǎn)贊數、閱讀數、評論數采集,支持導出PDF ,Excel,HTML,TXT格式導出,支持關(guān)鍵詞搜索,可以去官網(wǎng)查看
  許多微信公眾號作者(個(gè)人、組織、公司)不僅在微信公眾平臺上寫(xiě)作,而且通常文章在多個(gè)平臺上推送,例如今日頭條、知乎專(zhuān)欄、短書(shū)等,甚至有自己的網(wǎng)站(官網(wǎng)),但是在多個(gè)平臺上發(fā)布文章是一項非常耗時(shí)的工作。
  大多數 網(wǎng)站 構建都基于 WordPress,因為該平臺非常簡(jiǎn)單實(shí)用,并且有大量插件。因此,我也不例外。當我選擇建站系統時(shí),首先選擇的是 WordPress。不過(guò)我經(jīng)常寫(xiě)文章發(fā)現一個(gè)問(wèn)題,就是每次在公眾號寫(xiě)文章,我把文章@文章手動(dòng)復制到WordPress上,復制文字沒(méi)什么,但復制圖片會(huì )殺了我。微信公眾號文章的圖片不能直接復制到WordPress,會(huì )顯示為“無(wú)法顯示。這張圖片”,因為微信對圖片做了防盜鏈措施。
  這時(shí)候嘗試搜索了這樣一個(gè)插件,可以通過(guò)粘貼公眾號文章的鏈接直接將內容導入WordPress,并將圖片下載到本地(媒體庫),于是我開(kāi)發(fā)了一個(gè)叫Bee采集的插件,除了微信公眾號文章,還可以導入今日頭條、短書(shū)、知乎欄目的文章,并且還有各種多種可選功能,除此之外,還可以采集other網(wǎng)站,只要配置好相應的規則即可
  
  使用也很簡(jiǎn)單,粘貼鏈接即可,可以同時(shí)導入多個(gè)文章,即批量導入功能,自動(dòng)同步采集公眾號功能文章
  下載的話(huà)直接在安裝插件頁(yè)面搜索蜜蜂采集就可以看到
  
  希望這篇筆記可以幫到你 查看全部

  文章采集調用(小蜜蜂公眾號文章助手上線(xiàn),復制文字還沒(méi)有什么?)
  現在小蜜蜂公眾號文章助手上線(xiàn),可以采集任意公眾號歷史文章,支持點(diǎn)贊數、閱讀數、評論數采集,支持導出PDF ,Excel,HTML,TXT格式導出,支持關(guān)鍵詞搜索,可以去官網(wǎng)查看
  許多微信公眾號作者(個(gè)人、組織、公司)不僅在微信公眾平臺上寫(xiě)作,而且通常文章在多個(gè)平臺上推送,例如今日頭條、知乎專(zhuān)欄、短書(shū)等,甚至有自己的網(wǎng)站(官網(wǎng)),但是在多個(gè)平臺上發(fā)布文章是一項非常耗時(shí)的工作。
  大多數 網(wǎng)站 構建都基于 WordPress,因為該平臺非常簡(jiǎn)單實(shí)用,并且有大量插件。因此,我也不例外。當我選擇建站系統時(shí),首先選擇的是 WordPress。不過(guò)我經(jīng)常寫(xiě)文章發(fā)現一個(gè)問(wèn)題,就是每次在公眾號寫(xiě)文章,我把文章@文章手動(dòng)復制到WordPress上,復制文字沒(méi)什么,但復制圖片會(huì )殺了我。微信公眾號文章的圖片不能直接復制到WordPress,會(huì )顯示為“無(wú)法顯示。這張圖片”,因為微信對圖片做了防盜鏈措施。
  這時(shí)候嘗試搜索了這樣一個(gè)插件,可以通過(guò)粘貼公眾號文章的鏈接直接將內容導入WordPress,并將圖片下載到本地(媒體庫),于是我開(kāi)發(fā)了一個(gè)叫Bee采集的插件,除了微信公眾號文章,還可以導入今日頭條、短書(shū)、知乎欄目的文章,并且還有各種多種可選功能,除此之外,還可以采集other網(wǎng)站,只要配置好相應的規則即可
  
  使用也很簡(jiǎn)單,粘貼鏈接即可,可以同時(shí)導入多個(gè)文章,即批量導入功能,自動(dòng)同步采集公眾號功能文章
  下載的話(huà)直接在安裝插件頁(yè)面搜索蜜蜂采集就可以看到
  
  希望這篇筆記可以幫到你

文章采集調用(python爬取參考文章AnyProxy代理批量采集實(shí)現方法:anyproxy+js )

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 134 次瀏覽 ? 2022-02-16 22:08 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(python爬取參考文章AnyProxy代理批量采集實(shí)現方法:anyproxy+js
)
  蟒蛇爬行
  參考文章
  AnyProxy 代理批量采集
  實(shí)現方式:anyproxy+js
  實(shí)現方式:anyproxy+java+webmagic
  FiddlerCore
  實(shí)現方式:抓包工具,Fiddler4
  通過(guò)捕獲和分析多個(gè)賬戶(hù),可以確定:
  步:
  1、編寫(xiě)按鈕向導腳本,在手機端自動(dòng)點(diǎn)擊公眾號文章的列表頁(yè)面,即“查看歷史消息”;
  2、使用fiddler代理劫持??手機訪(fǎng)問(wèn),將URL轉發(fā)到php編寫(xiě)的本地網(wǎng)頁(yè);
  3、將接收到的URL備份到php網(wǎng)頁(yè)上的數據庫中;
  4、使用python從數據庫中檢索URL,然后進(jìn)行正常爬取。
  在爬升過(guò)程中發(fā)現了一個(gè)問(wèn)題:
  如果只是想爬文章內容,貌似沒(méi)有訪(fǎng)問(wèn)頻率限制,但是如果想爬讀點(diǎn)贊數,達到一定頻率后,返回值會(huì )變成null,時(shí)間間隔我設置了10秒,就可以正常取了。在這個(gè)頻率下,一個(gè)小時(shí)只能取到 360 條,沒(méi)有實(shí)際意義。
  青波新名單
  如果你只是想看數據,你可以不花錢(qián)只看每日清單。如果你需要訪(fǎng)問(wèn)自己的系統,他們也提供了一個(gè)api接口
  Part3 項目步驟基本原則
  網(wǎng)站收錄最微信公眾號文章會(huì )定期更新,經(jīng)測試發(fā)現對爬蟲(chóng)更友好
  網(wǎng)站頁(yè)面排版和排版規則,不同公眾號以鏈接中的賬號區分
  公眾號采集下的文章也有定期翻頁(yè):id號每翻一頁(yè)+12
  
  傳送門(mén)副本.png
  所以這個(gè)想法可能是
  環(huán)境相關(guān)包獲取頁(yè)面
  def get_one_page(url):
#需要加一個(gè)請求頭部,不然會(huì )被網(wǎng)站封禁
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'}
try:
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status #若不為200,則引發(fā)HTTPError錯誤
response.encoding = response.apparent_encoding
return response.text
except:
return "產(chǎn)生異常"
  注意目標爬蟲(chóng)網(wǎng)站必須添加headers,否則會(huì )直接拒絕訪(fǎng)問(wèn)
  正則解析html
  def parse_one_page(html):
pattern = re.compile('.*?.*?<a class="question_link" href="(.*?)".*?_blank"(.*?)/a.*?"timestamp".*?">(.*?)', re.S)
items = re.findall(pattern, html)
return items
  自動(dòng)跳轉頁(yè)面
  def main(offset, i):
url = 'http://chuansong.me/account/' + str(offset) + '?start=' + str(12*i)
print(url)
wait = round(random.uniform(1,2),2) # 設置隨機爬蟲(chóng)間隔,避免被封
time.sleep(wait)
html = get_one_page(url)
for item in parse_one_page(html):
info = 'http://chuansong.me'+item[0]+','+ item[1]+','+item[2]+'\n'
info = repr(info.replace('\n', ''))
print(info)
#info.strip('\"') #這種去不掉首尾的“
#info = info[1:-1] #這種去不掉首尾的“
#info.Trim("".ToCharArray())
#info.TrimStart('\"').TrimEnd('\"')
write_to_file(info, offset)
  從標題中刪除非法字符
  因為windows下的file命令,有些字符不能使用,所以需要使用正則剔除
  itle = re.sub('[\\\\/:*?\"|]', '', info.loc[indexs]['標題'])
  轉換html
  使用pandas的read_csv函數讀取爬取的csv文件,循環(huán)遍歷“l(fā)ink”、“title”、“date”
  def html_to_pdf(offset):
wait = round(random.uniform(1,2),2) # 設置隨機爬蟲(chóng)間隔,避免被封
time.sleep(wait)
path = get_path(offset)
path_wk = r'D:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe' #安裝wkhtmltopdf的位置
config = pdfkit.configuration(wkhtmltopdf = path_wk)
if path == "" :
print("尚未抓取該公眾號")
else:
info = get_url_info(offset)
for indexs in info.index:
url = info.loc[indexs]['鏈接']
title = re.sub('[\\\\/:*?\"|]', '', info.loc[indexs]['標題'])
date = info.loc[indexs]['日期']
wait = round(random.uniform(4,5),2) # 設置隨機爬蟲(chóng)間隔,避免被封
time.sleep(wait)
print(url)
with eventlet.Timeout(4,False):
pdfkit.from_url(url, get_path(offset)+'\\'+ date+'_'+title+'.pdf', configuration=config)
print('轉換成功!')
  結果顯示爬取結果
  
  result1-copy.png
  爬取的幾個(gè)公眾號存放在文件夾中
  
  結果 2 - 復制.png
  文件夾目錄的內容
  
  result3-copy.png
  抓取的 CSV 內容格式
  生成的 PDF 結果
  
  result4-copy.png
  遇到的問(wèn)題問(wèn)題1
   for item in parse_one_page(html):
info = 'http://chuansong.me'+item[0]+','+ item[1]+','+item[2]+'\n'
info = repr(info.replace('\n', ''))
info = info.strip('\"')
print(info)
#info.strip('\"') #這種去不掉首尾的“
#info = info[1:-1] #這種去不掉首尾的“
#info.Trim("".ToCharArray())
#info.TrimStart('\"').TrimEnd('\"')
write_to_file(info, offset)
  解決方案
   字符串中首尾帶有“”,使用上文中的#注釋部分的各種方法都不好使,
最后的解決辦法是:
在寫(xiě)入字符串的代碼出,加上.strip('\'\"'),以去掉‘和”
with open(path, 'a', encoding='utf-8') as f: #追加存儲形式,content是字典形式
f.write(str(json.dumps(content, ensure_ascii=False).strip('\'\"') + '\n'))
f.close()
  問(wèn)題2
  調用wkhtmltopdf.exe將html轉成pdf報錯
調用代碼
``` python
path_wk = 'D:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe'
config = pdfkit.configuration(wkhtmltopdf = path_wk)
pdfkit.from_url(url, get_path(offset)+'\\taobao.pdf', configuration=config)
```
  錯誤信息
   OSError: No wkhtmltopdf executable found: "D:\Program Files\wkhtmltopdin\wkhtmltopdf.exe"
If this file exists please check that this process can read it. Otherwise please install wkhtmltopdf - https://github.com/JazzCore/py ... topdf
  解決方案
   path_wk = r'D:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe'
config = pdfkit.configuration(wkhtmltopdf = path_wk)
pdfkit.from_url(url, get_path(offset)+'\\taobao.pdf', configuration=config)
   或者
   path_wk = 'D:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltopdf.exe'
config = pdfkit.configuration(wkhtmltopdf = path_wk)
pdfkit.from_url(url, get_path(offset)+'\\taobao.pdf', configuration=config)
  原因
   Your config path contains an ASCII Backspace, the \b in \bin,
which pdfkit appears to be stripping out and converting D:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe
to D:\Program Files\wkhtmltopdf\wkhtmltopdf.exe. 查看全部

  文章采集調用(python爬取參考文章AnyProxy代理批量采集實(shí)現方法:anyproxy+js
)
  蟒蛇爬行
  參考文章
  AnyProxy 代理批量采集
  實(shí)現方式:anyproxy+js
  實(shí)現方式:anyproxy+java+webmagic
  FiddlerCore
  實(shí)現方式:抓包工具,Fiddler4
  通過(guò)捕獲和分析多個(gè)賬戶(hù),可以確定:
  步:
  1、編寫(xiě)按鈕向導腳本,在手機端自動(dòng)點(diǎn)擊公眾號文章的列表頁(yè)面,即“查看歷史消息”;
  2、使用fiddler代理劫持??手機訪(fǎng)問(wèn),將URL轉發(fā)到php編寫(xiě)的本地網(wǎng)頁(yè);
  3、將接收到的URL備份到php網(wǎng)頁(yè)上的數據庫中;
  4、使用python從數據庫中檢索URL,然后進(jìn)行正常爬取。
  在爬升過(guò)程中發(fā)現了一個(gè)問(wèn)題:
  如果只是想爬文章內容,貌似沒(méi)有訪(fǎng)問(wèn)頻率限制,但是如果想爬讀點(diǎn)贊數,達到一定頻率后,返回值會(huì )變成null,時(shí)間間隔我設置了10秒,就可以正常取了。在這個(gè)頻率下,一個(gè)小時(shí)只能取到 360 條,沒(méi)有實(shí)際意義。
  青波新名單
  如果你只是想看數據,你可以不花錢(qián)只看每日清單。如果你需要訪(fǎng)問(wèn)自己的系統,他們也提供了一個(gè)api接口
  Part3 項目步驟基本原則
  網(wǎng)站收錄最微信公眾號文章會(huì )定期更新,經(jīng)測試發(fā)現對爬蟲(chóng)更友好
  網(wǎng)站頁(yè)面排版和排版規則,不同公眾號以鏈接中的賬號區分
  公眾號采集下的文章也有定期翻頁(yè):id號每翻一頁(yè)+12
  
  傳送門(mén)副本.png
  所以這個(gè)想法可能是
  環(huán)境相關(guān)包獲取頁(yè)面
  def get_one_page(url):
#需要加一個(gè)請求頭部,不然會(huì )被網(wǎng)站封禁
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'}
try:
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status #若不為200,則引發(fā)HTTPError錯誤
response.encoding = response.apparent_encoding
return response.text
except:
return "產(chǎn)生異常"
  注意目標爬蟲(chóng)網(wǎng)站必須添加headers,否則會(huì )直接拒絕訪(fǎng)問(wèn)
  正則解析html
  def parse_one_page(html):
pattern = re.compile('.*?.*?<a class="question_link" href="(.*?)".*?_blank"(.*?)/a.*?"timestamp".*?">(.*?)', re.S)
items = re.findall(pattern, html)
return items
  自動(dòng)跳轉頁(yè)面
  def main(offset, i):
url = 'http://chuansong.me/account/' + str(offset) + '?start=' + str(12*i)
print(url)
wait = round(random.uniform(1,2),2) # 設置隨機爬蟲(chóng)間隔,避免被封
time.sleep(wait)
html = get_one_page(url)
for item in parse_one_page(html):
info = 'http://chuansong.me'+item[0]+','+ item[1]+','+item[2]+'\n'
info = repr(info.replace('\n', ''))
print(info)
#info.strip('\"') #這種去不掉首尾的“
#info = info[1:-1] #這種去不掉首尾的“
#info.Trim("".ToCharArray())
#info.TrimStart('\"').TrimEnd('\"')
write_to_file(info, offset)
  從標題中刪除非法字符
  因為windows下的file命令,有些字符不能使用,所以需要使用正則剔除
  itle = re.sub('[\\\\/:*?\"|]', '', info.loc[indexs]['標題'])
  轉換html
  使用pandas的read_csv函數讀取爬取的csv文件,循環(huán)遍歷“l(fā)ink”、“title”、“date”
  def html_to_pdf(offset):
wait = round(random.uniform(1,2),2) # 設置隨機爬蟲(chóng)間隔,避免被封
time.sleep(wait)
path = get_path(offset)
path_wk = r'D:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe' #安裝wkhtmltopdf的位置
config = pdfkit.configuration(wkhtmltopdf = path_wk)
if path == "" :
print("尚未抓取該公眾號")
else:
info = get_url_info(offset)
for indexs in info.index:
url = info.loc[indexs]['鏈接']
title = re.sub('[\\\\/:*?\"|]', '', info.loc[indexs]['標題'])
date = info.loc[indexs]['日期']
wait = round(random.uniform(4,5),2) # 設置隨機爬蟲(chóng)間隔,避免被封
time.sleep(wait)
print(url)
with eventlet.Timeout(4,False):
pdfkit.from_url(url, get_path(offset)+'\\'+ date+'_'+title+'.pdf', configuration=config)
print('轉換成功!')
  結果顯示爬取結果
  
  result1-copy.png
  爬取的幾個(gè)公眾號存放在文件夾中
  
  結果 2 - 復制.png
  文件夾目錄的內容
  
  result3-copy.png
  抓取的 CSV 內容格式
  生成的 PDF 結果
  
  result4-copy.png
  遇到的問(wèn)題問(wèn)題1
   for item in parse_one_page(html):
info = 'http://chuansong.me'+item[0]+','+ item[1]+','+item[2]+'\n'
info = repr(info.replace('\n', ''))
info = info.strip('\"')
print(info)
#info.strip('\"') #這種去不掉首尾的“
#info = info[1:-1] #這種去不掉首尾的“
#info.Trim("".ToCharArray())
#info.TrimStart('\"').TrimEnd('\"')
write_to_file(info, offset)
  解決方案
   字符串中首尾帶有“”,使用上文中的#注釋部分的各種方法都不好使,
最后的解決辦法是:
在寫(xiě)入字符串的代碼出,加上.strip('\'\"'),以去掉‘和”
with open(path, 'a', encoding='utf-8') as f: #追加存儲形式,content是字典形式
f.write(str(json.dumps(content, ensure_ascii=False).strip('\'\"') + '\n'))
f.close()
  問(wèn)題2
  調用wkhtmltopdf.exe將html轉成pdf報錯
調用代碼
``` python
path_wk = 'D:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe'
config = pdfkit.configuration(wkhtmltopdf = path_wk)
pdfkit.from_url(url, get_path(offset)+'\\taobao.pdf', configuration=config)
```
  錯誤信息
   OSError: No wkhtmltopdf executable found: "D:\Program Files\wkhtmltopdin\wkhtmltopdf.exe"
If this file exists please check that this process can read it. Otherwise please install wkhtmltopdf - https://github.com/JazzCore/py ... topdf
  解決方案
   path_wk = r'D:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe'
config = pdfkit.configuration(wkhtmltopdf = path_wk)
pdfkit.from_url(url, get_path(offset)+'\\taobao.pdf', configuration=config)
   或者
   path_wk = 'D:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltopdf.exe'
config = pdfkit.configuration(wkhtmltopdf = path_wk)
pdfkit.from_url(url, get_path(offset)+'\\taobao.pdf', configuration=config)
  原因
   Your config path contains an ASCII Backspace, the \b in \bin,
which pdfkit appears to be stripping out and converting D:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe
to D:\Program Files\wkhtmltopdf\wkhtmltopdf.exe.

文章采集調用(java項目中如何實(shí)現攝像頭圖像采集圖片數據采集? )

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 150 次瀏覽 ? 2022-02-15 07:08 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(java項目中如何實(shí)現攝像頭圖像采集圖片數據采集?
)
  最近一個(gè)項目需要實(shí)現攝像頭圖像采集,經(jīng)過(guò)一系列的折騰,終于實(shí)現了這個(gè)功能,現在整理一下。
  就java技術(shù)而言,為了實(shí)現相機的二次開(kāi)發(fā),采集相機圖片需要使用JMF。JMF 適合在 j2se 程序中使用。我需要在網(wǎng)絡(luò )程序中調用相機。顯然,JMF 處理不了?,F在想寫(xiě)個(gè)applet程序,但是那個(gè)東西需要客戶(hù)端有jre環(huán)境,不適合我。您不能指望用戶(hù)在訪(fǎng)問(wèn)您的 網(wǎng)站 jre 進(jìn)行安裝然后再次訪(fǎng)問(wèn)時(shí)下載一個(gè)大文件嗎?
  既然JMF不適用,那么我們在java項目中如何控制攝像頭抓拍呢?在windows平臺下,我們可以使用視頻采集卡等二次開(kāi)發(fā)包來(lái)訪(fǎng)問(wèn)視頻數據,但是現在攝像頭都是usb的,甚至筆記本屏幕都有攝像頭,這種情況下使用的解決方案采集卡二次開(kāi)發(fā)包不適用。你只能自己編寫(xiě)一個(gè)程序來(lái)做類(lèi)似“相機相機軟件”的事情。經(jīng)過(guò)一系列的分析,終于實(shí)現了在web程序中調用攝像頭,可以通過(guò)js代碼控制攝像頭,通過(guò)ajax技術(shù)上傳數據。雖然我沒(méi)有在程序中測試過(guò),但是應該支持.net技術(shù),也可以在采集Camera data的項目中實(shí)現,例如,
  啰嗦一大堆,程序放在csdn下載資源上面,以后不用到處找相機二次開(kāi)發(fā)了,直接下載使用就行了。
  攝像頭程序下載地址
  壓縮包中收錄一個(gè)基于純網(wǎng)頁(yè)采集的相機照片示例程序,以及一個(gè)基于jquery框架的ajax數據操作程序示例。調用攝像頭的方法詳見(jiàn)示例代碼。相信稍微懂一點(diǎn)技術(shù)的人應該都能看懂。了解了,有一個(gè)完整的基于java技術(shù)的photo采集示例程序,使用jsp頁(yè)面采集的照片,serlvet程序接收攝像頭照片數據。
  以下是程序運行效果示例:
   查看全部

  文章采集調用(java項目中如何實(shí)現攝像頭圖像采集圖片數據采集?
)
  最近一個(gè)項目需要實(shí)現攝像頭圖像采集,經(jīng)過(guò)一系列的折騰,終于實(shí)現了這個(gè)功能,現在整理一下。
  就java技術(shù)而言,為了實(shí)現相機的二次開(kāi)發(fā),采集相機圖片需要使用JMF。JMF 適合在 j2se 程序中使用。我需要在網(wǎng)絡(luò )程序中調用相機。顯然,JMF 處理不了?,F在想寫(xiě)個(gè)applet程序,但是那個(gè)東西需要客戶(hù)端有jre環(huán)境,不適合我。您不能指望用戶(hù)在訪(fǎng)問(wèn)您的 網(wǎng)站 jre 進(jìn)行安裝然后再次訪(fǎng)問(wèn)時(shí)下載一個(gè)大文件嗎?
  既然JMF不適用,那么我們在java項目中如何控制攝像頭抓拍呢?在windows平臺下,我們可以使用視頻采集卡等二次開(kāi)發(fā)包來(lái)訪(fǎng)問(wèn)視頻數據,但是現在攝像頭都是usb的,甚至筆記本屏幕都有攝像頭,這種情況下使用的解決方案采集卡二次開(kāi)發(fā)包不適用。你只能自己編寫(xiě)一個(gè)程序來(lái)做類(lèi)似“相機相機軟件”的事情。經(jīng)過(guò)一系列的分析,終于實(shí)現了在web程序中調用攝像頭,可以通過(guò)js代碼控制攝像頭,通過(guò)ajax技術(shù)上傳數據。雖然我沒(méi)有在程序中測試過(guò),但是應該支持.net技術(shù),也可以在采集Camera data的項目中實(shí)現,例如,
  啰嗦一大堆,程序放在csdn下載資源上面,以后不用到處找相機二次開(kāi)發(fā)了,直接下載使用就行了。
  攝像頭程序下載地址
  壓縮包中收錄一個(gè)基于純網(wǎng)頁(yè)采集的相機照片示例程序,以及一個(gè)基于jquery框架的ajax數據操作程序示例。調用攝像頭的方法詳見(jiàn)示例代碼。相信稍微懂一點(diǎn)技術(shù)的人應該都能看懂。了解了,有一個(gè)完整的基于java技術(shù)的photo采集示例程序,使用jsp頁(yè)面采集的照片,serlvet程序接收攝像頭照片數據。
  以下是程序運行效果示例:
  

文章采集調用(下采集神器:chromedp+HeadlessChrome安裝安裝)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 843 次瀏覽 ? 2022-02-14 22:03 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(下采集神器:chromedp+HeadlessChrome安裝安裝)
  最近在采集微信文章的時(shí)候,遇到了一個(gè)比較棘手的問(wèn)題。通過(guò)搜狗搜索的微信搜索模式,普通的直接爬取頁(yè)面的方式無(wú)法繞過(guò)搜狗搜索的驗證。于是使用gorequest成功采集到微信文章。
  選擇 chromedp + Headless Chrome
  面對采集的目標沒(méi)有達到的問(wèn)題,我是不是該放棄了?顯然不可能。你不是只有簽名驗證嗎?只要不需要驗證碼,總有辦法解決的(蒽,一般的驗證碼也可以解決)。于是犧牲了golang下的采集神器:chromedp。
  簡(jiǎn)單來(lái)說(shuō),chromedp是golang語(yǔ)言用來(lái)調用Chrome調試協(xié)議來(lái)模擬瀏覽器行為,以簡(jiǎn)單的方式驅動(dòng)瀏覽器的一個(gè)包。使用它只有一個(gè)簡(jiǎn)單的前提,那就是在你的電腦上安裝 Chrome 瀏覽器。
  Chrome瀏覽器的安裝在Windows和macOS下沒(méi)有問(wèn)題,在桌面版Linux下也沒(méi)有問(wèn)題。但是在Linux服務(wù)器版上安裝Chrome并不是那么簡(jiǎn)單,至少目前還沒(méi)有可以直接在服務(wù)器上安裝Chrome的包。
  但是你要放棄你剛才的想法嗎?當然這是不可能的。翻閱chromedp的文檔,剛好找到一段:
  最簡(jiǎn)單的方法是在 chromedp/headless-shell 映像中運行使用 chromedp 的 Go 程序。該圖像收錄無(wú)頭外殼,一種較小的無(wú)頭版本的 Chrome,chromedp 能夠開(kāi)箱即用地找到它。
  他的意思是:最簡(jiǎn)單的方法是使用 chromedp 調用 chromedp/headless-shell 鏡像。chromedp/headless-shell 是一個(gè) docker 鏡像,收錄較小的 Chrome 無(wú)頭瀏覽器。
  好吧,既然是docker鏡像,那就用docker來(lái)安裝吧。
  首先登錄我們的linux服務(wù)器,下面的操作就是你已經(jīng)登錄了linux服務(wù)器了。
  安裝 docker 并安裝 chromedp/headless-shell
  如果您的服務(wù)器已經(jīng)安裝了 docker,請跳過(guò)此步驟。
  用 yum 安裝 docker
  yum install docker
  安裝完成后,此時(shí)無(wú)法直接使用docker,需要執行以下命令激活
  systemctl daemon-reload
service docker restart
  然后安裝 chromedp/headless-shell 鏡像
  docker pull chromedp/headless-shell:latest
  等待安裝完成,然后運行docker鏡像
  docker run -d -p 9222:9222 --rm --name headless-shell chromedp/headless-shell
  運行后測試chrome是否正常:
  curl http://127.0.0.1:9222/json/version
  如果您看到類(lèi)似以下內容,則 chrome 瀏覽器工作正常
  { “瀏覽器”:“Chrome/96.0.4664.110”,“協(xié)議版本”:“1.3”,“用戶(hù)代理”:“ Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, 像 Gecko) Chrome/96.0.4664.110 Safari/537.36", "V8-版本": "9.6.180.21", "WebKit-版本": "537.36 (@d5ef0e8214bc14c9b5bbf69a1515e431394c62a6)", "webSocketDebuggerUrl": "ws://127.0.0.1:9222/devtools/browser/a41cd42b-99ef -4d5b-b9e6-37d634aa719a" }
  chromedp代碼調用chromedp/headless-shell的內容采集微信公眾號文章
  以上已經(jīng)可以在linux下正常使用Headless Chrome無(wú)頭瀏覽器了。剩下的就是調用它的代碼。
  下面開(kāi)始編寫(xiě)采集WeChat文章使用的chrome代碼:
  定義關(guān)鍵字,artile struct.go
  package main
type Keyword struct {
Id int64 `json:"id"`
Name string `json:"name"`
Level int `json:"level"`
ArticleCount int `json:"article_count"`
LastTime int64 `json:"last_time"` //上次執行時(shí)間
}
type Article struct {
Id int64 `json:"id"`
KeywordId int64 `json:"keyword_id"`
Title string `json:"title"`
Keywords string `json:"keywords"`
Description string `json:"description"`
OriginUrl string `json:"origin_url"`
Status int `json:"status"`
CreatedTime int `json:"created_time"`
UpdatedTime int `json:"updated_time"`
Content string `json:"content"`
ContentText string `json:"-"`
}
  編寫(xiě)核心代碼core.go
<p>package main
import (
"context"
"fmt"
"github.com/chromedp/cdproto/cdp"
"github.com/chromedp/chromedp"
"log"
"net"
"net/url"
"strings"
"time"
)
func CollectArticleFromWeixin(keyword *Keyword) []*Article {
timeCtx, cancel := context.WithTimeout(GetChromeCtx(false), 30*time.Second)
defer cancel()
var collectLink string
err := chromedp.Run(timeCtx,
chromedp.Navigate(fmt.Sprintf("https://weixin.sogou.com/weixi ... ot%3B, keyword.Name)),
chromedp.WaitVisible(`//ul[@class="news-list"]`),
chromedp.Location(&collectLink),
)
if err != nil {
log.Println("讀取搜狗搜索列表失敗1:", keyword.Name, err.Error())
return nil
}
log.Println("正在采集列表:", collectLink)
var aLinks []*cdp.Node
if err := chromedp.Run(timeCtx, chromedp.Nodes(`//ul[@class="news-list"]//h3//a`, &aLinks)); err != nil {
log.Println("讀取搜狗搜索列表失敗2:", keyword.Name, err.Error())
return nil
}
var articles []*Article
for i := 0; i 查看全部

  文章采集調用(下采集神器:chromedp+HeadlessChrome安裝安裝)
  最近在采集微信文章的時(shí)候,遇到了一個(gè)比較棘手的問(wèn)題。通過(guò)搜狗搜索的微信搜索模式,普通的直接爬取頁(yè)面的方式無(wú)法繞過(guò)搜狗搜索的驗證。于是使用gorequest成功采集到微信文章。
  選擇 chromedp + Headless Chrome
  面對采集的目標沒(méi)有達到的問(wèn)題,我是不是該放棄了?顯然不可能。你不是只有簽名驗證嗎?只要不需要驗證碼,總有辦法解決的(蒽,一般的驗證碼也可以解決)。于是犧牲了golang下的采集神器:chromedp。
  簡(jiǎn)單來(lái)說(shuō),chromedp是golang語(yǔ)言用來(lái)調用Chrome調試協(xié)議來(lái)模擬瀏覽器行為,以簡(jiǎn)單的方式驅動(dòng)瀏覽器的一個(gè)包。使用它只有一個(gè)簡(jiǎn)單的前提,那就是在你的電腦上安裝 Chrome 瀏覽器。
  Chrome瀏覽器的安裝在Windows和macOS下沒(méi)有問(wèn)題,在桌面版Linux下也沒(méi)有問(wèn)題。但是在Linux服務(wù)器版上安裝Chrome并不是那么簡(jiǎn)單,至少目前還沒(méi)有可以直接在服務(wù)器上安裝Chrome的包。
  但是你要放棄你剛才的想法嗎?當然這是不可能的。翻閱chromedp的文檔,剛好找到一段:
  最簡(jiǎn)單的方法是在 chromedp/headless-shell 映像中運行使用 chromedp 的 Go 程序。該圖像收錄無(wú)頭外殼,一種較小的無(wú)頭版本的 Chrome,chromedp 能夠開(kāi)箱即用地找到它。
  他的意思是:最簡(jiǎn)單的方法是使用 chromedp 調用 chromedp/headless-shell 鏡像。chromedp/headless-shell 是一個(gè) docker 鏡像,收錄較小的 Chrome 無(wú)頭瀏覽器。
  好吧,既然是docker鏡像,那就用docker來(lái)安裝吧。
  首先登錄我們的linux服務(wù)器,下面的操作就是你已經(jīng)登錄了linux服務(wù)器了。
  安裝 docker 并安裝 chromedp/headless-shell
  如果您的服務(wù)器已經(jīng)安裝了 docker,請跳過(guò)此步驟。
  用 yum 安裝 docker
  yum install docker
  安裝完成后,此時(shí)無(wú)法直接使用docker,需要執行以下命令激活
  systemctl daemon-reload
service docker restart
  然后安裝 chromedp/headless-shell 鏡像
  docker pull chromedp/headless-shell:latest
  等待安裝完成,然后運行docker鏡像
  docker run -d -p 9222:9222 --rm --name headless-shell chromedp/headless-shell
  運行后測試chrome是否正常:
  curl http://127.0.0.1:9222/json/version
  如果您看到類(lèi)似以下內容,則 chrome 瀏覽器工作正常
  { “瀏覽器”:“Chrome/96.0.4664.110”,“協(xié)議版本”:“1.3”,“用戶(hù)代理”:“ Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, 像 Gecko) Chrome/96.0.4664.110 Safari/537.36", "V8-版本": "9.6.180.21", "WebKit-版本": "537.36 (@d5ef0e8214bc14c9b5bbf69a1515e431394c62a6)", "webSocketDebuggerUrl": "ws://127.0.0.1:9222/devtools/browser/a41cd42b-99ef -4d5b-b9e6-37d634aa719a" }
  chromedp代碼調用chromedp/headless-shell的內容采集微信公眾號文章
  以上已經(jīng)可以在linux下正常使用Headless Chrome無(wú)頭瀏覽器了。剩下的就是調用它的代碼。
  下面開(kāi)始編寫(xiě)采集WeChat文章使用的chrome代碼:
  定義關(guān)鍵字,artile struct.go
  package main
type Keyword struct {
Id int64 `json:"id"`
Name string `json:"name"`
Level int `json:"level"`
ArticleCount int `json:"article_count"`
LastTime int64 `json:"last_time"` //上次執行時(shí)間
}
type Article struct {
Id int64 `json:"id"`
KeywordId int64 `json:"keyword_id"`
Title string `json:"title"`
Keywords string `json:"keywords"`
Description string `json:"description"`
OriginUrl string `json:"origin_url"`
Status int `json:"status"`
CreatedTime int `json:"created_time"`
UpdatedTime int `json:"updated_time"`
Content string `json:"content"`
ContentText string `json:"-"`
}
  編寫(xiě)核心代碼core.go
<p>package main
import (
"context"
"fmt"
"github.com/chromedp/cdproto/cdp"
"github.com/chromedp/chromedp"
"log"
"net"
"net/url"
"strings"
"time"
)
func CollectArticleFromWeixin(keyword *Keyword) []*Article {
timeCtx, cancel := context.WithTimeout(GetChromeCtx(false), 30*time.Second)
defer cancel()
var collectLink string
err := chromedp.Run(timeCtx,
chromedp.Navigate(fmt.Sprintf("https://weixin.sogou.com/weixi ... ot%3B, keyword.Name)),
chromedp.WaitVisible(`//ul[@class="news-list"]`),
chromedp.Location(&collectLink),
)
if err != nil {
log.Println("讀取搜狗搜索列表失敗1:", keyword.Name, err.Error())
return nil
}
log.Println("正在采集列表:", collectLink)
var aLinks []*cdp.Node
if err := chromedp.Run(timeCtx, chromedp.Nodes(`//ul[@class="news-list"]//h3//a`, &aLinks)); err != nil {
log.Println("讀取搜狗搜索列表失敗2:", keyword.Name, err.Error())
return nil
}
var articles []*Article
for i := 0; i

文章采集調用(閉包dep:來(lái)存儲依賴(lài)引用數據類(lèi)型的數據依賴(lài)收集 )

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 165 次瀏覽 ? 2022-02-14 22:02 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(閉包dep:來(lái)存儲依賴(lài)引用數據類(lèi)型的數據依賴(lài)收集
)
  上一篇我們分析了基礎數據類(lèi)型的依賴(lài)集合
  本文是關(guān)于引用數據類(lèi)型的數據依賴(lài)采集和分析,因為引用類(lèi)型數據比較復雜,必須單獨寫(xiě)
  文章很長(cháng),高能預警,做好準備,耐心等待,一定會(huì )有收獲
  不過(guò)這兩類(lèi)數據的處理有很多重復,所以我打算只寫(xiě)一些區別,否則會(huì )廢話(huà)很多。
  兩個(gè)步驟,兩者都不一樣
  1、數據初始化
  2、依賴(lài)集合
  數據初始化過(guò)程
  如果數據類(lèi)型是引用類(lèi)型,則需要對數據進(jìn)行額外處理。
  處理分為對象和數組兩種,分別討論。
  1 個(gè)對象
  1、 遍歷對象的各個(gè)屬性,也設置響應性。假設屬性都是基本類(lèi)型,處理流程和上一個(gè)一樣
  2、每個(gè)數據對象都會(huì )添加一個(gè)ob屬性
  例如,設置子數據對象
  
  在下圖中,可以看到子對象處理完后添加了一個(gè)ob屬性
  
  ob_ 屬性有什么用?
  你可以觀(guān)察到 ob 有一個(gè) dep 屬性。這個(gè) dep 是不是有點(diǎn)屬性?是的,在上一篇關(guān)于基本數據類(lèi)型的文章中提到過(guò)
  那么這個(gè)ob屬性有什么用呢?
  你可以觀(guān)察到 ob 有一個(gè) dep 屬性。這個(gè) dep 是不是有點(diǎn)屬性?是的,在上一篇關(guān)于基本數據類(lèi)型的文章中提到過(guò)
  dep 正是存儲依賴(lài)項的位置
  比如page指的是data child,watch指的是data child,那么child會(huì )將這兩個(gè)保存在dep.subs中
  dep.subs = [ 頁(yè)面-watcher,watch-watcher ]
  但是,在上一篇關(guān)于基本類(lèi)型的文章中,dep 作為閉包存在,而不是任何 [ob.dep]。
  是的,這就是引用類(lèi)型和原創(chuàng )類(lèi)型的區別
  基本數據類(lèi)型,僅使用 [closure dep] 存儲依賴(lài)關(guān)系
  引用數據類(lèi)型,使用[closure dep]和[ob.dep]存儲依賴(lài)
  什么?你說(shuō)關(guān)閉部門(mén)在哪里?嗯,在defineReactive的源碼中,大家可以看一下這個(gè)方法的源碼,下面是
  那么,為什么引用類(lèi)型需要使用 __ob__.dep 來(lái)存儲依賴(lài)呢?
  首先要明確一點(diǎn),存儲依賴(lài)就是在數據變化時(shí)通知依賴(lài),所以ob.dep也是為了變化后的通知
  閉包dep只存在于defineReactive中,不能在別處使用,所以需要另存一個(gè)以供別處使用
  它還會(huì )用在哪里?
  Vue掛載原型上的set和del方法中,源碼如下
  function set(target, key, val) {
var ob = (target).__ob__;
// 通知依賴(lài)更新
ob.dep.notify();
}
Vue.prototype.$set = set;
  function del(target, key) {
var ob = (target).__ob__;
delete target[key];
if (!ob) return
// 通知依賴(lài)更新
ob.dep.notify();
}
Vue.prototype.$delete = del;
  這兩個(gè)方法大家都應該用過(guò),為了對象的動(dòng)態(tài)增刪屬性
  但是如果直接添加屬性或者刪除屬性,Vue就無(wú)法監聽(tīng),比如下面
  child.xxxx=1
delete child.xxxx
  所以必須通過(guò)Vue封裝的set和del方法來(lái)操作
  執行完set和del后,需要通知依賴(lài)更新,但是怎么通知呢?
  此時(shí),[ob.dep] 發(fā)揮作用!正因為有依賴(lài)關(guān)系,所以在 ob.dep 中又采集了一份
  使用就是上面那句話(huà),通知更新
  ob.dep.notify();
  2、數組
  1、需要遍歷數組,可能數組是對象數組,如下
  [{name:1},{name:888}]
  遍歷的時(shí)候,如果子item是一個(gè)對象,會(huì )和上面解析對象一樣操作。
  2、保存一個(gè)ob屬性到數組
  例如,設置一個(gè) arr 數組
  
  看到arr數組增加了ob屬性
  
  其實(shí)這個(gè)ob屬性和上一段提到的對象的功能類(lèi)似,這里我們只說(shuō)ob.dep
  數組中的 Ob.dep 還存儲依賴(lài)項。它是給誰(shuí)的?
  要使用Vue封裝的數組方法,要知道如果數組的變化也被監聽(tīng)了,一定要使用Vue封裝的數組方法,否則無(wú)法實(shí)時(shí)更新
  這里是覆蓋方法之一,push,其他的是splice等,Vue官方文檔已經(jīng)說(shuō)明了。
  var original = Array.prototype.push;
Array.prototype.push = function() {
var args = [],
len = arguments.length;
// 復制 傳給 push 等方法的參數
while (len--) args[len] = arguments[len];
// 執行 原方法
var result = original.apply(this, args);
var ob = this.__ob__;
// notify change
ob.dep.notify();
return resul
}
  可見(jiàn),執行完數組方法后,還需要通知依賴(lài)更新,即通知ob.dep中采集的依賴(lài)更新
  現在,我們知道響應式數據對引用類(lèi)型做了哪些額外的處理,主要是添加一個(gè)ob屬性
  我們已經(jīng)知道ob是干什么用的了,現在看看源碼是怎么添加ob的
  // 初始化Vue組件的數據
function initData(vm) {
var data = vm.$options.data;
data = vm._data =
typeof data === &#39;function&#39; ?
data.call(vm, vm) : data || {};
....遍歷 data 數據對象的key ,重名檢測,合規檢測
observe(data, true);
}
function observe(value) {
if (Array.isArray(value) || typeof value == "object") {
ob = new Observer(value);
}
return ob
}
  function Observer(value) {
// 給對象生成依賴(lài)保存器
this.dep = new Dep();
// 給 每一個(gè)對象 添加一個(gè) __ob__ 屬性,值為 Observer 實(shí)例
value.__ob__ = this
if (Array.isArray(value)) {
// 遍歷數組,每一項都需要通過(guò) observe 處理,如果是對象就添加 __ob__
for (var i = 0, l =value.length; i < l; i++) {
observe(value[i]);
}
} else {
var keys = Object.keys(value);
// 給對象的每一個(gè)屬性設置響應式
for (var i = 0; i < keys.length; i++) {
defineReactive(value, keys[i]);
}
}
};
  源碼的處理過(guò)程和上一個(gè)類(lèi)似,但是處理引用數據類(lèi)型會(huì )多增加幾行對源碼的額外處理。
  我們之前只講過(guò)一種對象數據類(lèi)型,比如下面
  
  如果嵌套了多層對象怎么辦?例如,將如何
  
  是的,Vue 會(huì )遞歸處理。遍歷屬性,使用defineReactive處理時(shí),遞歸調用observe處理(源碼用紅色加粗標記)
  如果該值是一個(gè)對象,那么還要在該值上添加一個(gè) ob
  如果沒(méi)有,則正常下線(xiàn)并設置響應
  源代碼如下
  function defineReactive(obj, key, value) {
// dep 用于中收集所有 依賴(lài)我的 東西
var dep = new Dep();
var val = obj[key]
// 返回的 childOb 是一個(gè) Observer 實(shí)例
// 如果值是一個(gè)對象,需要遞歸遍歷對象
var childOb = observe(val);
Object.defineProperty(obj, key, {
get() {...依賴(lài)收集跟初始化無(wú)關(guān),下面會(huì )講},
set() { .... }
});
}
  繪制流程圖僅供參考
  
  哈哈哈,上面的很長(cháng),有一點(diǎn)點(diǎn),但是忍不住了。我想更詳細一點(diǎn)。好吧,還有一段,但它有點(diǎn)短。答應我,如果你仔細閱讀,請發(fā)表評論,讓我知道有人仔細閱讀過(guò)
  依賴(lài)采集過(guò)程
  采集過(guò)程重點(diǎn)是Object.defineProperty設置的get方法
  與基本類(lèi)型數據相比,引用類(lèi)型的采集方式只是多了幾行處理,區別就在于兩行代碼
  childOb.dep.depend,我將其簡(jiǎn)化為 childOb.dep.addSub(Dep.target)
  依賴(lài)數組(值)
  可以先看源碼,如下
  function defineReactive(obj, key, value) {
var dep = new Dep();
var val = obj[key]
var childOb = observe(val);
Object.defineProperty(obj, key, {
get() {
var value = val
if (Dep.target) {
// 收集依賴(lài)進(jìn) dep.subs
dep.addSub(Dep.target);
// 如果值是一個(gè)對象,Observer 實(shí)例的 dep 也收集一遍依賴(lài)
if (childOb) {
childOb.dep.addSub(Dep.target)
if (Array.isArray(value)) {
dependArray(value);
}
}
}
return value
}
});
}
  以上源碼混合了對象和數組的處理,我們分開(kāi)講
  1、對象
  在數據初始化的過(guò)程中,我們已經(jīng)知道如果值是一個(gè)對象,在ob.dep中會(huì )額外存儲一份依賴(lài)
  只有一句話(huà)
  childOb.dep.depend();
  數組有另一種處理方式,即
  dependArray(value);
  看源碼,如下
  function dependArray(value) {
for (var i = 0, l = value.length; i < l; i++) {
var e = value[i];
// 只有子項是對象的時(shí)候,收集依賴(lài)進(jìn) dep.subs
e && e.__ob__ && e.__ob__.dep.addSub(Dep.target);

// 如果子項還是 數組,那就繼續遞歸遍歷
if (Array.isArray(e)) {
dependArray(e);
}
}
}
  顯然,為了防止數組中的對象,需要保存數組的子項對象的副本。
  你一定要問(wèn),為什么子對象還要保存一個(gè)依賴(lài)?
  1、頁(yè)面依賴(lài)數組,數組的子項發(fā)生了變化。頁(yè)面是否也需要更新?但是子項的內部變化是如何通知頁(yè)面更新的呢?所以你還需要為子對象保存一個(gè)依賴(lài)項嗎?
  2、數組子項數組的變化就是對象屬性的增刪。必須使用 Vue 封裝方法 set 和 del。set和del會(huì )通知依賴(lài)更新,所以子項對象也要保存
  看栗子
  [外鏈圖片傳輸失敗(img-PuPHYChy-59)()]
  頁(yè)面模板
  
  看數組的數據,有兩個(gè)ob
  
  總結
  至此,引用類(lèi)型和基本類(lèi)型的區別就很清楚了。
  1、引用類(lèi)型會(huì )添加一個(gè)__ob__屬性,里面收錄dep,用來(lái)存放采集到的依賴(lài)
  2、對象使用ob.dep,作用于Vue的自定義方法set和del
  3、數組使用ob.dep,作用于Vue重寫(xiě)的數組方法push等。
  終于看完了,真的好長(cháng),不過(guò)我覺(jué)得值得
  
   查看全部

  文章采集調用(閉包dep:來(lái)存儲依賴(lài)引用數據類(lèi)型的數據依賴(lài)收集
)
  上一篇我們分析了基礎數據類(lèi)型的依賴(lài)集合
  本文是關(guān)于引用數據類(lèi)型的數據依賴(lài)采集和分析,因為引用類(lèi)型數據比較復雜,必須單獨寫(xiě)
  文章很長(cháng),高能預警,做好準備,耐心等待,一定會(huì )有收獲
  不過(guò)這兩類(lèi)數據的處理有很多重復,所以我打算只寫(xiě)一些區別,否則會(huì )廢話(huà)很多。
  兩個(gè)步驟,兩者都不一樣
  1、數據初始化
  2、依賴(lài)集合
  數據初始化過(guò)程
  如果數據類(lèi)型是引用類(lèi)型,則需要對數據進(jìn)行額外處理。
  處理分為對象和數組兩種,分別討論。
  1 個(gè)對象
  1、 遍歷對象的各個(gè)屬性,也設置響應性。假設屬性都是基本類(lèi)型,處理流程和上一個(gè)一樣
  2、每個(gè)數據對象都會(huì )添加一個(gè)ob屬性
  例如,設置子數據對象
  
  在下圖中,可以看到子對象處理完后添加了一個(gè)ob屬性
  
  ob_ 屬性有什么用?
  你可以觀(guān)察到 ob 有一個(gè) dep 屬性。這個(gè) dep 是不是有點(diǎn)屬性?是的,在上一篇關(guān)于基本數據類(lèi)型的文章中提到過(guò)
  那么這個(gè)ob屬性有什么用呢?
  你可以觀(guān)察到 ob 有一個(gè) dep 屬性。這個(gè) dep 是不是有點(diǎn)屬性?是的,在上一篇關(guān)于基本數據類(lèi)型的文章中提到過(guò)
  dep 正是存儲依賴(lài)項的位置
  比如page指的是data child,watch指的是data child,那么child會(huì )將這兩個(gè)保存在dep.subs中
  dep.subs = [ 頁(yè)面-watcher,watch-watcher ]
  但是,在上一篇關(guān)于基本類(lèi)型的文章中,dep 作為閉包存在,而不是任何 [ob.dep]。
  是的,這就是引用類(lèi)型和原創(chuàng )類(lèi)型的區別
  基本數據類(lèi)型,僅使用 [closure dep] 存儲依賴(lài)關(guān)系
  引用數據類(lèi)型,使用[closure dep]和[ob.dep]存儲依賴(lài)
  什么?你說(shuō)關(guān)閉部門(mén)在哪里?嗯,在defineReactive的源碼中,大家可以看一下這個(gè)方法的源碼,下面是
  那么,為什么引用類(lèi)型需要使用 __ob__.dep 來(lái)存儲依賴(lài)呢?
  首先要明確一點(diǎn),存儲依賴(lài)就是在數據變化時(shí)通知依賴(lài),所以ob.dep也是為了變化后的通知
  閉包dep只存在于defineReactive中,不能在別處使用,所以需要另存一個(gè)以供別處使用
  它還會(huì )用在哪里?
  Vue掛載原型上的set和del方法中,源碼如下
  function set(target, key, val) {
var ob = (target).__ob__;
// 通知依賴(lài)更新
ob.dep.notify();
}
Vue.prototype.$set = set;
  function del(target, key) {
var ob = (target).__ob__;
delete target[key];
if (!ob) return
// 通知依賴(lài)更新
ob.dep.notify();
}
Vue.prototype.$delete = del;
  這兩個(gè)方法大家都應該用過(guò),為了對象的動(dòng)態(tài)增刪屬性
  但是如果直接添加屬性或者刪除屬性,Vue就無(wú)法監聽(tīng),比如下面
  child.xxxx=1
delete child.xxxx
  所以必須通過(guò)Vue封裝的set和del方法來(lái)操作
  執行完set和del后,需要通知依賴(lài)更新,但是怎么通知呢?
  此時(shí),[ob.dep] 發(fā)揮作用!正因為有依賴(lài)關(guān)系,所以在 ob.dep 中又采集了一份
  使用就是上面那句話(huà),通知更新
  ob.dep.notify();
  2、數組
  1、需要遍歷數組,可能數組是對象數組,如下
  [{name:1},{name:888}]
  遍歷的時(shí)候,如果子item是一個(gè)對象,會(huì )和上面解析對象一樣操作。
  2、保存一個(gè)ob屬性到數組
  例如,設置一個(gè) arr 數組
  
  看到arr數組增加了ob屬性
  
  其實(shí)這個(gè)ob屬性和上一段提到的對象的功能類(lèi)似,這里我們只說(shuō)ob.dep
  數組中的 Ob.dep 還存儲依賴(lài)項。它是給誰(shuí)的?
  要使用Vue封裝的數組方法,要知道如果數組的變化也被監聽(tīng)了,一定要使用Vue封裝的數組方法,否則無(wú)法實(shí)時(shí)更新
  這里是覆蓋方法之一,push,其他的是splice等,Vue官方文檔已經(jīng)說(shuō)明了。
  var original = Array.prototype.push;
Array.prototype.push = function() {
var args = [],
len = arguments.length;
// 復制 傳給 push 等方法的參數
while (len--) args[len] = arguments[len];
// 執行 原方法
var result = original.apply(this, args);
var ob = this.__ob__;
// notify change
ob.dep.notify();
return resul
}
  可見(jiàn),執行完數組方法后,還需要通知依賴(lài)更新,即通知ob.dep中采集的依賴(lài)更新
  現在,我們知道響應式數據對引用類(lèi)型做了哪些額外的處理,主要是添加一個(gè)ob屬性
  我們已經(jīng)知道ob是干什么用的了,現在看看源碼是怎么添加ob的
  // 初始化Vue組件的數據
function initData(vm) {
var data = vm.$options.data;
data = vm._data =
typeof data === &#39;function&#39; ?
data.call(vm, vm) : data || {};
....遍歷 data 數據對象的key ,重名檢測,合規檢測
observe(data, true);
}
function observe(value) {
if (Array.isArray(value) || typeof value == "object") {
ob = new Observer(value);
}
return ob
}
  function Observer(value) {
// 給對象生成依賴(lài)保存器
this.dep = new Dep();
// 給 每一個(gè)對象 添加一個(gè) __ob__ 屬性,值為 Observer 實(shí)例
value.__ob__ = this
if (Array.isArray(value)) {
// 遍歷數組,每一項都需要通過(guò) observe 處理,如果是對象就添加 __ob__
for (var i = 0, l =value.length; i < l; i++) {
observe(value[i]);
}
} else {
var keys = Object.keys(value);
// 給對象的每一個(gè)屬性設置響應式
for (var i = 0; i < keys.length; i++) {
defineReactive(value, keys[i]);
}
}
};
  源碼的處理過(guò)程和上一個(gè)類(lèi)似,但是處理引用數據類(lèi)型會(huì )多增加幾行對源碼的額外處理。
  我們之前只講過(guò)一種對象數據類(lèi)型,比如下面
  
  如果嵌套了多層對象怎么辦?例如,將如何
  
  是的,Vue 會(huì )遞歸處理。遍歷屬性,使用defineReactive處理時(shí),遞歸調用observe處理(源碼用紅色加粗標記)
  如果該值是一個(gè)對象,那么還要在該值上添加一個(gè) ob
  如果沒(méi)有,則正常下線(xiàn)并設置響應
  源代碼如下
  function defineReactive(obj, key, value) {
// dep 用于中收集所有 依賴(lài)我的 東西
var dep = new Dep();
var val = obj[key]
// 返回的 childOb 是一個(gè) Observer 實(shí)例
// 如果值是一個(gè)對象,需要遞歸遍歷對象
var childOb = observe(val);
Object.defineProperty(obj, key, {
get() {...依賴(lài)收集跟初始化無(wú)關(guān),下面會(huì )講},
set() { .... }
});
}
  繪制流程圖僅供參考
  
  哈哈哈,上面的很長(cháng),有一點(diǎn)點(diǎn),但是忍不住了。我想更詳細一點(diǎn)。好吧,還有一段,但它有點(diǎn)短。答應我,如果你仔細閱讀,請發(fā)表評論,讓我知道有人仔細閱讀過(guò)
  依賴(lài)采集過(guò)程
  采集過(guò)程重點(diǎn)是Object.defineProperty設置的get方法
  與基本類(lèi)型數據相比,引用類(lèi)型的采集方式只是多了幾行處理,區別就在于兩行代碼
  childOb.dep.depend,我將其簡(jiǎn)化為 childOb.dep.addSub(Dep.target)
  依賴(lài)數組(值)
  可以先看源碼,如下
  function defineReactive(obj, key, value) {
var dep = new Dep();
var val = obj[key]
var childOb = observe(val);
Object.defineProperty(obj, key, {
get() {
var value = val
if (Dep.target) {
// 收集依賴(lài)進(jìn) dep.subs
dep.addSub(Dep.target);
// 如果值是一個(gè)對象,Observer 實(shí)例的 dep 也收集一遍依賴(lài)
if (childOb) {
childOb.dep.addSub(Dep.target)
if (Array.isArray(value)) {
dependArray(value);
}
}
}
return value
}
});
}
  以上源碼混合了對象和數組的處理,我們分開(kāi)講
  1、對象
  在數據初始化的過(guò)程中,我們已經(jīng)知道如果值是一個(gè)對象,在ob.dep中會(huì )額外存儲一份依賴(lài)
  只有一句話(huà)
  childOb.dep.depend();
  數組有另一種處理方式,即
  dependArray(value);
  看源碼,如下
  function dependArray(value) {
for (var i = 0, l = value.length; i < l; i++) {
var e = value[i];
// 只有子項是對象的時(shí)候,收集依賴(lài)進(jìn) dep.subs
e && e.__ob__ && e.__ob__.dep.addSub(Dep.target);

// 如果子項還是 數組,那就繼續遞歸遍歷
if (Array.isArray(e)) {
dependArray(e);
}
}
}
  顯然,為了防止數組中的對象,需要保存數組的子項對象的副本。
  你一定要問(wèn),為什么子對象還要保存一個(gè)依賴(lài)?
  1、頁(yè)面依賴(lài)數組,數組的子項發(fā)生了變化。頁(yè)面是否也需要更新?但是子項的內部變化是如何通知頁(yè)面更新的呢?所以你還需要為子對象保存一個(gè)依賴(lài)項嗎?
  2、數組子項數組的變化就是對象屬性的增刪。必須使用 Vue 封裝方法 set 和 del。set和del會(huì )通知依賴(lài)更新,所以子項對象也要保存
  看栗子
  [外鏈圖片傳輸失敗(img-PuPHYChy-59)()]
  頁(yè)面模板
  
  看數組的數據,有兩個(gè)ob
  
  總結
  至此,引用類(lèi)型和基本類(lèi)型的區別就很清楚了。
  1、引用類(lèi)型會(huì )添加一個(gè)__ob__屬性,里面收錄dep,用來(lái)存放采集到的依賴(lài)
  2、對象使用ob.dep,作用于Vue的自定義方法set和del
  3、數組使用ob.dep,作用于Vue重寫(xiě)的數組方法push等。
  終于看完了,真的好長(cháng),不過(guò)我覺(jué)得值得
  
  

文章采集調用(DS打數機才能自動(dòng)翻頁(yè)采集數據(圖)案例大全)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 150 次瀏覽 ? 2022-02-14 04:04 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(DS打數機才能自動(dòng)翻頁(yè)采集數據(圖)案例大全)
  一、操作步驟
  采集如果有多個(gè)頁(yè)面列表頁(yè),需要設置翻頁(yè),以便DS打印機自動(dòng)翻頁(yè)采集數據。選擇一個(gè)以翻頁(yè)為規則的示例URL,您可以使用該規則批量處理采集相似的URL(適用于一頁(yè)和多頁(yè))。以下是大眾點(diǎn)評網(wǎng)的一個(gè)例子。
  二、案例步驟
  先復制上面的例子,來(lái)到采集列出數據。本教程在上一篇文章文章中已經(jīng)提到過(guò),不再重復操作?!癎ooSeeker Copy Batch 采集 列出帶有樣本的數據”
  三、設置翻頁(yè)
  1.1、新建marker thread:選擇“Crawler Route”,點(diǎn)擊“New”,選擇“Marker Clue”,勾選“Continuous Grab”,“Target Subject Name”會(huì )自動(dòng)填寫(xiě)。這意味著(zhù)該規則被循環(huán)調用。
  
  1.2、一旦設置了標記線(xiàn)索,就做了兩個(gè)映射,第一個(gè)是映射翻頁(yè)塊的范圍,第二個(gè)是映射翻頁(yè)標記。
  第一次是選擇翻頁(yè)區的頁(yè)面節點(diǎn)進(jìn)行映射:點(diǎn)擊翻頁(yè)標志,定位到收錄它的翻頁(yè)區所在的頁(yè)面節點(diǎn)。這些翻頁(yè)按鈕的翻頁(yè)區域,然后右鍵節點(diǎn)選擇“Lead Mapping”-&gt;“Location”-&gt;“Clue*”,爬蟲(chóng)路由中的“Location Number”就會(huì )映射節點(diǎn)的編號。
  
  第二次是映射翻頁(yè)標記值所在的頁(yè)面節點(diǎn):雙擊翻頁(yè)區域節點(diǎn)逐層展開(kāi),找到翻頁(yè)標記所在的節點(diǎn),這里指的是翻頁(yè)按鈕的文本節點(diǎn)或屬性值節點(diǎn),右擊節點(diǎn)選擇“線(xiàn)索映射”-&gt;“標記映射”,爬蟲(chóng)路由中的“標記值”和“標記位置編號”會(huì )映射值和節點(diǎn)的編號。
  
  1.3、定位選項的默認項是數字id。由于不同頁(yè)碼的翻頁(yè)區的id值可能會(huì )發(fā)生變化,所以class值通常保持不變,所以最好改成preference class。
  
  四、保存規則并捕獲數據
  點(diǎn)擊保存規則,爬取數據,在DS計數器中查看翻頁(yè)是否成功。如果翻頁(yè)采集成功,會(huì )在本地DataScraperWorks文件夾中生成多個(gè)XML文件。詳見(jiàn)文章如何將采集中的xml文件轉換為Excel文件?”。 查看全部

  文章采集調用(DS打數機才能自動(dòng)翻頁(yè)采集數據(圖)案例大全)
  一、操作步驟
  采集如果有多個(gè)頁(yè)面列表頁(yè),需要設置翻頁(yè),以便DS打印機自動(dòng)翻頁(yè)采集數據。選擇一個(gè)以翻頁(yè)為規則的示例URL,您可以使用該規則批量處理采集相似的URL(適用于一頁(yè)和多頁(yè))。以下是大眾點(diǎn)評網(wǎng)的一個(gè)例子。
  二、案例步驟
  先復制上面的例子,來(lái)到采集列出數據。本教程在上一篇文章文章中已經(jīng)提到過(guò),不再重復操作?!癎ooSeeker Copy Batch 采集 列出帶有樣本的數據”
  三、設置翻頁(yè)
  1.1、新建marker thread:選擇“Crawler Route”,點(diǎn)擊“New”,選擇“Marker Clue”,勾選“Continuous Grab”,“Target Subject Name”會(huì )自動(dòng)填寫(xiě)。這意味著(zhù)該規則被循環(huán)調用。
  
  1.2、一旦設置了標記線(xiàn)索,就做了兩個(gè)映射,第一個(gè)是映射翻頁(yè)塊的范圍,第二個(gè)是映射翻頁(yè)標記。
  第一次是選擇翻頁(yè)區的頁(yè)面節點(diǎn)進(jìn)行映射:點(diǎn)擊翻頁(yè)標志,定位到收錄它的翻頁(yè)區所在的頁(yè)面節點(diǎn)。這些翻頁(yè)按鈕的翻頁(yè)區域,然后右鍵節點(diǎn)選擇“Lead Mapping”-&gt;“Location”-&gt;“Clue*”,爬蟲(chóng)路由中的“Location Number”就會(huì )映射節點(diǎn)的編號。
  
  第二次是映射翻頁(yè)標記值所在的頁(yè)面節點(diǎn):雙擊翻頁(yè)區域節點(diǎn)逐層展開(kāi),找到翻頁(yè)標記所在的節點(diǎn),這里指的是翻頁(yè)按鈕的文本節點(diǎn)或屬性值節點(diǎn),右擊節點(diǎn)選擇“線(xiàn)索映射”-&gt;“標記映射”,爬蟲(chóng)路由中的“標記值”和“標記位置編號”會(huì )映射值和節點(diǎn)的編號。
  
  1.3、定位選項的默認項是數字id。由于不同頁(yè)碼的翻頁(yè)區的id值可能會(huì )發(fā)生變化,所以class值通常保持不變,所以最好改成preference class。
  
  四、保存規則并捕獲數據
  點(diǎn)擊保存規則,爬取數據,在DS計數器中查看翻頁(yè)是否成功。如果翻頁(yè)采集成功,會(huì )在本地DataScraperWorks文件夾中生成多個(gè)XML文件。詳見(jiàn)文章如何將采集中的xml文件轉換為Excel文件?”。

文章采集調用(文章采集調用webhookspider與ss-send等接口采集,提供開(kāi)源接口)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 143 次瀏覽 ? 2022-02-12 22:02 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(文章采集調用webhookspider與ss-send等接口采集,提供開(kāi)源接口)
  文章采集調用webhookspider與ss-send等接口采集,提供開(kāi)源接口可以用在線(xiàn)-stats-api,
  第一,用golang寫(xiě)爬蟲(chóng),只要你熟悉golang一個(gè)星期學(xué)習就會(huì )了。這是我用過(guò)比較容易上手的一門(mén)語(yǔ)言,速度也快。但是,我現在是用ruby開(kāi)發(fā)爬蟲(chóng)。第二,推薦比較有名的gayhub上的一個(gè)開(kāi)源爬蟲(chóng)工具pokes,開(kāi)源,成熟。我用這個(gè)爬蟲(chóng)可以發(fā)布在快手、陌陌、探探、趣頭條等等。這個(gè)應該適合題主,如果有疑問(wèn)可以到pokesgithub頁(yè)面上留言。
  其實(shí)你就是想了解scrapy可以做到什么效果唄,請移步各種flatpages,各種scrapy示例和教程(xwliwubo/scrapy-doc:focusinlightweightscrapydocumentation),里面有很多入門(mén)介紹、數據加載和處理等等的算法、規則等等python程序員比較常用的庫,前端爬蟲(chóng)基本上也是通過(guò)python+beautifulsoup處理圖片、正則表達式等等。
  根據經(jīng)驗,大部分抓取的數據都可以用現成的庫封裝好,或者自己封裝python程序庫,最后通過(guò)工具鏈發(fā)送出去。
  可以看下我們公司出的這個(gè)爬蟲(chóng)系列教程,通俗易懂,分門(mén)別類(lèi)全面的講解了爬蟲(chóng)基礎、高效爬蟲(chóng)、scrapy快速入門(mén)及開(kāi)發(fā)等內容, 查看全部

  文章采集調用(文章采集調用webhookspider與ss-send等接口采集,提供開(kāi)源接口)
  文章采集調用webhookspider與ss-send等接口采集,提供開(kāi)源接口可以用在線(xiàn)-stats-api,
  第一,用golang寫(xiě)爬蟲(chóng),只要你熟悉golang一個(gè)星期學(xué)習就會(huì )了。這是我用過(guò)比較容易上手的一門(mén)語(yǔ)言,速度也快。但是,我現在是用ruby開(kāi)發(fā)爬蟲(chóng)。第二,推薦比較有名的gayhub上的一個(gè)開(kāi)源爬蟲(chóng)工具pokes,開(kāi)源,成熟。我用這個(gè)爬蟲(chóng)可以發(fā)布在快手、陌陌、探探、趣頭條等等。這個(gè)應該適合題主,如果有疑問(wèn)可以到pokesgithub頁(yè)面上留言。
  其實(shí)你就是想了解scrapy可以做到什么效果唄,請移步各種flatpages,各種scrapy示例和教程(xwliwubo/scrapy-doc:focusinlightweightscrapydocumentation),里面有很多入門(mén)介紹、數據加載和處理等等的算法、規則等等python程序員比較常用的庫,前端爬蟲(chóng)基本上也是通過(guò)python+beautifulsoup處理圖片、正則表達式等等。
  根據經(jīng)驗,大部分抓取的數據都可以用現成的庫封裝好,或者自己封裝python程序庫,最后通過(guò)工具鏈發(fā)送出去。
  可以看下我們公司出的這個(gè)爬蟲(chóng)系列教程,通俗易懂,分門(mén)別類(lèi)全面的講解了爬蟲(chóng)基礎、高效爬蟲(chóng)、scrapy快速入門(mén)及開(kāi)發(fā)等內容,

文章采集調用(如何直接在nodejs頁(yè)面中訪(fǎng)問(wèn)splash頁(yè)面上訪(fǎng)問(wèn)頁(yè)面)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 127 次瀏覽 ? 2022-02-11 17:06 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(如何直接在nodejs頁(yè)面中訪(fǎng)問(wèn)splash頁(yè)面上訪(fǎng)問(wèn)頁(yè)面)
  文章采集調用splash開(kāi)發(fā)通用githubpage的功能都采用wordpress編寫(xiě)。優(yōu)點(diǎn)是可擴展性強,通用性高,還可以像zendfish這種hook機制擴展各種參數及解析得到的github頁(yè)面。缺點(diǎn)是部署維護比較麻煩,且不像freelancer社區推崇的快速制作插件。對于vscode這種在線(xiàn)visualstudio可運行于瀏覽器上的編輯器支持一般,且ppt幾乎就是在nodejs上做的。
  訪(fǎng)問(wèn)官網(wǎng)可以直接在nodejs頁(yè)面中搜索splashpageforwordpress安裝擴展。下載地址,查看sfbeta版本,下載之后wordpress插件安裝好了,可以通過(guò)安裝npm包來(lái)創(chuàng )建github頁(yè)面。如何直接在nodejs頁(yè)面中訪(fǎng)問(wèn)splash頁(yè)面:wordpress-splash-page文章編輯器使用wordpress開(kāi)發(fā)的編輯器,也就是onepagebutton這種方式。
  優(yōu)點(diǎn)是可以復用原來(lái)的vue的頁(yè)面結構,同時(shí)方便維護及更換其他wordpress插件。缺點(diǎn)是nodejs支持度太差,如果你要追求巨大的流量,你就不用想其他插件的安裝和運行了。同時(shí)你要有一定的開(kāi)發(fā)語(yǔ)言和運行環(huán)境基礎。對于vscode這種在線(xiàn)visualstudio可運行于瀏覽器上的編輯器支持一般,且ppt幾乎就是在nodejs上做的。
  訪(fǎng)問(wèn)官網(wǎng)可以直接在nodejs頁(yè)面中訪(fǎng)問(wèn)splash頁(yè)面。安裝php開(kāi)發(fā)工具。沒(méi)有解決nodejs兼容性問(wèn)題。也就是數據類(lèi)型顯示的各種問(wèn)題,為了避免這個(gè)問(wèn)題,可以把php安裝類(lèi)型設置為bash及gvim等visualstudio支持的編輯器。對于vscode這種在線(xiàn)visualstudio可運行于瀏覽器上的編輯器支持一般,且ppt幾乎就是在nodejs上做的。
  訪(fǎng)問(wèn)官網(wǎng)可以直接在nodejs頁(yè)面中訪(fǎng)問(wèn)splash頁(yè)面。引入wordpress開(kāi)發(fā)的url模板文件。對于php的splash頁(yè)面而言,是用ruby\java\go或wordpress.php等路徑來(lái)定義的頁(yè)面。而對于ps/ppt等其他圖形語(yǔ)言而言,是用pathname來(lái)定義頁(yè)面,如下圖所示:1.在php/extensions/urls.php中添加相應的url資源路徑,重定向到對應頁(yè)面。
  最后在瀏覽器訪(fǎng)問(wèn)/splash/可以訪(fǎng)問(wèn)以上頁(yè)面。2.在php/extensions/urls.php中添加相應的url資源路徑,重定向到對應頁(yè)面。最后在瀏覽器訪(fǎng)問(wèn)/splash/可以訪(fǎng)問(wèn)以上頁(yè)面。3.加入瀏覽器loading緩存,如果瀏覽器都是在vscode環(huán)境下運行,那么跳轉到頁(yè)面cd,wordpress這種在線(xiàn)visualstudio可運行于瀏覽器上的編輯器就會(huì )重定向在php端。
  4.使用spacerebug插件掃描瀏覽器loading緩存記錄如果你的wordpress擁有loading緩存功能,那么可以?huà)呙铻g覽器的loading緩存記錄,這樣當訪(fǎng)問(wèn)該鏈接時(shí),前端代碼就不需要后端代碼來(lái)初始化你的請求,就可以在瀏覽器端安全地訪(fǎng)問(wèn)你要爬取的頁(yè)面。githubpie這個(gè)插件。 查看全部

  文章采集調用(如何直接在nodejs頁(yè)面中訪(fǎng)問(wèn)splash頁(yè)面上訪(fǎng)問(wèn)頁(yè)面)
  文章采集調用splash開(kāi)發(fā)通用githubpage的功能都采用wordpress編寫(xiě)。優(yōu)點(diǎn)是可擴展性強,通用性高,還可以像zendfish這種hook機制擴展各種參數及解析得到的github頁(yè)面。缺點(diǎn)是部署維護比較麻煩,且不像freelancer社區推崇的快速制作插件。對于vscode這種在線(xiàn)visualstudio可運行于瀏覽器上的編輯器支持一般,且ppt幾乎就是在nodejs上做的。
  訪(fǎng)問(wèn)官網(wǎng)可以直接在nodejs頁(yè)面中搜索splashpageforwordpress安裝擴展。下載地址,查看sfbeta版本,下載之后wordpress插件安裝好了,可以通過(guò)安裝npm包來(lái)創(chuàng )建github頁(yè)面。如何直接在nodejs頁(yè)面中訪(fǎng)問(wèn)splash頁(yè)面:wordpress-splash-page文章編輯器使用wordpress開(kāi)發(fā)的編輯器,也就是onepagebutton這種方式。
  優(yōu)點(diǎn)是可以復用原來(lái)的vue的頁(yè)面結構,同時(shí)方便維護及更換其他wordpress插件。缺點(diǎn)是nodejs支持度太差,如果你要追求巨大的流量,你就不用想其他插件的安裝和運行了。同時(shí)你要有一定的開(kāi)發(fā)語(yǔ)言和運行環(huán)境基礎。對于vscode這種在線(xiàn)visualstudio可運行于瀏覽器上的編輯器支持一般,且ppt幾乎就是在nodejs上做的。
  訪(fǎng)問(wèn)官網(wǎng)可以直接在nodejs頁(yè)面中訪(fǎng)問(wèn)splash頁(yè)面。安裝php開(kāi)發(fā)工具。沒(méi)有解決nodejs兼容性問(wèn)題。也就是數據類(lèi)型顯示的各種問(wèn)題,為了避免這個(gè)問(wèn)題,可以把php安裝類(lèi)型設置為bash及gvim等visualstudio支持的編輯器。對于vscode這種在線(xiàn)visualstudio可運行于瀏覽器上的編輯器支持一般,且ppt幾乎就是在nodejs上做的。
  訪(fǎng)問(wèn)官網(wǎng)可以直接在nodejs頁(yè)面中訪(fǎng)問(wèn)splash頁(yè)面。引入wordpress開(kāi)發(fā)的url模板文件。對于php的splash頁(yè)面而言,是用ruby\java\go或wordpress.php等路徑來(lái)定義的頁(yè)面。而對于ps/ppt等其他圖形語(yǔ)言而言,是用pathname來(lái)定義頁(yè)面,如下圖所示:1.在php/extensions/urls.php中添加相應的url資源路徑,重定向到對應頁(yè)面。
  最后在瀏覽器訪(fǎng)問(wèn)/splash/可以訪(fǎng)問(wèn)以上頁(yè)面。2.在php/extensions/urls.php中添加相應的url資源路徑,重定向到對應頁(yè)面。最后在瀏覽器訪(fǎng)問(wèn)/splash/可以訪(fǎng)問(wèn)以上頁(yè)面。3.加入瀏覽器loading緩存,如果瀏覽器都是在vscode環(huán)境下運行,那么跳轉到頁(yè)面cd,wordpress這種在線(xiàn)visualstudio可運行于瀏覽器上的編輯器就會(huì )重定向在php端。
  4.使用spacerebug插件掃描瀏覽器loading緩存記錄如果你的wordpress擁有loading緩存功能,那么可以?huà)呙铻g覽器的loading緩存記錄,這樣當訪(fǎng)問(wèn)該鏈接時(shí),前端代碼就不需要后端代碼來(lái)初始化你的請求,就可以在瀏覽器端安全地訪(fǎng)問(wèn)你要爬取的頁(yè)面。githubpie這個(gè)插件。

文章采集調用(爬蟲(chóng)應該怎么進(jìn)行測試?的測試方法應該如何進(jìn)行?)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 127 次瀏覽 ? 2022-02-10 13:18 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(爬蟲(chóng)應該怎么進(jìn)行測試?的測試方法應該如何進(jìn)行?)
  很多同學(xué)不知道應該如何測試爬蟲(chóng)。我也是剛接觸一點(diǎn)爬蟲(chóng)測試的新手。通過(guò)對爬蟲(chóng)的分析,總結了爬蟲(chóng)的測試方法。其他建議歡迎補充。
  一、測試階段
  對于data采集調用第三方平臺(比如scorpion)的流程大家可能比較熟悉。在第三方頁(yè)面授權后,第三方會(huì )幫我們完成data采集的任務(wù)。我們只需要等待結果被回調。但是如果要自己做爬蟲(chóng),又是一個(gè)什么樣的過(guò)程呢?
  其實(shí)爬蟲(chóng)和其他業(yè)務(wù)一樣,也是有流程的。一般是先觸發(fā)創(chuàng )建任務(wù),爬蟲(chóng)模塊對數據采集進(jìn)行處理,采集完成后,對數據進(jìn)行解析和存儲。對于授權爬蟲(chóng)來(lái)說(shuō),有SDK頁(yè)面的也可以直接通過(guò)頁(yè)面進(jìn)行請求,其他的只能通過(guò)請求接口實(shí)現。還有一種爬蟲(chóng),在后臺配置好任務(wù)后,會(huì )定期去網(wǎng)站爬取數據,更新數據庫。當然還有很多其他的交互邏輯,每一步都需要分析評估。
  因此,我們可以從創(chuàng )建任務(wù)的界面入手,連接整個(gè)流程,在界面的響應中加入簡(jiǎn)單的驗證。比如創(chuàng )建任務(wù)后有任務(wù)編號,通過(guò)查詢(xún)接口可以得到任務(wù)的結果數據。然后檢查數據是否存儲,存儲是否準確,是否會(huì )出現亂碼等。從界面入手的好處是我們可以自動(dòng)化檢查爬蟲(chóng)任務(wù),檢查數據是否可以創(chuàng )建,是否爬蟲(chóng)能否正常爬取,爬取結果是否入庫。解析的邏輯和存儲的準確性需要注意。爬蟲(chóng)結果數據的存儲與數據分析和應用有關(guān)。對于數據分析,如果源數據有誤,那么無(wú)論分析結果如何,都是沒(méi)有意義的。.
  
  總結
  1.接口測試,調用數據接口采集,測試爬蟲(chóng)進(jìn)程;接口基礎測試和弱網(wǎng)、接口安全、接口性能等。
  2.可以通過(guò)接口或者SDK測試場(chǎng)景,包括爬取成功的場(chǎng)景和失敗的場(chǎng)景,比如無(wú)數據和無(wú)效數據。
  3.完成采集后的分析和存儲測試,數據分析和存儲邏輯檢查。
  4.異常測試,主要針對系統間交互的處理邏輯,如失敗重試機制、服務(wù)間容錯機制等。
  5.爬蟲(chóng)質(zhì)量和效率,主要從整體設計和代碼實(shí)現來(lái)分析爬蟲(chóng)的處理方式是否高可用。
  二、在線(xiàn)階段
  一旦爬蟲(chóng)上線(xiàn)供其他業(yè)務(wù)方使用,就需要保證可用性和可靠性。對于爬蟲(chóng)來(lái)說(shuō),在線(xiàn)監控非常重要!不僅要保證提供的爬蟲(chóng)能夠正常運行,還要保證出現異常時(shí),能夠在最短的時(shí)間內解決。因此,監測應從以下三個(gè)方面入手:
  1.在線(xiàn)運行接口腳本監控提供的接口可以正常使用,而不是等業(yè)務(wù)方調整好基礎接口,再反饋修復,成本比較大。主動(dòng)調整界面,判斷程序是否正常。您只能驗證該接口是否可以運行。如果條件允許,在線(xiàn)運行真實(shí)數據并驗證結果。
  2.監控線(xiàn)上發(fā)生的異常情況,如創(chuàng )建任務(wù)失敗、登錄失敗、數據采集失敗、數據解析失敗、回調失敗、數據存儲失敗等。發(fā)展應盡快查明原因,盡快找到解決。
  3.監控目標網(wǎng)站的狀態(tài),可以通過(guò)web自動(dòng)監控目標網(wǎng)站是否可用,是否發(fā)生變化等。
  對于爬蟲(chóng)來(lái)說(shuō),穩定性很重要,但是很多不可控的因素會(huì )導致爬蟲(chóng)的成功率下降。通過(guò)采取良好的監控和預防措施,我們可以將事故發(fā)生時(shí)的風(fēng)險降到最低。 查看全部

  文章采集調用(爬蟲(chóng)應該怎么進(jìn)行測試?的測試方法應該如何進(jìn)行?)
  很多同學(xué)不知道應該如何測試爬蟲(chóng)。我也是剛接觸一點(diǎn)爬蟲(chóng)測試的新手。通過(guò)對爬蟲(chóng)的分析,總結了爬蟲(chóng)的測試方法。其他建議歡迎補充。
  一、測試階段
  對于data采集調用第三方平臺(比如scorpion)的流程大家可能比較熟悉。在第三方頁(yè)面授權后,第三方會(huì )幫我們完成data采集的任務(wù)。我們只需要等待結果被回調。但是如果要自己做爬蟲(chóng),又是一個(gè)什么樣的過(guò)程呢?
  其實(shí)爬蟲(chóng)和其他業(yè)務(wù)一樣,也是有流程的。一般是先觸發(fā)創(chuàng )建任務(wù),爬蟲(chóng)模塊對數據采集進(jìn)行處理,采集完成后,對數據進(jìn)行解析和存儲。對于授權爬蟲(chóng)來(lái)說(shuō),有SDK頁(yè)面的也可以直接通過(guò)頁(yè)面進(jìn)行請求,其他的只能通過(guò)請求接口實(shí)現。還有一種爬蟲(chóng),在后臺配置好任務(wù)后,會(huì )定期去網(wǎng)站爬取數據,更新數據庫。當然還有很多其他的交互邏輯,每一步都需要分析評估。
  因此,我們可以從創(chuàng )建任務(wù)的界面入手,連接整個(gè)流程,在界面的響應中加入簡(jiǎn)單的驗證。比如創(chuàng )建任務(wù)后有任務(wù)編號,通過(guò)查詢(xún)接口可以得到任務(wù)的結果數據。然后檢查數據是否存儲,存儲是否準確,是否會(huì )出現亂碼等。從界面入手的好處是我們可以自動(dòng)化檢查爬蟲(chóng)任務(wù),檢查數據是否可以創(chuàng )建,是否爬蟲(chóng)能否正常爬取,爬取結果是否入庫。解析的邏輯和存儲的準確性需要注意。爬蟲(chóng)結果數據的存儲與數據分析和應用有關(guān)。對于數據分析,如果源數據有誤,那么無(wú)論分析結果如何,都是沒(méi)有意義的。.
  
  總結
  1.接口測試,調用數據接口采集,測試爬蟲(chóng)進(jìn)程;接口基礎測試和弱網(wǎng)、接口安全、接口性能等。
  2.可以通過(guò)接口或者SDK測試場(chǎng)景,包括爬取成功的場(chǎng)景和失敗的場(chǎng)景,比如無(wú)數據和無(wú)效數據。
  3.完成采集后的分析和存儲測試,數據分析和存儲邏輯檢查。
  4.異常測試,主要針對系統間交互的處理邏輯,如失敗重試機制、服務(wù)間容錯機制等。
  5.爬蟲(chóng)質(zhì)量和效率,主要從整體設計和代碼實(shí)現來(lái)分析爬蟲(chóng)的處理方式是否高可用。
  二、在線(xiàn)階段
  一旦爬蟲(chóng)上線(xiàn)供其他業(yè)務(wù)方使用,就需要保證可用性和可靠性。對于爬蟲(chóng)來(lái)說(shuō),在線(xiàn)監控非常重要!不僅要保證提供的爬蟲(chóng)能夠正常運行,還要保證出現異常時(shí),能夠在最短的時(shí)間內解決。因此,監測應從以下三個(gè)方面入手:
  1.在線(xiàn)運行接口腳本監控提供的接口可以正常使用,而不是等業(yè)務(wù)方調整好基礎接口,再反饋修復,成本比較大。主動(dòng)調整界面,判斷程序是否正常。您只能驗證該接口是否可以運行。如果條件允許,在線(xiàn)運行真實(shí)數據并驗證結果。
  2.監控線(xiàn)上發(fā)生的異常情況,如創(chuàng )建任務(wù)失敗、登錄失敗、數據采集失敗、數據解析失敗、回調失敗、數據存儲失敗等。發(fā)展應盡快查明原因,盡快找到解決。
  3.監控目標網(wǎng)站的狀態(tài),可以通過(guò)web自動(dòng)監控目標網(wǎng)站是否可用,是否發(fā)生變化等。
  對于爬蟲(chóng)來(lái)說(shuō),穩定性很重要,但是很多不可控的因素會(huì )導致爬蟲(chóng)的成功率下降。通過(guò)采取良好的監控和預防措施,我們可以將事故發(fā)生時(shí)的風(fēng)險降到最低。

文章采集調用(文章采集調用的高級設置-extensions-advanced-script查看userprofile以及timeline的計數)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 146 次瀏覽 ? 2022-02-10 05:05 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(文章采集調用的高級設置-extensions-advanced-script查看userprofile以及timeline的計數)
  文章采集調用的kpi_based_login接口(感謝@rhomy的指正),請在chrome的設置-高級設置-extensions-advanced-script查看userprofile以及timeline下面的計數。ps:建議讀者先看看官方文檔:-based-login安裝indexjs依賴(lài):這是個(gè)很大的坑,我建議直接在文章里面做腳本,webpack-plugin-script-advanced-script-start:先編譯vue-markouth.css,發(fā)布到indexjs項目:編譯的流程如下圖所示:編譯indexjs的源代碼:設置extensions的advancedscript:找到輸出中的userprofiles,點(diǎn)擊進(jìn)入login列表:點(diǎn)擊view,瀏覽器會(huì )顯示賬號的狀態(tài)(安全、非安全)以及一個(gè)cookie,用戶(hù)通過(guò)cookie的唯一標識:用戶(hù)輸入賬號密碼,只要輸入一次,賬號密碼可以推送到服務(wù)器,這樣就可以實(shí)現你需要的效果了。
  @吳澤龍回答里已經(jīng)給出了,我也補充一下他的誤區吧1.hookextensions只是為原來(lái)的需要抽樣的腳本提供了多一次構造時(shí)間戳的方法,應該是為了模擬類(lèi)似cookie/httpsocket這樣的事件。2.github的timeline瀏覽時(shí)點(diǎn)擊時(shí)間是按照kpi-id-login獲取的。一次構造一個(gè)時(shí)間戳,并且每個(gè)時(shí)間戳不重復3.時(shí)間戳的形式不知道是什么形式。
  你描述里面顯示的列表時(shí)間是datetime_index.html,kpi的時(shí)間戳是通過(guò)useragent獲取的時(shí)間戳,也是按照kpi-id-login獲取的。 查看全部

  文章采集調用(文章采集調用的高級設置-extensions-advanced-script查看userprofile以及timeline的計數)
  文章采集調用的kpi_based_login接口(感謝@rhomy的指正),請在chrome的設置-高級設置-extensions-advanced-script查看userprofile以及timeline下面的計數。ps:建議讀者先看看官方文檔:-based-login安裝indexjs依賴(lài):這是個(gè)很大的坑,我建議直接在文章里面做腳本,webpack-plugin-script-advanced-script-start:先編譯vue-markouth.css,發(fā)布到indexjs項目:編譯的流程如下圖所示:編譯indexjs的源代碼:設置extensions的advancedscript:找到輸出中的userprofiles,點(diǎn)擊進(jìn)入login列表:點(diǎn)擊view,瀏覽器會(huì )顯示賬號的狀態(tài)(安全、非安全)以及一個(gè)cookie,用戶(hù)通過(guò)cookie的唯一標識:用戶(hù)輸入賬號密碼,只要輸入一次,賬號密碼可以推送到服務(wù)器,這樣就可以實(shí)現你需要的效果了。
  @吳澤龍回答里已經(jīng)給出了,我也補充一下他的誤區吧1.hookextensions只是為原來(lái)的需要抽樣的腳本提供了多一次構造時(shí)間戳的方法,應該是為了模擬類(lèi)似cookie/httpsocket這樣的事件。2.github的timeline瀏覽時(shí)點(diǎn)擊時(shí)間是按照kpi-id-login獲取的。一次構造一個(gè)時(shí)間戳,并且每個(gè)時(shí)間戳不重復3.時(shí)間戳的形式不知道是什么形式。
  你描述里面顯示的列表時(shí)間是datetime_index.html,kpi的時(shí)間戳是通過(guò)useragent獲取的時(shí)間戳,也是按照kpi-id-login獲取的。

文章采集調用(無(wú)界數據來(lái)源于正則表達式Filter幫您解決數據的問(wèn)題!)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 210 次瀏覽 ? 2022-02-07 06:19 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(無(wú)界數據來(lái)源于正則表達式Filter幫您解決數據的問(wèn)題!)
  介紹
  
  AnyMetrics - 面向開(kāi)發(fā)人員的、聲明性的 Metrics 采集 和監控系統,可以對結構化和非結構化、有界和無(wú)界數據執行 采集,通過(guò)提取、過(guò)濾、邏輯運算等,將結果存儲起來(lái)在流行的監控系統或存儲引擎(如Prometheus、ES)中構建完整的監控系統,用grafana完成數據可視化
  數據采集、提取、過(guò)濾、存儲等都是由配置驅動(dòng),無(wú)需額外開(kāi)發(fā)。對應AnyMetrics,分別配置數據源、采集規則、采集器?;谶@些配置,AnyMetrics 將使用 pipeline 的方式自動(dòng)完成從 data采集 到數據存儲的所有工作
  對于有界數據的任務(wù),AnyMetrics 將以固定頻率從數據源中提取數據。AnyMetrics 具有內置的 MySQL 數據源。對于具有無(wú)限數據的任務(wù),AnyMetrics 會(huì )在一個(gè)時(shí)間窗口內從數據源中拉取數據。批量拉取數據,AnyMetrics 內置 Kafka 類(lèi)型無(wú)界數據源
  AnyMetrics的數據源可以是任何系統,例如可以將HTTP請求結果作為數據源,也可以將ES檢索結果作為數據源
  將非結構化數據轉換為結構化數據的目的,可以通過(guò)對數據源的原創(chuàng )數據進(jìn)行提取和過(guò)濾來(lái)實(shí)現。AnyMetrics 中有兩個(gè)內置的采集規則(Filter),正則表達式和 Spring EL 表達式。完成數據的提取和過(guò)濾,使用Spring EL表達式對原創(chuàng )數據和正則表達式提取后的數據完成邏輯運算。過(guò)濾器可單獨使用或組合使用。FilterChain的方式是順序執行的
  數據提取和過(guò)濾后,下一步就是將數據以指定的方式存儲在目標系統中。Prometheus 采集器內置于 AnyMetrics 中。通過(guò)定義 Metrics,可以將數據推送到 Prometheus 的 PushGateway。
  AnyMetrics 的采集器可以將數據推送到任何系統,例如 MySQL、ES 甚至是 WebHook
  無(wú)論是采集規則配置還是采集器配置,都可以通過(guò)可變配置來(lái)完成動(dòng)態(tài)配置的替換。變量數據來(lái)自正則表達式Filter,通過(guò)定義如(.*)可以得到一個(gè)名為$1的變量,有Spring EL的地方可以使用#$1來(lái)使用變量,其他地方可以使用$1使用變量,以滿(mǎn)足從數據提取到數據的重組或者操作操作,什么配置可以支持變量或者Spring EL表達式 根據采集規則和采集器的具體實(shí)現,Spring內置的表達式配置AnyMetrics 的 EL 過(guò)濾器和 Prometheus 采集器中的值配置支持 Spring EL 表達式和變量(#$1),
  AnyMetrics采用插件化設計方式,無(wú)論是數據源、采集規則還是采集器都可以擴展。甚至 AnyMetrics 中的內置插件也是以點(diǎn)對點(diǎn)的方式實(shí)現的。加載和使用什么插件完全由聲明決定。配置
  建筑學(xué)
  
  技術(shù)棧
  SpringBoot + Nacos + Vue + ElementUI
  安裝
  啟動(dòng)前需要安裝的依賴(lài)
  安裝 nacos(必填)
  安裝普羅米修斯(可選)
  安裝推送網(wǎng)關(guān)(可選)
  啟動(dòng)
  啟動(dòng) AnyMeitris
  1 mvn clean package
2 cd boot/target
3 java -Dnacos.address=nacos.ip:8848 -Dnacos.config.dataId=AnyMetricsConfig -Dnacos.config.group=config.app.AnyMetrics -Dauto=true -jar AnyMetrics-boot.jar
  啟動(dòng)參數說(shuō)明
  通過(guò) nacos.address 參數指定nacos地址
通過(guò) nacos.config.dataId 參數指定配置在nacos的dataId,默認值為 AnyMetricsConfig
通過(guò) nacos.config.group 參數指定配置在nacos的group,默認值為 DEFAULT
通過(guò) auto 參數控制任務(wù)是否自啟動(dòng),默認值為 false
  啟動(dòng)后訪(fǎng)問(wèn):8080/index.html
  如何配置
  1、選擇任務(wù)類(lèi)型
  
  2.1、有界數據
  
  選擇調度間隔,以秒為單位
  2.2、選擇數據源
  
  選擇數據源為mysql(目前只支持mysql),并完善相關(guān)配置
  3.1、無(wú)限數據
  
  輸入時(shí)間窗口,單位:秒
  3.2、選擇數據源
  
  選擇kafka作為數據源(目前只支持kafka),并完善相關(guān)配置
  4、采集規則
  
  過(guò)濾器支持兩種類(lèi)型,regular 和 el。在正則中使用括號來(lái)提取所需的變量。多個(gè)變量以 $1、$2 ... $N 的形式命名。在el中,可以使用_#$1 _變量來(lái)執行操作
  5、采集器
  
  選擇prometheus(目前只支持prometheus)并完善metrics相關(guān)配置信息,type支持gauge、counter、histogram類(lèi)型,labels支持$1變量,value支持Spring EL表達式變量操作
  運行任務(wù)
  1、開(kāi)始任務(wù)
  
  點(diǎn)擊開(kāi)始按鈕開(kāi)始任務(wù)
  2、查看運行日志
  
  點(diǎn)擊日志選項卡,查詢(xún)任務(wù)運行日志
  3、iframe
  
  點(diǎn)擊iframe Tab,將外部系統嵌入到任務(wù)中,比如將grafana的dashboard鏈接嵌入到系統中進(jìn)行展示
  4、停止任務(wù)
  
  單擊停止按鈕以停止任務(wù)
  例子
  示例一:APM 監控 - 采集 所有執行時(shí)間超過(guò) 3 秒的慢速鏈接并配置警報策略
  1、設置kafka為數據源
  從 kafka 讀取跟蹤日志
  {
"groupId":"anymetrics_apm_slow_trace",
"kafkaAddress":"192.168.0.1:9092",
"topic":"p_bigtracer_metric_log",
"type":"kafka"
}
  2、設置采集規則
  通話(huà)記錄是結構化數據,例如:
  1617953102329,operation-admin-web,10.8.60.41,RESOURCE_MYSQL_LOG,com.yxy.operation.dao.IHotBroadcastEpisodesDao.getNeedOnlineList,1,1,0,0,1
  因此,第一步是使用正則規則對數據進(jìn)行提取和過(guò)濾,對應的正則規則為:
  (.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?)
  提取的數據為:
  {
"$4":"RESOURCE_MYSQL_LOG",
"$5":"com.yxy.operation.dao.IHotBroadcastEpisodesDao.getNeedOnlineList",
"$6":"1",
"$7":"1",
"$10":"1",
"$8":"0",
"$9":"0",
"$1":"1617953102329",
"$2":"operation-admin-web",
"$3":"10.8.60.41"
}
  我們有 10 個(gè)變量,從 1 美元到 10 美元。由于我們監控的是超過(guò)3秒的慢速鏈接,我們只需要采集RT超過(guò)3秒的日志數據,所以我們需要定義一個(gè)邏輯運算表達式Filter,對應的EL表達式公式為:
  (new java.lang.Double(#$10) / #$6) > 3000
  其中#$10是鏈接的總響應時(shí)間,#$6是接口的總調用次數,先通過(guò)#$10/#$6運算得到平均RT,再通過(guò)(#$10/#$過(guò)濾掉3 6) &gt; 3000 幾秒內的慢速鏈接數據
  根據以上兩條采集規則,完整配置為:
  {
"timeWindow": 40,
"kind": "stream",
"filters": [
{
"expression": "(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\n",
"type": "regular"
},
{
"expression": "(new java.lang.Double(#$10) / #$6) > 3000",
"type": "el"
}
]
}
  3、設置采集器
  將數據采集到普羅米修斯
  {
"pushGateway": "192.168.0.1:9091",
"metrics": [
{
"help": "anymetrics_apm_slow_trace",
"labelNames": [
"application",
"type",
"endpoint"
],
"name": "anymetrics_apm_slow_trace",
"type": "gauge",
"value": "new java.lang.Double(#$10) / #$6",
"labels": [
"$2",
"$4",
"$5"
]
}
],
"type": "prometheus",
"job": "anymetrics_apm_slow_trace"
}
  promethus的metrics需要定義,名字是anymetrics_apm_slow_trace,類(lèi)型是gauge,lableNames使用application,type,endpoint,對應變量$2、$4、$5,因為響應時(shí)間采集RT,所以值為#$10 / #$6
  其中#$10是鏈接的總響應時(shí)間,#$6是接口的總調用次數,通過(guò)#$10/#$6的運算得到平均RT
  4、配置警報和可視化
  4.1 可視化
  打開(kāi)Grafana,創(chuàng )建一個(gè)Panel,選擇數據源為promethus,圖標類(lèi)型為Graph,在Metrics中輸入PromQL語(yǔ)法anymetrics_apm_slow_trace{}
  
  關(guān)于 PromQL 可以參考
  4.2 配置 Grafana 警報
  在面板中選擇警報選項卡以定義警報規則,例如:
  
  每 1m 評估 1m
  條件
  NoData 和錯誤處理
  通知
  一個(gè)比較完整的APM監控組合如下:
  通過(guò)調用鏈log采集不同維度的metrics,完成對鏈路RT、項目錯誤數、項目平均RT、鏈路RT分布等的多維度監控。
  
  示例2:可視化注冊用戶(hù)總數
  1、設置mysql為數據源
  根據sql查詢(xún)總用戶(hù)數
  {
"password": "root",
"jdbcurl": "jdbc:mysql://192.168.0.1:3306/user",
"type": "mysql",
"sql": "select count(1) from user",
"username": "root"
}
  2、設置采集規則
  根據sql查詢(xún)的結果,提取count(1),用正則表達式采集規則:
  {
"kind": "schedule",
"interval": 5,
"filters": [
{
"expression": "\\{\\\"count\\(1\\)\\\":(.*)\\}",
"type": "regular"
}
]
}
  3、設置采集器
  將數據采集到普羅米修斯
  {
"pushGateway": "192.168.0.1:9091",
"metrics": [
{
"help": "anymetrics_member_count",
"name": "anymetrics_member_count",
"type": "gauge",
"value": "#$1"
}
],
"type": "prometheus",
"job": "anymetrics_member_count"
}
  promethus的metrics需要定義,名字是anymetrics_member_count,類(lèi)型是gauge,因為只需要采集用戶(hù)總數,所以不需要定義labels和labelNames,值為#$1
  4、配置可視化
  打開(kāi)Grafana,創(chuàng )建一個(gè)Panel,選擇數據源為promethus,圖標類(lèi)型為Graph,在Metrics中輸入PromQL語(yǔ)法anymetrics_member_count{}
  
  示例 3:Nginx 日志監控
  Nginx請求延遲監控,Nginx狀態(tài)碼監控
  1、設置kafka為數據源
  使用 nginx access_log 日志
  {
"groupId":"anymetrics_nginx",
"kafkaAddress":"192.168.0.1:9092",
"topic":"nginx_access_log",
"type":"kafka"
}
  2、設置采集規則
  假設nginx的log_format配置如下:
  log_format main &#39;"$http_x_forwarded_for" $remote_addr - $remote_user [$time_local] $http_host "$request" &#39; &#39;$status $body_bytes_sent "$http_referer" &#39; &#39;"$http_user_agent" $upstream_addr $request_method $upstream_status $upstream_response_time&#39;;
  因此,在第一步中,使用正則Filter對數據進(jìn)行提取和過(guò)濾,對應的正則為:
  (.*?)\\s+(.*?)\\s+-(.*?)\\s+\\[(.*?)\\]\\s+(.*?)\\s+\\\"(.*?)\\s+(.*?)\\s+(.*?)\\s+\\\"?(\\d+)\\s+(\\d+)\\s\\\"(.*?)\\\"\\s+\\\"(.*?)\\\"\\s+(.*?)\\s+(.*?)\\s+(\\d+)\\s+(.*)",
  提取的數據為:
  $1:"-"
$2:192.168.198.17
$3: -
$4:13/Apr/2021:10:48:14 +0800
$5:dev.api.com
$6:POST
$7:/yxy-api-gateway/api/json/yuandouActivity/access
$8:HTTP/1.1"
$9:200
$10:87
$11:http://192.168.0.1:8100/yxy-ed ... 3D123
$12:Mozilla/5.0 (iPhone; CPU iPhone OS 13_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko)Mobile/15E148 MicroMessenger/7.0.11(0x17000b21)NetType/WIFI Language/zh_CN
$13:10.8.43.18:8080
$14:POST
$15:200
$16:0.005
  一共得到了16個(gè)變量,通過(guò)對比log_format就可以知道每個(gè)變量的含義
  完整的采集規則配置為:
  {
"timeWindow": 30,
"kind": "stream",
"filters": [
{
"expression": "(.*?)\\s+(.*?)\\s+-(.*?)\\s+\\[(.*?)\\]\\s+(.*?)\\s+\\\"(.*?)\\s+(.*?)\\s+(.*?)\\s+\\\"?(\\d+)\\s+(\\d+)\\s\\\"(.*?)\\\"\\s+\\\"(.*?)\\\"\\s+(.*?)\\s+(.*?)\\s+(\\d+)\\s+(.*)",
"type": "regular"
}
]
}
  3、設置采集器
  采集每個(gè)請求的響應時(shí)間和請求的狀態(tài)碼,并將數據存儲在promethus中
  {
"pushGateway": "192.168.0.1:9091",
"metrics": [
{
"help": "nginx_log_host_status",
"labelNames": [
"host",
"status"
],
"name": "nginx_log_host_status",
"type": "gauge",
"value": "1",
"labels": [
"$5",
"$9"
]
},
{
"help": "nginx_log_req_rt (seconds)",
"labelNames": [
"host",
"endpoint"
],
"name": "nginx_log_req_rt",
"type": "gauge",
"value": "new java.lang.Double(#$16)",
"labels": [
"$5",
"$7"
]
}
],
"type": "prometheus",
"job": "anymetrics_nginx_log"
}
  4、配置可視化
  Nginx狀態(tài)碼監控
  打開(kāi)Grafana,創(chuàng )建一個(gè)Panel,選擇數據源為promethus,圖標類(lèi)型為Graph,在Metrics中輸入PromQL語(yǔ)法nginx_log_host_status{}
  
  Nginx 請求延遲監控
  打開(kāi)Grafana,創(chuàng )建一個(gè)Panel,選擇數據源為promethus,圖標類(lèi)型為Graph,在Metrics中輸入PromQL語(yǔ)法nginx_log_req_rt{}
  
  問(wèn)答
  如何采集 APM 日志?
  如果系統中有調用鏈跟蹤系統,可以使用調用鏈日志,或者通過(guò)定義攔截器來(lái)記錄目標方法。定義好日志格式后,可以直接逐行打印,也可以在內存中聚合后以固定頻率打印,日志一般收錄RT延遲、錯誤/成功次數、端點(diǎn)、應用等關(guān)鍵數據。
  日志是如何采集到kafka的?
  可以使用filebeat采集nginx的access_log和tomcat的應用日志到kafka
  目前支持哪些數據源?
  有界數據目前支持mysql、http;無(wú)界數據目前支持kafka
  目前支持哪些采集器?
  目前只支持prometheus,使用pushgateway推送數據到prometheus
  如果我已經(jīng)使用了 Skywalking 和 Zipkin 等呼叫鏈跟蹤系統,是否需要使用 AnyMetrics?
  兩者之間沒(méi)有沖突。調用鏈跟蹤系統采集鏈路的調用關(guān)系和APM指標數據。AnyMetrics不僅可以將結構化調用鏈跟蹤系統的指標日志作為數據源來(lái)監控系統,還可以將結構化日志作為數據源來(lái)監控系統運行,比如監控一些Exception事件,還可以可視化或監控數據庫表數據。同時(shí),AnyMetrics 支持跨平臺系統,任何系統生成的日志都可以作為數據源。監控系統運行
  最后附上github項目地址: 查看全部

  文章采集調用(無(wú)界數據來(lái)源于正則表達式Filter幫您解決數據的問(wèn)題!)
  介紹
  
  AnyMetrics - 面向開(kāi)發(fā)人員的、聲明性的 Metrics 采集 和監控系統,可以對結構化和非結構化、有界和無(wú)界數據執行 采集,通過(guò)提取、過(guò)濾、邏輯運算等,將結果存儲起來(lái)在流行的監控系統或存儲引擎(如Prometheus、ES)中構建完整的監控系統,用grafana完成數據可視化
  數據采集、提取、過(guò)濾、存儲等都是由配置驅動(dòng),無(wú)需額外開(kāi)發(fā)。對應AnyMetrics,分別配置數據源、采集規則、采集器?;谶@些配置,AnyMetrics 將使用 pipeline 的方式自動(dòng)完成從 data采集 到數據存儲的所有工作
  對于有界數據的任務(wù),AnyMetrics 將以固定頻率從數據源中提取數據。AnyMetrics 具有內置的 MySQL 數據源。對于具有無(wú)限數據的任務(wù),AnyMetrics 會(huì )在一個(gè)時(shí)間窗口內從數據源中拉取數據。批量拉取數據,AnyMetrics 內置 Kafka 類(lèi)型無(wú)界數據源
  AnyMetrics的數據源可以是任何系統,例如可以將HTTP請求結果作為數據源,也可以將ES檢索結果作為數據源
  將非結構化數據轉換為結構化數據的目的,可以通過(guò)對數據源的原創(chuàng )數據進(jìn)行提取和過(guò)濾來(lái)實(shí)現。AnyMetrics 中有兩個(gè)內置的采集規則(Filter),正則表達式和 Spring EL 表達式。完成數據的提取和過(guò)濾,使用Spring EL表達式對原創(chuàng )數據和正則表達式提取后的數據完成邏輯運算。過(guò)濾器可單獨使用或組合使用。FilterChain的方式是順序執行的
  數據提取和過(guò)濾后,下一步就是將數據以指定的方式存儲在目標系統中。Prometheus 采集器內置于 AnyMetrics 中。通過(guò)定義 Metrics,可以將數據推送到 Prometheus 的 PushGateway。
  AnyMetrics 的采集器可以將數據推送到任何系統,例如 MySQL、ES 甚至是 WebHook
  無(wú)論是采集規則配置還是采集器配置,都可以通過(guò)可變配置來(lái)完成動(dòng)態(tài)配置的替換。變量數據來(lái)自正則表達式Filter,通過(guò)定義如(.*)可以得到一個(gè)名為$1的變量,有Spring EL的地方可以使用#$1來(lái)使用變量,其他地方可以使用$1使用變量,以滿(mǎn)足從數據提取到數據的重組或者操作操作,什么配置可以支持變量或者Spring EL表達式 根據采集規則和采集器的具體實(shí)現,Spring內置的表達式配置AnyMetrics 的 EL 過(guò)濾器和 Prometheus 采集器中的值配置支持 Spring EL 表達式和變量(#$1),
  AnyMetrics采用插件化設計方式,無(wú)論是數據源、采集規則還是采集器都可以擴展。甚至 AnyMetrics 中的內置插件也是以點(diǎn)對點(diǎn)的方式實(shí)現的。加載和使用什么插件完全由聲明決定。配置
  建筑學(xué)
  
  技術(shù)棧
  SpringBoot + Nacos + Vue + ElementUI
  安裝
  啟動(dòng)前需要安裝的依賴(lài)
  安裝 nacos(必填)
  安裝普羅米修斯(可選)
  安裝推送網(wǎng)關(guān)(可選)
  啟動(dòng)
  啟動(dòng) AnyMeitris
  1 mvn clean package
2 cd boot/target
3 java -Dnacos.address=nacos.ip:8848 -Dnacos.config.dataId=AnyMetricsConfig -Dnacos.config.group=config.app.AnyMetrics -Dauto=true -jar AnyMetrics-boot.jar
  啟動(dòng)參數說(shuō)明
  通過(guò) nacos.address 參數指定nacos地址
通過(guò) nacos.config.dataId 參數指定配置在nacos的dataId,默認值為 AnyMetricsConfig
通過(guò) nacos.config.group 參數指定配置在nacos的group,默認值為 DEFAULT
通過(guò) auto 參數控制任務(wù)是否自啟動(dòng),默認值為 false
  啟動(dòng)后訪(fǎng)問(wèn):8080/index.html
  如何配置
  1、選擇任務(wù)類(lèi)型
  
  2.1、有界數據
  
  選擇調度間隔,以秒為單位
  2.2、選擇數據源
  
  選擇數據源為mysql(目前只支持mysql),并完善相關(guān)配置
  3.1、無(wú)限數據
  
  輸入時(shí)間窗口,單位:秒
  3.2、選擇數據源
  
  選擇kafka作為數據源(目前只支持kafka),并完善相關(guān)配置
  4、采集規則
  
  過(guò)濾器支持兩種類(lèi)型,regular 和 el。在正則中使用括號來(lái)提取所需的變量。多個(gè)變量以 $1、$2 ... $N 的形式命名。在el中,可以使用_#$1 _變量來(lái)執行操作
  5、采集器
  
  選擇prometheus(目前只支持prometheus)并完善metrics相關(guān)配置信息,type支持gauge、counter、histogram類(lèi)型,labels支持$1變量,value支持Spring EL表達式變量操作
  運行任務(wù)
  1、開(kāi)始任務(wù)
  
  點(diǎn)擊開(kāi)始按鈕開(kāi)始任務(wù)
  2、查看運行日志
  
  點(diǎn)擊日志選項卡,查詢(xún)任務(wù)運行日志
  3、iframe
  
  點(diǎn)擊iframe Tab,將外部系統嵌入到任務(wù)中,比如將grafana的dashboard鏈接嵌入到系統中進(jìn)行展示
  4、停止任務(wù)
  
  單擊停止按鈕以停止任務(wù)
  例子
  示例一:APM 監控 - 采集 所有執行時(shí)間超過(guò) 3 秒的慢速鏈接并配置警報策略
  1、設置kafka為數據源
  從 kafka 讀取跟蹤日志
  {
"groupId":"anymetrics_apm_slow_trace",
"kafkaAddress":"192.168.0.1:9092",
"topic":"p_bigtracer_metric_log",
"type":"kafka"
}
  2、設置采集規則
  通話(huà)記錄是結構化數據,例如:
  1617953102329,operation-admin-web,10.8.60.41,RESOURCE_MYSQL_LOG,com.yxy.operation.dao.IHotBroadcastEpisodesDao.getNeedOnlineList,1,1,0,0,1
  因此,第一步是使用正則規則對數據進(jìn)行提取和過(guò)濾,對應的正則規則為:
  (.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?)
  提取的數據為:
  {
"$4":"RESOURCE_MYSQL_LOG",
"$5":"com.yxy.operation.dao.IHotBroadcastEpisodesDao.getNeedOnlineList",
"$6":"1",
"$7":"1",
"$10":"1",
"$8":"0",
"$9":"0",
"$1":"1617953102329",
"$2":"operation-admin-web",
"$3":"10.8.60.41"
}
  我們有 10 個(gè)變量,從 1 美元到 10 美元。由于我們監控的是超過(guò)3秒的慢速鏈接,我們只需要采集RT超過(guò)3秒的日志數據,所以我們需要定義一個(gè)邏輯運算表達式Filter,對應的EL表達式公式為:
  (new java.lang.Double(#$10) / #$6) > 3000
  其中#$10是鏈接的總響應時(shí)間,#$6是接口的總調用次數,先通過(guò)#$10/#$6運算得到平均RT,再通過(guò)(#$10/#$過(guò)濾掉3 6) &gt; 3000 幾秒內的慢速鏈接數據
  根據以上兩條采集規則,完整配置為:
  {
"timeWindow": 40,
"kind": "stream",
"filters": [
{
"expression": "(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\n",
"type": "regular"
},
{
"expression": "(new java.lang.Double(#$10) / #$6) > 3000",
"type": "el"
}
]
}
  3、設置采集器
  將數據采集到普羅米修斯
  {
"pushGateway": "192.168.0.1:9091",
"metrics": [
{
"help": "anymetrics_apm_slow_trace",
"labelNames": [
"application",
"type",
"endpoint"
],
"name": "anymetrics_apm_slow_trace",
"type": "gauge",
"value": "new java.lang.Double(#$10) / #$6",
"labels": [
"$2",
"$4",
"$5"
]
}
],
"type": "prometheus",
"job": "anymetrics_apm_slow_trace"
}
  promethus的metrics需要定義,名字是anymetrics_apm_slow_trace,類(lèi)型是gauge,lableNames使用application,type,endpoint,對應變量$2、$4、$5,因為響應時(shí)間采集RT,所以值為#$10 / #$6
  其中#$10是鏈接的總響應時(shí)間,#$6是接口的總調用次數,通過(guò)#$10/#$6的運算得到平均RT
  4、配置警報和可視化
  4.1 可視化
  打開(kāi)Grafana,創(chuàng )建一個(gè)Panel,選擇數據源為promethus,圖標類(lèi)型為Graph,在Metrics中輸入PromQL語(yǔ)法anymetrics_apm_slow_trace{}
  
  關(guān)于 PromQL 可以參考
  4.2 配置 Grafana 警報
  在面板中選擇警報選項卡以定義警報規則,例如:
  
  每 1m 評估 1m
  條件
  NoData 和錯誤處理
  通知
  一個(gè)比較完整的APM監控組合如下:
  通過(guò)調用鏈log采集不同維度的metrics,完成對鏈路RT、項目錯誤數、項目平均RT、鏈路RT分布等的多維度監控。
  
  示例2:可視化注冊用戶(hù)總數
  1、設置mysql為數據源
  根據sql查詢(xún)總用戶(hù)數
  {
"password": "root",
"jdbcurl": "jdbc:mysql://192.168.0.1:3306/user",
"type": "mysql",
"sql": "select count(1) from user",
"username": "root"
}
  2、設置采集規則
  根據sql查詢(xún)的結果,提取count(1),用正則表達式采集規則:
  {
"kind": "schedule",
"interval": 5,
"filters": [
{
"expression": "\\{\\\"count\\(1\\)\\\":(.*)\\}",
"type": "regular"
}
]
}
  3、設置采集器
  將數據采集到普羅米修斯
  {
"pushGateway": "192.168.0.1:9091",
"metrics": [
{
"help": "anymetrics_member_count",
"name": "anymetrics_member_count",
"type": "gauge",
"value": "#$1"
}
],
"type": "prometheus",
"job": "anymetrics_member_count"
}
  promethus的metrics需要定義,名字是anymetrics_member_count,類(lèi)型是gauge,因為只需要采集用戶(hù)總數,所以不需要定義labels和labelNames,值為#$1
  4、配置可視化
  打開(kāi)Grafana,創(chuàng )建一個(gè)Panel,選擇數據源為promethus,圖標類(lèi)型為Graph,在Metrics中輸入PromQL語(yǔ)法anymetrics_member_count{}
  
  示例 3:Nginx 日志監控
  Nginx請求延遲監控,Nginx狀態(tài)碼監控
  1、設置kafka為數據源
  使用 nginx access_log 日志
  {
"groupId":"anymetrics_nginx",
"kafkaAddress":"192.168.0.1:9092",
"topic":"nginx_access_log",
"type":"kafka"
}
  2、設置采集規則
  假設nginx的log_format配置如下:
  log_format main &#39;"$http_x_forwarded_for" $remote_addr - $remote_user [$time_local] $http_host "$request" &#39; &#39;$status $body_bytes_sent "$http_referer" &#39; &#39;"$http_user_agent" $upstream_addr $request_method $upstream_status $upstream_response_time&#39;;
  因此,在第一步中,使用正則Filter對數據進(jìn)行提取和過(guò)濾,對應的正則為:
  (.*?)\\s+(.*?)\\s+-(.*?)\\s+\\[(.*?)\\]\\s+(.*?)\\s+\\\"(.*?)\\s+(.*?)\\s+(.*?)\\s+\\\"?(\\d+)\\s+(\\d+)\\s\\\"(.*?)\\\"\\s+\\\"(.*?)\\\"\\s+(.*?)\\s+(.*?)\\s+(\\d+)\\s+(.*)",
  提取的數據為:
  $1:"-"
$2:192.168.198.17
$3: -
$4:13/Apr/2021:10:48:14 +0800
$5:dev.api.com
$6:POST
$7:/yxy-api-gateway/api/json/yuandouActivity/access
$8:HTTP/1.1"
$9:200
$10:87
$11:http://192.168.0.1:8100/yxy-ed ... 3D123
$12:Mozilla/5.0 (iPhone; CPU iPhone OS 13_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko)Mobile/15E148 MicroMessenger/7.0.11(0x17000b21)NetType/WIFI Language/zh_CN
$13:10.8.43.18:8080
$14:POST
$15:200
$16:0.005
  一共得到了16個(gè)變量,通過(guò)對比log_format就可以知道每個(gè)變量的含義
  完整的采集規則配置為:
  {
"timeWindow": 30,
"kind": "stream",
"filters": [
{
"expression": "(.*?)\\s+(.*?)\\s+-(.*?)\\s+\\[(.*?)\\]\\s+(.*?)\\s+\\\"(.*?)\\s+(.*?)\\s+(.*?)\\s+\\\"?(\\d+)\\s+(\\d+)\\s\\\"(.*?)\\\"\\s+\\\"(.*?)\\\"\\s+(.*?)\\s+(.*?)\\s+(\\d+)\\s+(.*)",
"type": "regular"
}
]
}
  3、設置采集器
  采集每個(gè)請求的響應時(shí)間和請求的狀態(tài)碼,并將數據存儲在promethus中
  {
"pushGateway": "192.168.0.1:9091",
"metrics": [
{
"help": "nginx_log_host_status",
"labelNames": [
"host",
"status"
],
"name": "nginx_log_host_status",
"type": "gauge",
"value": "1",
"labels": [
"$5",
"$9"
]
},
{
"help": "nginx_log_req_rt (seconds)",
"labelNames": [
"host",
"endpoint"
],
"name": "nginx_log_req_rt",
"type": "gauge",
"value": "new java.lang.Double(#$16)",
"labels": [
"$5",
"$7"
]
}
],
"type": "prometheus",
"job": "anymetrics_nginx_log"
}
  4、配置可視化
  Nginx狀態(tài)碼監控
  打開(kāi)Grafana,創(chuàng )建一個(gè)Panel,選擇數據源為promethus,圖標類(lèi)型為Graph,在Metrics中輸入PromQL語(yǔ)法nginx_log_host_status{}
  
  Nginx 請求延遲監控
  打開(kāi)Grafana,創(chuàng )建一個(gè)Panel,選擇數據源為promethus,圖標類(lèi)型為Graph,在Metrics中輸入PromQL語(yǔ)法nginx_log_req_rt{}
  
  問(wèn)答
  如何采集 APM 日志?
  如果系統中有調用鏈跟蹤系統,可以使用調用鏈日志,或者通過(guò)定義攔截器來(lái)記錄目標方法。定義好日志格式后,可以直接逐行打印,也可以在內存中聚合后以固定頻率打印,日志一般收錄RT延遲、錯誤/成功次數、端點(diǎn)、應用等關(guān)鍵數據。
  日志是如何采集到kafka的?
  可以使用filebeat采集nginx的access_log和tomcat的應用日志到kafka
  目前支持哪些數據源?
  有界數據目前支持mysql、http;無(wú)界數據目前支持kafka
  目前支持哪些采集器?
  目前只支持prometheus,使用pushgateway推送數據到prometheus
  如果我已經(jīng)使用了 Skywalking 和 Zipkin 等呼叫鏈跟蹤系統,是否需要使用 AnyMetrics?
  兩者之間沒(méi)有沖突。調用鏈跟蹤系統采集鏈路的調用關(guān)系和APM指標數據。AnyMetrics不僅可以將結構化調用鏈跟蹤系統的指標日志作為數據源來(lái)監控系統,還可以將結構化日志作為數據源來(lái)監控系統運行,比如監控一些Exception事件,還可以可視化或監控數據庫表數據。同時(shí),AnyMetrics 支持跨平臺系統,任何系統生成的日志都可以作為數據源。監控系統運行
  最后附上github項目地址:

文章采集調用(講講如何在首頁(yè)和列表頁(yè)實(shí)時(shí)動(dòng)態(tài)調用文章點(diǎn)擊次數)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 133 次瀏覽 ? 2022-02-07 04:23 ? 來(lái)自相關(guān)話(huà)題

  文章采集調用(講講如何在首頁(yè)和列表頁(yè)實(shí)時(shí)動(dòng)態(tài)調用文章點(diǎn)擊次數)
  我們都知道,Dedecms中的首頁(yè)和列表頁(yè)的文章點(diǎn)擊默認不是動(dòng)態(tài)調用的,而是通過(guò)一個(gè)標簽來(lái)調用的,只有首頁(yè)之后才會(huì )更新點(diǎn)擊并生成列表頁(yè)面。頻率。但是有時(shí)候我們的網(wǎng)站更新不是那么頻繁,所以我們需要使用點(diǎn)擊的動(dòng)態(tài)調用。接下來(lái),織夢(mèng)技術(shù)研究中心將告訴你如何在首頁(yè)和列表頁(yè)面實(shí)時(shí)動(dòng)態(tài)調用文章@。&gt;點(diǎn)擊次數,具體方法如下:
  首先找到plus/count.php文件,復制并命名為viewclick.php,然后打開(kāi)文件,在里面找到如下代碼:
  
<a herf="http://www.genban.org" title="織夢(mèng)源碼">
if(!empty($maintable))
{
$dsql->ExecuteNoneQuery(" UPDATE `{$maintable}` SET click=click+1 WHERE {$idtype}=&#39;$aid&#39; ");
}
if(!empty($mid))
{
$dsql->ExecuteNoneQuery(" UPDATE `dede_member_tj` SET pagecount=pagecount+1 WHERE mid=&#39;$mid&#39; ");
}</a>
  刪除上面的代碼,然后在需要動(dòng)態(tài)調用點(diǎn)擊次數的首頁(yè)和列表頁(yè)面模板中添加如下代碼:
  
<a herf="http://www.genban.org" title="織夢(mèng)源碼">
</a>
  然后重新生成首頁(yè)和列表頁(yè),然后就可以實(shí)時(shí)動(dòng)態(tài)調用文章的點(diǎn)擊次數而不生成。 查看全部

  文章采集調用(講講如何在首頁(yè)和列表頁(yè)實(shí)時(shí)動(dòng)態(tài)調用文章點(diǎn)擊次數)
  我們都知道,Dedecms中的首頁(yè)和列表頁(yè)的文章點(diǎn)擊默認不是動(dòng)態(tài)調用的,而是通過(guò)一個(gè)標簽來(lái)調用的,只有首頁(yè)之后才會(huì )更新點(diǎn)擊并生成列表頁(yè)面。頻率。但是有時(shí)候我們的網(wǎng)站更新不是那么頻繁,所以我們需要使用點(diǎn)擊的動(dòng)態(tài)調用。接下來(lái),織夢(mèng)技術(shù)研究中心將告訴你如何在首頁(yè)和列表頁(yè)面實(shí)時(shí)動(dòng)態(tài)調用文章@。&gt;點(diǎn)擊次數,具體方法如下:
  首先找到plus/count.php文件,復制并命名為viewclick.php,然后打開(kāi)文件,在里面找到如下代碼:
  
<a herf="http://www.genban.org" title="織夢(mèng)源碼">
if(!empty($maintable))
{
$dsql->ExecuteNoneQuery(" UPDATE `{$maintable}` SET click=click+1 WHERE {$idtype}=&#39;$aid&#39; ");
}
if(!empty($mid))
{
$dsql->ExecuteNoneQuery(" UPDATE `dede_member_tj` SET pagecount=pagecount+1 WHERE mid=&#39;$mid&#39; ");
}</a>
  刪除上面的代碼,然后在需要動(dòng)態(tài)調用點(diǎn)擊次數的首頁(yè)和列表頁(yè)面模板中添加如下代碼:
  
<a herf="http://www.genban.org" title="織夢(mèng)源碼">
</a>
  然后重新生成首頁(yè)和列表頁(yè),然后就可以實(shí)時(shí)動(dòng)態(tài)調用文章的點(diǎn)擊次數而不生成。

官方客服QQ群

微信人工客服

QQ人工客服


線(xiàn)

亚洲国产精品无码久久大片,亚洲AV无码乱码麻豆精品国产,亚洲品质自拍网站,少妇伦子伦精品无码STYLES,国产精久久久久久久