Scrapy爬蟲教程(新手)

1. Scrapy的核心組成

? ? ? ? 引擎(engine):scrapy的核心,所有模塊的銜接,數據流程梳理。

? ? ? ? 調度器(scheduler):本質可以看成一個集合和隊列,里面存放著一堆即將要發送的請求,可以看成是一個url容器,它決定了下一步要爬取哪一個url,通常我們在這里可以對url進行去重操作。

? ? ? ? 下載器(downloader):本質是一個用來發動請求的模塊,可以理解成是一個requests.get()的功能,只不過返回的是一個response對象。

? ? ? ? 爬蟲(spider):負載解析下載器返回的response對象,從中提取需要的數據。

? ? ? ? 管道(pipeline):主要負責數據的存儲和各種持久化操作。

2. 安裝步驟

? ? ? ? 這里安裝的scrapy版本為2.5.1版,在pycharm命令行內輸入pip install scrapy==2.5.1即可。

pip install scrapy==2.5.1

? ? ? ? 但是要注意OpenSSL的版本,其查看命令為

scrapy version --verbose

? ? ? ?如果OpenSSL版本不為1.1版本的話,需要對其進行降級。

pip uninstall cryptography
pip install cryptography==36.0.2

? ? ? ? 注:如果降級之后使用scrapy version --verbose出現錯誤:TypeError: deprecated() got an unexpected keyword argument 'name',可能是OpenSSL版本過低導致,這里需要根據自身情況,進行對應處理。

卸載cryptography:pip uninstall cryptography
重新安裝cryptography 36.0.2:pip install cryptography==36.0.2
卸載pyOpenSSL:pip uninstall pyOpenSSL
重新安裝pyOpenSSL 22.0.0:pip install pyOpenSSL==22.0.0

? ? ? ? 如果查看時出現錯誤:AttributeError: 'SelectReactor' object has no attribute '_handleSignals'
可能是由于Twisted版本問題,進行卸載重新安裝Twisted即可。

pip uninstall Twisted
pip install Twisted==22.10.0

3. 基礎使用

1.創建項目scrapy startproject 項目名
2.進入項目目錄cd 項目名
3.生成spiderscrapy genspider 爬蟲名字 網站的域名
4.調整spider給出start_urls以及如何解析數據
5.調整setting配置文件配置user_agent,robotstxt_obey,pipeline取消日志信息,留下報錯,需調整日志級別 LOG_LEVEL
6.允許scrapy程序scrapy crawl 爬蟲的名字

4. 案例分析

? ? ? ? 當使用 scrapy startproject csdn?之后,會出現csdn的文件夾

? ? ? ? 當輸入 scrapy genspider csdn_spider blog.csdn.net 之后,會出現

? ? ? ? ?我們這里以爬取自己csdn所發表的文章為例,在csdn_spider.py中編輯頁面元素的定位方式

import scrapyclass CsdnSpiderSpider(scrapy.Spider):name = 'csdn_spider'allowed_domains = ['blog.csdn.net']start_urls = ['http://blog.csdn.net/mozixiao__']def parse(self, response):print('===>',response)infos = response.xpath('//*[@id="navList-box"]/div[2]/div/div/div') #這里的路徑需要注意的是,最后一個div不需要加確定的值,這里是一個模糊匹配,不然infos就只有一個信息for info in infos:title = info.xpath('./article/a/div/div[1]/div[1]/h4/text()').extract_first().strip()date = info.xpath('./article/a/div/div[2]/div[1]/div[2]/text()').extract_first().strip().split()[1]view = info.xpath('./article/a/div/div[2]/div[1]/div[3]/span/text()').extract_first().strip()dianzan = info.xpath('./article/a/div/div[2]/div[1]/div[4]/span/text()').extract_first().strip()pinglun = info.xpath('./article/a/div/div[2]/div[1]/div[5]/span/text()').extract_first().strip()shouchang = info.xpath('./article/a/div/div[2]/div[1]/div[6]/span/text()').extract_first().strip()yield {'title':title,'date':date,'view':view,'dianzan':dianzan,'pinglun':pinglun,'shouchang':shouchang}# print(title,date,view,dianzan,pinglun,shouchang)

? ? ? ? 通過yield返回的數據會傳到piplines.py文件中,在pipelines.py文件中進行數據的保存。

#管道想要使用要在setting開啟
class CsdnPipeline:def process_item(self, item, spider):# print(type(item['title']),type(item['date']),type(item['view']),type(item['dianzan']),type(item['pinglun']),type(item['shouchang']))with open('data.csv',mode='a+',encoding='utf-8') as f:# line =f.write('標題:{} 更新日期:{} 瀏覽量:{} 點贊:{} 評論:{} 收藏:{} \n'.format(
item['title'],item['date'],item['view'],item['dianzan'],item['pinglun'],item['shouchang']))# f.write(f"標題:{item['title']} 更新日期:{item['date']} 瀏覽量:{item['view']} 點贊:{item['dianzan']} 評論:{item['pinglun']} 收藏:{item['shouchang']} \n")return item

5. pipelines.py改進

? ? ? ? 上面的pipelines.py文件中對于文件的open次數與爬取的信息數量有關,為了減少文件的讀取關閉操作,采用全局操作的方式。

class CsdnPipeline:def open_spider(self,spider):self.f = open('data.csv',mode='a+',encoding='utf-8')def close_spider(self,spider):self.f.close()def process_item(self, item, spider):self.f.write('標題:{} 更新日期:{} 瀏覽量:{} 點贊:{} 評論:{} 收藏:{} \n'.format(
item['title'],item['date'],item['view'],item['dianzan'],item['pinglun'],item['shouchang']))# f.write(f"標題:{item['title']} 更新日期:{item['date']} 瀏覽量:{item['view']} 點贊:{item['dianzan']} 評論:{item['pinglun']} 收藏:{item['shouchang']} \n")return item

6. 爬蟲時,當前頁面爬取信息時,需要跳轉到其他url

? ? ? ? 爬取當前頁面時,爬取到的信息是一個url信息,這是需要將其與之前的url進行拼接。

? ? ? ? 以https://desk.zol.com.cn/dongman/為主url,/bizhi/123.html為跳轉url為例。如果鏈接以 / 開頭,需要拼接的是域名,最前面的 / 是根目錄。結果為https://desk.zol.com.cn/bizhi/123.html。如果不是以 / 開頭,需要冥界的是當前目錄,同級文件夾中找到改內容。結果為https://desk.zol.com.cn/dongman/bizhi/123.html。

? ? ? ? 為了方便url的跳轉,可以使用python中urllib庫或者scrapy封裝好的函數。

class PicSpiderSpider(scrapy.Spider):name = 'pic_spider'allowed_domains = ['blog.csdn.net']start_urls = ['http://blog.csdn.net/mozixiao__']def parse(self, response):infos = response.xpath('')for info in infos:if info.endswith(''):continue#方法1from urllib.parse import urljoinchild_url = urljoin(response.url,info)#方法2child_url = response.urljoin(info)

? ? ? ? 為了更好地處理跳轉之后的鏈接(不需要用requests庫寫圖片的提取),同時為了方式新的url繼續跳轉到parse,我們可以重寫一個new_parse來處理跳轉url。

import scrapy
from scrapy import Requestclass PicSpiderSpider(scrapy.Spider):name = 'pic_spider'allowed_domains = ['blog.csdn.net']start_urls = ['http://blog.csdn.net/mozixiao__']def parse(self, response):infos = response.xpath('')for info in infos:if info.endswith(''):continue#方法1# from urllib.parse import urljoin# child_url = urljoin(response.url,info)#方法2child_url = response.urljoin(info)yield Request(child_url,callback=self.new_parse)def new_parse(self,response):img_src = response.xpath('')yield {"src":img_src}

7. pipelines.py保存對象是圖片或者文件等

from itemadapter import ItemAdapterfrom scrapy.pipelines.images import ImagesPipeline
from scrapy.pipelines.files import FilesPipeline
from scrapy import Requestclass PicPipeline(ImagesPipeline):def get_media_requests(self,item,info):srcs = item['src']for src in srcs:yield Request(src,meta={'path':src})def file_path(self,request,response=None,info=None,*,item=None):path = request.meta['path']file_name = path.split('/')[-1]return '***/***/***/{}'.format(file_name)def item_completed(self, results, item,info):return item

注:為了使圖片可以成功的保存,需要在settings.py文件中設置一個IMAGES_STORE的路徑。同時,如果在下載圖片時,出現了302的問題,需要設置MEDIA_ALLOW_REDIRECTS。

8. Scrapy爬蟲遇到分頁跳轉的時候

1.普通分頁表現為:上一頁  1,2,3,4,5,6  下一頁類型1:觀察頁面源代碼發現url直接在頁面源代碼里體現解決方案:1.訪問第一頁->提取下一個url,訪問下一頁2.直接觀察最多大少爺,然后觀察每一頁url的變化類型2:觀察頁面源代碼發現url不在頁面源代碼中體現解決方案:通過抓包找規律(可能在url上體現,也可能在參數上體現)
2.特殊分頁類型1:顯示為加載更多的圖標,點擊之后出來一推新的信息解決方案:通過抓包找規律類型2:滾動刷新,滑倒數據結束的時候會再次加載新數據這種通常的邏輯是:這一次更新時獲得的參數會附加到下一次更新的請求中

? ? ? ? 情況1:如果遇到分頁跳轉信息在url中體現,可以通過重寫start_request的方式來進行

import scrapy
from scrapy import Requestclass FenyeSpiderSpider(scrapy.Spider):name = 'fenye_spider'allowed_domains = ['blog.csdn.net']start_urls = ['http://blog.csdn.net/']def start_requests(self):num = int(input())for i in range(1,num):url = "https://***.com/page_{}.html".format(i)yield Request(url)def parse(self, response):pass

? ? ? ? 情況2:分頁跳轉信息的url體現在的頁面源代碼中

import scrapy
from scrapy import Requestclass FenyeSpiderSpider(scrapy.Spider):name = 'fenye_spider'allowed_domains = ['blog.csdn.net']start_urls = ['http://blog.csdn.net/page_1.html']def parse(self, response):infos = response.xpath('')for info in infos:if info.startswith('***'):continuechild_info = response.urljoin(info)#這里無需考慮死循環的問題,scrapy中的調度器會自動去重yield Request(child_info,callback=self.parse)

9. Scrapy面對帶有cookie的信息頁面時的登陸操作

1.常規登錄網站會在cookie中寫入登錄信息,在登陸成功之后,返回的響應頭里面會帶著set-cookie字樣,后續的請求會在請求頭中加入cookie內容可以用session來自動圍護響應頭中的set-cookie
2. ajax登陸登陸后,從瀏覽器中可能發現響應頭沒有set-cookie信息,但是在后續的請求中存在明顯的cookie信息該情況90%的概率是:cookie通過JavaScript腳本語言動態設置,seesion就不能自動維護了,需要通過程序手工去完成cookie的拼接
3. 依然是ajax請求,也沒有響應頭,也是js和2的區別是,該方式不會把登錄信息放在cookie中,而是放在storage里面。每次請求時從storage中拿出登錄信息放在請求參數中。這種方式則必須要做逆向。該方式有一個統一的解決方案,去找公共攔截器。

? ? ? ? 方法1,直接在settings.py文件中設置請求頭信息。但是由于scrapy(引擎和下載器之間的中間件)會自動管理cookie,因此設置時,也需要將COOKIES_ENABLED設置為False

? ? ? ? ? ? ? ? 方法2,重寫start_requests函數,將cookie作為參數傳入

import scrapy
from scrapy import Requestclass LoginSpiderSpider(scrapy.Spider):name = 'login_spider'allowed_domains = ['blog.csdn.net']start_urls = ['http://blog.csdn.net/']def start_requests(self):cookie_info = ""cookie_dic = {}for item in cookie_info.split(';'):item = item.strip()k,v = item.split('=',1)cookie_dic[k]=v#需要注意的是,這里的cookie要以自己的參數傳入,而不是字符串yield Request(self.start_urls[0],cookies=cookie_dic)def parse(self, response):pass

? ? ? ? 方法3,自己走一個登錄流程,登錄之后,由于scrapy(引擎和下載器之間的中間件)會自己管理cookie信息,所以直接執行start_urls即可。

import scrapy
from scrapy import Requestclass LoginSpiderSpider(scrapy.Spider):name = 'login_spider'allowed_domains = ['blog.csdn.net']start_urls = ['http://blog.csdn.net/']def start_requests(self):login_url = "https://blog.csdn.net/login"data = {'login':'123456','password':'123456'}#但是這里要注意,Request中的body需要傳入的是字符串信息,而不是字典#方法1login_info = []for k,v in data.items():login_info.append(k+"="+v)login_info = '&'.join(login_info)#方法2from urllib.parse import urlencodelogin_info = urlencode(data)yield Request(login_url,method='POST',body=login_info)def parse(self, response):pass

10. Scrapy中間件

? ? ? ? 中間件位于middlewares.py文件中,

11. Scrapy之鏈接url提取器

? ? ? ? 上面提到當爬蟲需要跳轉url時,需要使用urljoin的函數來進行url的憑借,這個操作可以使用LinkExtractor來簡化。

from urllib.request import Request
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy import Request
import reclass LinkSpiderSpider(scrapy.Spider):name = 'link_spider'allowed_domains = ['4399.com']start_urls = ['https://www.4399.com/flash_fl/5_1.htm']def parse(self, response):# print(response.text)game_le = LinkExtractor(restrict_xpaths=("//ul[@class='list affix cf']/li/a",))game_links = game_le.extract_links(response)for game_link in game_links:# print(game_link.url)yield Request(url=game_link.url,callback=self.game_name_date)if '5_1.htm' in response.url:page_le = LinkExtractor(restrict_xpaths=("//div[@class='bre m15']//div[@class='pag']/a",))else:page_le = LinkExtractor(restrict_xpaths=("//div[@class='pag']/a",))page_links = page_le.extract_links(response)for page_link in page_links:# print(page_link.url)yield Request(url=page_link.url,callback=self.parse)def game_name_date(self,response):try:name = response.xpath('//*[@id="skinbody"]/div[7]/div[1]/div[1]/div[2]/div[1]/h1/a/text()')info = response.xpath('//*[@id="skinbody"]/div[7]/div[1]/div[1]/div[2]/div[2]/text()')if not info:info = response.xpath('//*[@id="skinbody"]/div[6]/div[1]/div[1]/div[2]/div[2]/text()')# print(name,info)# print(1)name = name.extract_first()infos = info.extract()[1].strip()size = re.search(r'大小:(.*?)M',infos).group(1)date = re.search(r'日期:(\d{4}-\d{2}-\d{2})',infos).group(1)yield {'name':name,'size':size+'M','date':date}except Exception as e:print(e,info,response.url)

12. 增量式爬蟲

? ? ? ? 當爬取的數據中包含之前訪問過的數據時,需要對url進行判斷,以保證不重復爬取。增量式爬蟲不能將中間數據存儲在內存級別的存儲,只能選擇硬盤上的存儲。

import scrapy
from redis import Redis
from scrapy import Request,signalsclass ZengliangSpiderSpider(scrapy.Spider):name = 'zengliang_spider'allowed_domains = ['4399.com']start_urls = ['http://4399.com/']#觀察到middlewares中間間中的寫法,想要減少程序連接redis數據庫的次數@classmethoddef from_crawler(cls, crawler):# This method is used by Scrapy to create your spiders.s = cls()#如果遇到Crawler中找不到當前spider時,可以參考父類中的寫法,將去copy過來#s._set_crawler(crawler)crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)crawler.signals.connect(s.spider_closed, signal=signals.spider_closed)return sdef spider_opened(self, spider):self.red = Redis(host='',port=123,db=3,password='')def spider_closed(self,spider):self.red.save()self.red.close()def parse(self, response):hrefs = response.xpath('').extract()for href in hrefs:href = response.urljoin(href)if self.red.sismember('search_path',href):continueyield Request(url=href,callback=self.new_parse,meta={'href':href} #防止url重定向)def new_parse(self,response):href = response.meta.get('href')self.red.sadd('save_path',href)pass

13. 分布式爬蟲

? ? ? ? scrapy可以借助scrapy-redis插件來進行分布式爬蟲,但要注意兩個庫的版本問題。

? ? ? ? 與普通的scrapy不同,redis版本的在spider文件中繼承時采用redis的繼承。

from scrapy_redis.spiders import RedisSpiderclass FbSpider(RedisSpider):name = 'fb'allowed_domains = ['4399.com']redis_key = "path"def parse(self, response):pass

? ? ? ? 同時,需要在settings.py中設置redis相關的信息。

SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER_PERSIST = TrueITEM_PIPELINES = {'fenbu.pipelines.FenbuPipeline': 300,'scrapy_redis.pipelines.RedisPipeline':301
}
REDIS_HOST = ''
REDIS_PORT = ''
REDIS_DB = ''
REDIS_PARAMS = {'':''
}

以上這些就是我關于scrapy爬蟲的基本學習,有疑問可以相互交流。

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

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

相關文章

Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型時序預測

Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型時序預測 目錄 Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型時序預測預測效果基本介紹程序設計參考資料 預測效果 基本介紹 Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五…

歷史數據分析——唐山港

個股簡介 公司簡介: 唐山港口投資有限公司、北京京泰投資管理中心、河北利豐燕山投資管理中心、國富投資公司、唐山市建設投資公司、河北省建設投資公司、國投交通實業公司7家發起人共同發起設立。 經營分析: 港口經營一般項目:港口貨物裝卸搬運活動;普通貨物倉儲服務(不含…

云端回聲消除:讓超低端硬件能玩實時打斷

傳統認知里“優質交互 高性能硬件”的等式正在被打破? 超低端開發板也能實現高配置硬件才有的實時打斷語音交互? 網易云信推出的云端回聲消除技術不僅解決了硬件配置對交互體驗的限制,更以系統性解決方案重構了嵌入式設備的實時對話體驗。 困…

堆排序的詳細解讀

一.堆的基本概念 1.什么是堆 堆是一種特殊的完全二叉樹,滿足一下性質: 最大堆:每個節點的值都大于或等于其子節點的值(堆頂元素最大)最小堆:每個節點的值都小于或等于其子節點的值(堆頂元素最小…

hmdp知識點

1. 前置知識 1.1 MyBatisPlus的基本使用 1.1.1 引入依賴 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3</version> </dependency> 1.1.2 建立實體類和數…

分享5個免費5個在線工具網站:Docsmall、UIED Tool在線工具箱、草料二維碼、圖片在線壓縮、表情符號

01. Docsmall 它是一個免費的在線圖片與PDF處理工具&#xff0c;功能主要包含Ai圖片處理工具&#xff0c;圖片壓縮工具&#xff0c;圖片PDF格式轉換工具等&#xff0c;如下圖&#xff0c;我認為比較實用的是自動摳圖、圖片變高清、圖片壓縮和PDF壓縮。 https://docsmall.com/…

打通印染車間“神經末梢”:DeviceNet轉Ethernet/IP連接機器人的高效方案

在印染行業自動化升級中&#xff0c;設備聯網需求迫切。老舊印染設備多采用Devicenet協議&#xff0c;而新型工業機器人普遍支持Ethernet/IP協議&#xff0c;協議不兼容導致數據交互困難&#xff0c;設備協同效率低、生產監控滯后&#xff0c;成了行業數字化轉型的阻礙。本文將…

RSA加密算法:非對稱密碼學的基石

一、RSA算法概述 RSA&#xff08;Rivest-Shamir-Adleman&#xff09;是1977年由Ron Rivest、Adi Shamir和Leonard Adleman提出的非對稱加密算法&#xff0c;它基于大數分解的數學難題&#xff0c;是當今應用最廣泛的公鑰密碼系統。RSA的核心思想是使用一對密鑰&#xff08;公鑰…

杭州瑞盟 MS35774/MS35774A 低噪聲256細分微步進電機驅動,用于空調風門電機驅動,香薰電機驅動

杭州瑞盟 MS35774/MS35774A 低噪聲256細分微步進電機驅動&#xff0c;用于空調風門電機驅動&#xff0c;香薰電機驅動 簡述 MS35774/MS35774A 是一款高精度、低噪聲的兩相步進 電機驅動芯片&#xff0c;芯片內置功率 MOSFET &#xff0c;長時間工作的平均電 流可以達到 1…

駛向智能未來:車載 MCP 服務與邊緣計算驅動的駕駛數據交互新體驗

引言 在人工智能技術與車載算力持續突破的驅動下&#xff0c;現代車輛的數字化進程正加速推進。車聯網系統將突破傳統云端架構的局限&#xff0c;依托邊緣計算與 AI 融合技術&#xff0c;實現人車交互體驗的范式重構?。通過構建基于多源異構數據的自動化分析框架&#xff0c;…

Python數據可視化科技圖表繪制系列教程(三)

目錄 單一柱狀圖 分組柱狀圖 堆積柱狀圖 百分比柱狀圖 均值柱狀圖 不等寬柱狀圖 有序柱狀圖 條形圖 發散條形圖 在條上添加標簽的發散條形圖 基礎棒棒糖圖1 基礎棒棒糖圖2 【聲明】&#xff1a;未經版權人書面許可&#xff0c;任何單位或個人不得以任何形式復制、發…

JavaScript 數組與流程控制:從基礎操作到實戰應用

在 JavaScript 編程的世界里&#xff0c;數組是一種極為重要的數據結構&#xff0c;它就像是一個有序的 “收納盒”&#xff0c;能夠將多個值整齊地存儲起來。而流程控制語句則像是 “指揮官”&#xff0c;能夠按照特定的邏輯對數組進行遍歷和操作。接下來&#xff0c;就讓我們…

十(1). 強制類型轉換

繼第十部分C強制類型轉換的四種方式&#xff0c;再進行強化鞏固一下知識點 static_cast 最常用的&#xff0c;在指針之間做轉換 const_cast 去除常量屬性 dynamic_cast 用在基類和派生類之間的轉換 reinterpret_cast 在任意類型之間進行轉 10.1 static_cast 常見的使用場景&am…

Git版本控制工具詳解

如何區分開發環境和生產環境呢 答案就是寫不同的配置文件&#xff0c;開發的設置成開發需要的&#xff0c;生產的設置成生產需要的&#xff0c;共同放到config這個配置文件夾下面&#xff0c;開發和生成的時候分別加載不同的配置文件 方式二就是使用相同的一個入口配置文件&a…

反向傳播的核心是什么:計算損失函數對可訓練參數的梯度=== 損失函數能通過計算圖連接到可訓練參數

反向傳播的核心是什么:計算損失函數對可訓練參數的梯度 損失函數能通過計算圖連接到可訓練參數 在深度學習中,反向傳播的核心是計算損失函數對可訓練參數的梯度,從而更新這些參數。對于LLM(大型語言模型)而言,是否需要“LLM輸出的參數”才能進行反向傳播 一、反向傳播…

KINGCMS被入侵

現象會強制跳轉到 一個異常網站,請掉截圖代碼. 代碼中包含經過混淆處理的JavaScript&#xff0c;它使用了一種技術來隱藏其真實功能。代碼中使用了eval函數來執行動態生成的代碼&#xff0c;這是一種常見的技術&#xff0c;惡意腳本經常使用它來隱藏其真實目的。 這段腳本會檢…

深入探索串的高級操作:從算法到 LeetCode 實戰

串是編程中最常用的數據結構之一&#xff0c;從簡單的文本處理到復雜的文本匹配算法&#xff0c;串的應用無處不在。在掌握了串的基本概念、存儲結構以及KMP算法之后&#xff0c;現在讓我們深入探索串的更多高級操作&#xff0c;例如求子串、串的替換等&#xff0c;并通過LeetC…

在rocky linux 9.5上在線安裝 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …

OneNet + openssl + MTLL

1.OneNet 使用的教程 1.在網絡上搜索onenet&#xff0c;注冊并且登錄賬號。 2.產品服務-----物聯網服務平臺立即體驗 3.在底下找到立即體驗進去 4.產品開發------創建產品 5.關鍵是選擇MQTT&#xff0c;其他的內容自己填寫 6.這里產品以及開發完成&#xff0c;接下來就是添加設…

【Fiddler工具判斷前后端Bug】

Fiddler工具判斷前后端Bug的方法 使用Fiddler抓包工具可以高效定位問題是出在前端還是后端&#xff0c;主要通過分析請求和響應的內容、狀態碼、數據格式等關鍵信息。 分析請求是否成功發送 檢查請求是否從客戶端正確發出&#xff0c;觀察Fiddler抓取的請求列表。若請求未出…