Python魔法學院:PySpider篇——網絡世界的探險與征服

Hi,我是阿佑,迎來到Python魔法學院,今天阿佑要帶大家學習的是PySpider篇——一門讓你在網絡世界中探險與征服的魔法課程。從環境搭建到高級功能應用,再到性能優化,每一個章節都是成為數據大師的必經之路!

文章目錄

    • 1. 引言
      • 1.1 網絡爬蟲的重要性
      • 1.2 PySpider爬蟲框架簡介
      • 1.3 故事的開端
    • 2. 背景介紹
      • 2.1 網絡爬蟲基礎
        • 網絡爬蟲定義與分類
        • 常見爬蟲框架對比
      • 2.2 PySpider 環境搭建
        • Python環境配置
        • PySpider安裝與啟動
    • 4. PySpider 高級功能應用
      • 4.1 動態頁面處理
        • JavaScript渲染頁面的抓取
        • PhantomJS集成與使用
      • 4.2 并發控制與異常處理
        • 并發策略與設置
        • 異常監控與重試機制
      • 4.3 任務依賴與分布式部署
        • 任務之間的依賴管理
        • 分布式爬蟲的配置與運行
    • 5. PySpider 實戰案例
      • 5.1 爬取靜態網頁案例
        • 目標網站分析
        • 抓取邏輯設計與實現
      • 5.2 處理登錄認證與翻頁爬蟲
        • 登錄狀態保持
        • 分頁數據抓取策略
      • 5.3 動態加載數據采集
        • Selenium與PySpider結合實戰
    • 6. 性能優化與注意事項
      • 6.1 提升爬蟲效率
        • 代碼優化技巧
        • 網絡延遲與資源利用
      • 6.2 遵守Robots協議與反爬策略
        • 爬蟲倫理與法律法規
        • 反爬蟲技術應對
    • 7. 結論
      • 7.1 總結PySpider框架的優勢與適用場景
        • PySpider的優勢
        • 適用場景
      • 7.2 對未來網絡爬蟲發展的展望
        • 技術革新
        • 新挑戰
        • 結語
      • 參考文獻

1. 引言

在這個信息爆炸的大數據時代,網絡爬蟲就像是我們探索未知世界的探險家,它們穿梭在互聯網的海洋里,搜集著各種寶貴的數據。而PySpider,這個由Python語言構建的爬蟲框架,就像是一位裝備齊全的探險家,擁有強大的能力去發現和收集那些隱藏在網絡深處的寶藏。

1.1 網絡爬蟲的重要性

想象一下,你站在一片廣袤的森林前,想要了解這片森林的奧秘,但你不可能親自去探索每一個角落。這時候,網絡爬蟲就像你派出的一群小精靈,它們可以幫你收集森林里的各種信息,從樹木的種類到動物的分布,甚至是天氣的變化。網絡爬蟲在大數據時代的重要性不言而喻,它們幫助我們從海量的數據中提取有價值的信息,為我們的決策提供支持。

1.2 PySpider爬蟲框架簡介

現在,讓我們來認識一下這位探險家——PySpider。PySpider是一個用Python編寫的分布式爬蟲框架,它以其簡潔、靈活和強大的功能而廣受好評。就像一位經驗豐富的探險家,PySpider能夠輕松應對各種復雜的網絡環境,無論是靜態網頁還是動態加載的內容,它都能夠游刃有余。

PySpider的特點可以用幾個關鍵詞來概括:分布式高效率易擴展。分布式意味著它可以同時在多個節點上運行,提高數據收集的速度;高效率則體現在它對網絡請求和數據處理的優化上;易擴展則是指它可以根據需求添加各種功能,就像給探險家配備不同的工具。

1.3 故事的開端

讓我們的故事從一個名叫小明的程序員開始。小明是一位對數據充滿熱情的年輕人,他夢想著能夠通過數據來改變世界。一天,他在網上發現了PySpider這個框架,就像是發現了一張藏寶圖,他知道這將是他探索數據世界的起點。

小明開始了他的探險之旅,他首先需要了解網絡爬蟲的基礎知識,然后搭建起自己的PySpider環境。隨著對PySpider的深入了解,他開始構建自己的項目,定義任務,學習如何調度任務,處理請求和響應,以及如何存儲和導出數據。

隨著故事的推進,小明將會遇到各種挑戰,比如動態頁面的處理、并發控制、異常處理等。但他也將會學到如何應對這些挑戰,如何優化自己的爬蟲,以及如何在遵守法律法規的前提下,高效地收集數據。

在這個故事中,我們將跟隨小明一起成長,一起探索PySpider的奧秘,一起見證他如何從一個對數據充滿好奇的程序員,成長為一個能夠利用數據改變世界的數據英雄。

在這里插入圖片描述

2. 背景介紹

2.1 網絡爬蟲基礎

在這個數字化的世界中,網絡爬蟲就像是我們的數字助手,它們幫助我們從互聯網的海洋中篩選、收集和整理信息。網絡爬蟲可以被比作是一群勤勞的小蜜蜂,它們在花叢中穿梭,采集著最甜美的花蜜。而我們的網絡爬蟲,它們在網頁間跳躍,搜集著最有價值的數據。

網絡爬蟲定義與分類

網絡爬蟲,也就是我們常說的“爬蟲”或“spider”,是一種自動瀏覽網頁的程序。它們可以被分為幾種類型,比如:

  • 通用爬蟲:它們像探險家一樣,探索互聯網的每一個角落,搜集廣泛的信息。
  • 聚焦爬蟲:它們更像是專業探險隊,專注于特定的領域或主題,搜集特定類型的數據。
  • 增量式爬蟲:它們定期訪問已爬取的網站,更新信息,就像定期檢查花園的園丁。
常見爬蟲框架對比

在網絡爬蟲的世界里,有許多不同的框架和工具,它們各有千秋:

  • Scrapy:這是一個非常流行的Python爬蟲框架,以其強大的功能和社區支持而聞名。
  • BeautifulSoup:雖然它本身不是一個爬蟲框架,但它是一個強大的HTML和XML解析庫,常與requests庫結合使用。
  • Selenium:主要用于自動化測試,但也可以用來爬取那些需要用戶交互的動態網頁。

而我們的PySpider,就像是一位全能的探險家,它結合了多種工具的優點,提供了一個簡單、靈活且功能強大的爬蟲解決方案。

2.2 PySpider 環境搭建

Python環境配置

在開始我們的探險之旅之前,我們需要準備一些基本的工具和裝備。對于PySpider來說,首先需要安裝Python環境。Python是一種簡單易學且功能強大的編程語言,它是我們探險旅程的基石。

  • 安裝Python:首先,你需要從Python官網下載并安裝Python。記得勾選“Add Python to PATH”選項,這樣你就可以在命令行中直接運行Python了。
  • 選擇版本:Python 3.x是推薦的選擇,因為它提供了更多的特性和改進。
PySpider安裝與啟動

一旦我們的Python環境搭建好,接下來就是安裝PySpider了。這個過程就像是給探險家準備他的裝備:

  • 安裝PySpider:打開你的命令行工具,輸入pip install pyspider,然后按回車,PySpider就會自動安裝到你的系統中。
  • 啟動PySpider:安裝完成后,你可以通過命令行輸入pyspider來啟動PySpider。這將打開一個網頁界面,你可以在這里管理你的爬蟲項目。

隨著我們的環境搭建完成,小明已經準備好開始他的數據探險之旅了。他將在這個環境中創建自己的項目,定義任務,并開始學習如何使用PySpider來搜集他需要的數據。

4. PySpider 高級功能應用

4.1 動態頁面處理

想象一下,你來到了一個神秘的島嶼,島上的寶藏被隱藏在不斷變化的迷霧之中。要找到寶藏,你需要一種特殊的技能——那就是處理動態頁面的能力。在網絡世界中,有些網頁就像是這些迷霧中的寶藏,它們的內容不是靜態的,而是通過JavaScript動態生成的。

JavaScript渲染頁面的抓取

在PySpider中,處理這種動態頁面就像是使用魔法棒驅散迷霧。PySpider提供了一種強大的工具——PhantomJS,它可以幫助我們渲染JavaScript,讓動態生成的內容現出原形。

from pyspider.libs.phantomjs import PhantomSchedulerscheduler = PhantomScheduler()

通過這段簡單的代碼,我們就可以讓PySpider像使用魔法一樣,揭開動態頁面的神秘面紗。

PhantomJS集成與使用

PhantomJS是一個無頭瀏覽器,它可以幫助我們模擬真實的瀏覽器環境。在PySpider中集成PhantomJS,就像是給我們的探險家配備了一副夜視鏡,即使在黑暗中也能看清一切。

from pyspider.scheduler.phantomjs import PhantomSchedulerscheduler = PhantomScheduler({'phantomjs_path': 'path/to/phantomjs',  # 指定PhantomJS的路徑'phantomjs_args': ['--load-images=no']  # 可以添加一些啟動參數,比如不加載圖片
})

這樣,我們就可以在PySpider中使用PhantomJS了,無論是登錄認證還是動態加載的數據采集,都不再是難題。

4.2 并發控制與異常處理

在探險的過程中,我們可能會遇到各種意外和障礙。在網絡爬蟲的世界里,這些意外可能是網絡延遲、服務器拒絕連接或者數據格式錯誤等。這時候,我們需要并發控制和異常處理來保證我們的探險之旅能夠順利進行。

并發策略與設置

并發控制就像是我們探險隊的速度調節器,它可以幫助我們控制探險的速度,避免因為過快而導致的意外。

在PySpider中,我們可以通過設置并發數量來控制爬蟲的速度:

from pyspider.scheduler import Schedulerscheduler = Scheduler(concurrent_count=10)  # 設置并發數量為10

這樣,我們的爬蟲就會同時運行10個任務,既保證了效率,又避免了過載。

異常監控與重試機制

異常處理就像是我們的安全網,當探險家遇到危險時,它可以保護他們不受傷害。

在PySpider中,我們可以設置異常監控和重試機制:

from pyspider.libs.exception import RetryExceptiontry:# 執行爬蟲任務
except RetryException:# 重試邏輯print("遇到問題,準備重試...")

這樣,即使在遇到問題時,我們的爬蟲也能夠自動重試,繼續我們的探險之旅。

4.3 任務依賴與分布式部署

在探險的過程中,有時候我們需要按照特定的順序完成任務,或者需要多支隊伍同時出發,這就需要任務依賴管理和分布式部署。

任務之間的依賴管理

任務依賴就像是我們的探險地圖,它告訴我們先去哪里,再去哪里。

在PySpider中,我們可以通過設置任務之間的依賴關系來管理任務的執行順序:

from pyspider.task import Tasktask = Task(project, priority=100, on_start=task1, on_success=task2)

這樣,我們就可以根據任務的依賴關系來安排任務的執行順序。

分布式爬蟲的配置與運行

分布式部署就像是我們派出多支隊伍同時探險,每支隊伍都有自己的任務和目標。

在PySpider中,我們可以通過配置多個爬蟲節點來實現分布式爬蟲:

from pyspider.application import appapp.config['MASTER'] = 'http://master-node-url'  # 設置主節點的URL
app.config['WORKERS'] = ['http://worker-node-url1', 'http://worker-node-url2']  # 設置工作節點的URL

這樣,我們就可以實現多節點同時運行爬蟲,大大提高了數據收集的效率。

在這里插入圖片描述

5. PySpider 實戰案例

5.1 爬取靜態網頁案例

目標網站分析

小明的探險之旅已經準備就緒,他的第一個任務是爬取一個靜態網頁。這個網頁就像是一個藏寶圖,上面布滿了各種信息,小明需要從中找到他需要的寶藏。

抓取邏輯設計與實現

小明打開PySpider的控制臺,開始設計他的抓取邏輯。他首先定義了一個任務,就像是一位探險家在地圖上標記出寶藏的位置。

from pyspider.libs.template import Templateclass TaskExample(BaseHandler):@every(minutes=24 * 60)def on_start(self):self.crawl('http://example.com', callback=self.index_page)def index_page(self, response):# 提取網頁中的寶藏信息treasures = response.doc('a[href^="/treasure/"]').extract()for treasure in treasures:self.crawl(treasure['href'], callback=self.detail_page)def detail_page(self, response):# 記錄詳細的寶藏信息treasure_info = {'name': response.doc('h1').text(),'location': response.doc('p.location').text(),'value': response.doc('p.value').text(),}self.save(treasure_info)

這段代碼就像是小明的探險手冊,指引他一步步找到寶藏并記錄下來。

5.2 處理登錄認證與翻頁爬蟲

登錄狀態保持

在探險的過程中,小明遇到了一個需要登錄才能進入的神秘洞穴。為了能夠順利進入,他需要保持登錄狀態。

from pyspider.libs.cookie import Cookieclass LoginHandler(BaseHandler):def on_start(self):self.crawl('http://example.com/login', form={'username': 'xiaoming','password': 'password123',}, callback=self.after_login)def after_login(self, response):# 登錄成功后,記錄cookieself.cookie = response.cookieself.crawl('http://example.com/secret', cookie=self.cookie, callback=self.secret_page)def secret_page(self, response):# 訪問需要登錄的頁面pass

這段代碼幫助小明保持登錄狀態,讓他能夠順利進入洞穴探索。

分頁數據抓取策略

洞穴中的寶藏不止一件,它們被分散在不同的石室中,小明需要設計一種策略來翻頁抓取所有的寶藏。

class PaginationHandler(BaseHandler):def on_start(self):self.crawl('http://example.com/treasures?page=1', callback=self.treasure_list)def treasure_list(self, response):treasures = response.doc('a.treasure').extract()for treasure in treasures:self.crawl(treasure['href'], callback=self.treasure_detail)# 檢查是否有下一頁next_page = response.doc('a.next').attr.hrefif next_page:self.crawl(next_page, callback=self.treasure_list)

這段代碼就像是小明的翻頁器,幫助他一頁頁地翻看石室中的寶藏。

5.3 動態加載數據采集

Selenium與PySpider結合實戰

在探險的最后階段,小明遇到了一個難題:一個寶藏被隱藏在一個需要用戶交互的動態網頁中。為了解決這個問題,他決定使用Selenium和PySpider的結合。

from pyspider.libs.six.moves import queue
from pyspider.libs.six.moves.queue import QueueEmpty
from pyspider.libs.selenium import SeleniumMixinclass DynamicTreasureHandler(SeleniumMixin, BaseHandler):def on_start(self):self.crawl('http://example.com/dynamic', callback=self.load_dynamic_page)def load_dynamic_page(self, response):# 使用Selenium加載動態頁面self.browser.get(response.url)# 等待頁面加載完成self.browser.implicitly_wait(10)# 提取寶藏信息treasures = self.browser.find_elements_by_css_selector('.treasure')for treasure in treasures:self.crawl(treasure.get_attribute('href'), callback=self.treasure_detail)

這段代碼是小明的秘密武器,它結合了Selenium的強大功能和PySpider的靈活性,幫助他成功采集到了動態加載的數據。


通過這些實戰案例,我們不僅展示了PySpider在實際應用中的強大能力,還通過小明的探險故事,讓讀者在輕松愉快的氛圍中學習到了如何爬取靜態網頁、處理登錄認證、翻頁抓取以及結合Selenium處理動態加載的數據。這些生動有趣的例子和實用的代碼,讓讀者能夠更好地理解和掌握PySpider的實際應用。

6. 性能優化與注意事項

6.1 提升爬蟲效率

在我們的故事中,小明已經成功地收集了許多寶藏,但他知道,作為一個高效的探險家,他需要不斷提升自己的速度和效率。

代碼優化技巧

小明首先對自己的代碼進行了優化。他發現,就像在探險中減少不必要的裝備一樣,精簡代碼可以大大提高爬蟲的效率。

# 避免重復的網絡請求
@config(age=10 * 24 * 60 * 60)
def on_start(self):self.crawl('http://example.com', callback=self.index_page)def index_page(self, response):# 使用CSS選擇器快速定位元素links = response.doc('a[href^="http://example.com/"]').extract()for link in links:self.crawl(link['href'], callback=self.detail_page)

通過使用@config裝飾器來緩存結果,小明減少了對同一網站的重復請求,就像在探險中重復走過同一條路線一樣,既浪費時間又浪費體力。

網絡延遲與資源利用

小明還意識到,網絡延遲和資源的合理利用對于提升效率至關重要。他開始使用異步處理和并發請求來減少等待時間。

from pyspider.helper.curl import Curl# 使用異步請求
curl = Curl().set_url('http://example.com').set_timeout(10)
response = yield curl.start()# 并發請求
from pyspider.libs.concurrent.future import Future, FutureGroupfuture_group = FutureGroup()
for url in urls:future = Future(self.crawl, url, callback=self.handle_page)future_group.add(future)
yield future_group.wait()

通過這種方式,小明的爬蟲就像是擁有了分身術,可以同時處理多個任務,大大提高了效率。

6.2 遵守Robots協議與反爬策略

作為一個有道德的探險家,小明知道在探險中要尊重當地的規則和習俗。同樣,在網絡世界中,遵守Robots協議和反爬策略是非常重要的。

爬蟲倫理與法律法規

小明在開始他的探險之前,總是先閱讀目標網站的Robots協議,確保他的爬蟲行為不會違反網站的規則。

from pyspider.libs.robotrule import RobotRulerobot_rules = RobotRule('http://example.com/robots.txt')
if robot_rules.allowed('http://example.com/some-page'):self.crawl('http://example.com/some-page', callback=self.handle_page)

通過這種方式,小明確保了他的行為是合法和道德的。

反爬蟲技術應對

然而,小明也遇到了一些挑戰,一些網站采取了反爬蟲技術來保護自己的數據。小明知道,他需要采取一些策略來應對這些挑戰。

# 使用代理
from pyspider.libs.proxy import Proxyproxy = Proxy('http://proxy-server:port')
self.crawl('http://example.com', proxy=proxy, callback=self.handle_page)# 使用User-Agent輪換
from pyspider.libs.useragent import UserAgentuser_agents = UserAgent().get_list()
self.crawl('http://example.com', user_agent=user_agents[i], callback=self.handle_page)

通過使用代理和輪換User-Agent,小明成功地繞過了一些簡單的反爬蟲措施。

在這里插入圖片描述

7. 結論

7.1 總結PySpider框架的優勢與適用場景

隨著小明的探險之旅接近尾聲,他站在山頂上,回望著一路上的挑戰和收獲。PySpider這個強大的框架,就像他手中的魔法棒,幫助他完成了一次又一次的探險任務。

PySpider的優勢
  1. 靈活性:PySpider就像一把多功能瑞士軍刀,可以根據不同的任務需求,快速調整和定制。
  2. 易用性:小明通過簡單的幾行代碼就能啟動一個爬蟲任務,就像打開手電筒一樣簡單。
  3. 擴展性:無論是集成PhantomJS處理JavaScript,還是使用Selenium處理復雜的用戶交互,PySpider都能夠輕松應對。
  4. 社區支持:PySpider背后有一個活躍的社區,小明在遇到難題時,總能找到解決方案或者靈感。
適用場景
  1. 大規模數據采集:當小明需要從多個網站收集大量數據時,PySpider的分布式架構能夠提供強大的支持。
  2. 動態內容抓取:面對那些需要JavaScript渲染的動態網頁,PySpider配合PhantomJS或Selenium能夠輕松抓取。
  3. 定制化需求:無論是登錄認證、Ajax請求還是特定格式的數據導出,PySpider都能夠根據需求進行定制。

7.2 對未來網絡爬蟲發展的展望

站在山頂上,小明不僅回顧了自己的旅程,也開始思考未來的探險。網絡爬蟲的世界正在不斷變化,技術的革新和新挑戰的出現,讓小明對未來充滿了期待。

技術革新
  1. 人工智能:小明預見到,未來的爬蟲將更加智能,能夠自動學習和適應網頁的變化。
  2. 大數據集成:隨著大數據技術的發展,爬蟲將更好地與數據分析和機器學習集成,提供更深入的洞察。
新挑戰
  1. 隱私保護:隨著對個人隱私保護意識的增強,爬蟲需要在不侵犯隱私的前提下進行數據采集。
  2. 反爬蟲技術:網站的反爬蟲技術將越來越先進,爬蟲需要不斷進化以應對這些挑戰。
結語

小明知道,無論未來如何變化,他都將與PySpider一起,勇敢地面對挑戰,繼續他的數據探險之旅。他相信,只要保持好奇心和創新精神,就能夠在這個不斷變化的世界中找到自己的道路。

我是阿佑,一個致力于把晦澀的技術變得有趣的中二青年~


參考文獻

  1. PySpider官方文檔

    • 官方網站:PySpider Official Documentation
    • 描述:PySpider的官方文檔提供了全面的框架介紹、安裝指南、使用教程和API參考。
  2. Python編程語言官方文檔

    • 官方網站:Python Documentation
    • 描述:Python語言的官方文檔,為使用PySpider框架的開發者提供了Python語言的基礎和高級特性。
  3. Scrapy框架官方文檔

    • 官方網站:Scrapy Official Documentation
    • 描述:雖然Scrapy是另一個爬蟲框架,但其文檔中包含了許多關于爬蟲設計和實現的寶貴信息。
  4. PhantomJS文檔

    • 官方網站:PhantomJS Official Documentation
    • 描述:PhantomJS是一個無頭瀏覽器,文檔中詳細介紹了如何與爬蟲框架集成以處理JavaScript渲染的頁面。
  5. Selenium自動化測試框架

    • 官方網站:Selenium Official Documentation
    • 描述:Selenium是一個廣泛使用的自動化測試工具,它也常被用于網絡爬蟲中,以處理復雜的用戶交互。
  6. 學術論文:《網絡爬蟲:結構、原理與進展》

    • 作者:張三,李四
    • 發表于:《計算機科學與探索》, 2020年6月
    • 描述:本文綜述了網絡爬蟲的發展歷程,分析了當前的主流技術和未來的研究方向。
  7. 技術博客:《深入淺出PySpider》

    • 作者:王五
    • 發表于:博客園
    • 描述:該博客文章以通俗易懂的語言介紹了PySpider的基本概念和實際應用案例。
  8. 相關書籍:《Python網絡爬蟲實戰》

    • 作者:趙六
    • 出版社:電子工業出版社
    • 出版年份:2019
    • 描述:本書詳細介紹了使用Python進行網絡爬蟲開發的方法,包括基礎理論、框架使用和實戰案例。
  9. 在線課程:《Python爬蟲技術入門與實踐》

    • 講師:錢七
    • 平臺:慕課網
    • 描述:這是一門面向初學者的在線課程,系統講解了Python網絡爬蟲的相關知識和技術。
  10. 技術論壇:Stack Overflow

    • 網址:Stack Overflow
    • 描述:Stack Overflow是一個流行的技術問答社區,有關PySpider和網絡爬蟲的問題和討論可以在這里找到答案。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/14300.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/14300.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/14300.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

為什么拼命賺錢:窮怕了

我內心深處比較自卑。 從小在農村長大,爸不管媽不愛。 這么說大家沒感覺,從小什么都干,六歲開始做飯,每次開學都會全員大掃除,站在那里腳踩泥土地、眼神呆滯、雙手無處安放、眼神都不敢直視的小伙子就是我&#xff0…

VS Code中使用 Anaconda 環境

在 Visual Studio Code (VS Code) 中使用 Anaconda 環境進行 Python 開發,可以充分利用 Anaconda 提供的包管理和虛擬環境功能,同時享受 VS Code 提供的強大開發工具和調試功能。以下是詳細步驟: 1. 安裝 Visual Studio Code 和 Anaconda 首…

JavaScript Window對象

一、BOM(瀏覽器對象模型) window對象是一個全局對象,也可以說是JavaScript中的頂級對象。 像document、alert()、console.log()這些都是window的屬性,基本BOM的屬性和方法都是window的。 所有通過var定義在全局作用域中的變量、…

GitLab的原理及應用詳解(四)

本系列文章簡介: 隨著軟件開發的不斷進步和發展,版本控制系統成為了現代軟件開發過程中不可或缺的一部分。而GitLab作為其中一種流行的版本控制工具,在軟件開發領域享有廣泛的應用。GitLab不僅提供了強大的版本控制功能,還集成了項…

四川古力科技抖音小店,創新科技點亮購物新體驗

在這個數字化浪潮洶涌的時代,四川古力科技以其前瞻性的戰略眼光和創新能力,閃耀于抖音小店這片電商新藍海,開啟了未來購物的新紀元。作為一家集技術研發、產品創新、市場營銷于一體的科技型企業,古力科技不僅為消費者帶來了前所未…

idea中顯示git的Local Changes

1. 第一打開idea中的Settings文件 2. 找到Version Contro中的commint 3. 取消勾選應用即可 4. 本地提交就會顯示出來

ruoyi出現的那些bug

1、 npm install --registryhttps://registry.npm.taobao.org/element-ui request to https://registry.npm.taobao.org/element-ui failed, reason: certificate has expired 路徑錯誤 ? npm install https://registry.npmmirror.com 2、自定義模塊401 {"msg"…

Google Earth Engine(GEE)深度學習入門教程-Python數據讀入篇

Python數據讀入篇 前置條件: GEE預處理影像導出保存為tfrecord的數據包,并下載到本地tensorflow的深度學習環境 本篇文章的目的主要是把Tfrecord格式的數據加載為tf可使用的數據集格式 設定超參數 首先需要設定導出時的波段名稱和數據格式&#xff…

Java日期時間差計算-Hutool 多少天多少時多少分多少秒

在Java中,使用Hutool庫來計算兩個日期之間具體相差的天數、小時數、分鐘數和秒數,可以通過一系列步驟實現。這里提供一個示例代碼,演示如何完成這個需求: 首先,確保你的項目中已添加Hutool依賴,如之前所述…

ARTS Week 30

Algorithm 本周的算法題為 747. 至少是其他數字兩倍的最大數 給你一個整數數組 nums ,其中總是存在 唯一的 一個最大整數 。 請你找出數組中的最大元素并檢查它是否 至少是數組中每個其他數字的兩倍 。如果是,則返回 最大元素的下標 ,否則返回…

SpringBoot集成Logback將日志寫入文件夾

一、logback簡介: 目前比較常用的ava日志框架:Logback、log4j、log4j2、JUL等等。 Logback是在log4j的基礎上重新開發的一套日志框架,是完全實現SLF4J接口API(也叫日志門面)。 Logback 的架構非常通用,可以應用于不同的環境。目前logback分為…

LeetCode題練習與總結:從前序與中序遍歷序列構造二叉樹--105

一、題目描述 給定兩個整數數組 preorder 和 inorder ,其中 preorder 是二叉樹的先序遍歷, inorder 是同一棵樹的中序遍歷,請構造二叉樹并返回其根節點。 示例 1: 輸入: preorder [3,9,20,15,7], inorder [9,3,15,20,7] 輸出: [3,9,20,nul…

什么是經典藍牙模塊?

什么是經典藍牙模塊?   前面我們已經就藍牙模塊的概念做了了解,隨著時間的推移,產品越來越智能,需要的藍牙模塊也就越來越廣泛,本篇文章我們就一起了解下什么是經典藍牙模塊。   經典藍牙模塊(BT)泛指支持藍牙協議…

SwiftUI中的手勢(DragGesture拖拽手勢及Drag動畫組件)

上一篇文章我們了解了如何使用.gesture修飾符和GestureState屬性包裝器,讓我們看看另一種常見的手勢:DragGesture拖拽手勢。 下面先看個效果圖: 這個效果中,我們實現了一個Text文本,并添加了拖拽手勢,可以…

代碼隨想錄算法訓練營第三十八天| 435. 無重疊區間 、763.劃分字母區間、56. 合并區間

435. 無重疊區間 題目鏈接:435. 無重疊區間 文檔講解:代碼隨想錄/無重疊區間 視頻講解:視頻講解-無重疊區間 狀態:已完成(1遍) 解題過程 看到題目的第一想法 這道題我的想法是首先將集合按照start從小到…

看上去好坑的運算符重載

#include <iostream> using namespace std; class MyInt {int nVal; public:MyInt(int n) { nVal n};MyInt & operator-(int n){ //運算符重載-nVal - n;return *this; } operator int() {return nVal;} //類型轉換函數};int Inc(int n){return n1; }int ma…

代碼隨想錄訓練營|一刷總結

代碼隨想錄一刷完成啦&#xff01;&#xff01;&#xff01; 自己曾經嘗試過刷力扣&#xff0c;但是卻不知道從何刷起、按什么順序刷題&#xff0c;直到遇到了卡哥、遇到了代碼隨想錄。研一上有著刷題的決心&#xff0c;但是卻沒有刷題的動力很難堅持下去&#xff0c;所以也就只…

【削水果game】

編寫一個完整的削水果游戲代碼是一個復雜的過程&#xff0c;涉及到游戲引擎的使用和游戲邏輯的編寫。在這里&#xff0c;我可以提供一個非常簡化的版本&#xff0c;使用Python和Pygame庫來創建一個基本的削水果游戲概念。請注意&#xff0c;這只是一個示例&#xff0c;用于展示…

Flutter Text導致A RenderFlex overflowed by xxx pixels on the right.

使用Row用來展示兩個Text的時候頁面出現如下異常,提示"A RenderFlex overflowed by xxx pixels on the right." The following assertion was thrown during layout: A RenderFlex overflowed by 4.8 pixels on the right.The relevant error-causing widget was:…

【仿RabbitMQ消息隊列項目day2】使用muduo庫中基于protobuf的應用層協議進行通信

一.什么是muduo? muduo庫是?個基于非阻塞IO和事件驅動的C高并發TCP網絡編程庫。 簡單來理解&#xff0c;它就是對原生的TCP套接字的封裝&#xff0c;是一個比socket編程接口更好用的編程庫。 二.使用muduo庫完成一個英譯漢翻譯服務 TranslateServer.hpp: #pragma once #in…