Python 使用 Requests 模塊進行爬蟲

目錄

  • 一、請求數據
  • 二、獲取并解析數據
  • 四、保存數據
    • 1. 保存為 CSV 文件
    • 2. 保存為 Excel 文件
      • 打開網頁圖片并將其插入到 Excel 文件中
  • 五、加密參數逆向分析
    • 1. 定位加密位置
    • 2. 斷點調試分析
    • 3. 復制相關 js 加密代碼,在本地進行調試(難)
    • 4. 獲取 sign 加密參數
  • 六、其他示例
    • 1. 單頁數據處理與保存
    • 2. 翻頁數據采集 — MD5 加密
      • 1)分析請求鏈接 / 參數的變化
      • 2)sign 加密參數逆向分析
      • 3)Python 代碼實現


學習視頻;【Python爬蟲實戰:采集常用軟件數據(得物、閑魚、小紅書、微信小程序、驗證碼識別)】
參考文檔:【Requests: 讓 HTTP 服務人類】

一、請求數據

Requests 模塊通過模擬瀏覽器對 url 地址發送請求。

  • 打開需要采集數據的網站,通過瀏覽器的開發者工具分析對應的數據位置。
    • 右鍵選擇 “檢查” → “網絡” ,打開開發者工具;
    • 刷新網頁;
    • 通過關鍵字搜索找到對應的數據位置。

  • 請求標頭:通過使用請求標頭中的參數內容模擬瀏覽器,該參數需要使用字典 dict={'鍵':'值',} 接收。

PyCharm 批量添加引號和逗號的方法:

  • 選中要替換的內容,輸入 Ctrl + R 打開替換欄;
  • 勾選 .* ,使用正則命令匹配數據進行替換;
  • 第一欄輸入 (.*?):(.*) ,第二欄輸入 '$1':'$2', ,再選中要替換的內容點擊 “全部替換” 。

  • 請求網址:復制抓包分析找到的鏈接地址。

  • 請求方法

    • POST 請求 → 需要向服務器提交表單數據 / 請求載荷;
    • GET 請求 → 向服務器獲取數據。

  • 請求參數:可以在 “載荷” 中進行查看
    • POST 請求 → 隱性;
    • GET 請求 → 顯性(查詢的參數直接在請求網址的鏈接中就可以看出)。

參考文章:【HTTP 方法:GET 對比 POST | 菜鳥教程】

  • 發送請求:使用 requests 模塊。
    • 如果沒有安裝該模塊,則 Win + R 輸入 cmd ,輸入 pip install requests 命令并運行即可。
    • 在 PyCharm 中輸入 import requests 導入數據請求模塊。

Python 代碼:

import requests# 請求標頭
request_header = {'accept': '*/*','accept-encoding': 'gzip, deflate, br, zstd','accept-language': 'zh-CN,zh;q=0.9','connection': 'keep-alive','content-length': '124','content-type': 'application/json','cookie': '...','host': 'app.dewu.com','ltk': '...','origin': 'https://www.dewu.com','referer': 'https://www.dewu.com/','sec-ch-ua': '"Google Chrome";v="137", "Chromium";v="137", "Not/A)Brand";v="24"','sec-ch-ua-mobile': '?0','sec-ch-ua-platform': '"Windows"','sec-fetch-dest': 'empty','sec-fetch-mode': 'cors','sec-fetch-site': 'same-site','sessionid': '...','shumeiid': '...','sk': '','traceparent': '...','user-agent': '...'
}# 請求網址
request_url = r'https://app.dewu.com/api/v1/h5/commodity-pick-interfaces/pc/pick-rule-result/feeds/info'# 請求載荷
request_parameters = {'filterUnbid': True,'pageNum': 1,  # 頁數'pageSize': 24,'pickRuleId': 644443,'showCspu': True,'sign': "0e5d10fb111f2afef6ac0a1776187e23"  # 簽名(加密參數)
}# 請求數據
response = requests.post(url=request_url, json=request_parameters, headers=request_header)

二、獲取并解析數據

  • 獲取服務器返回的響應數據。

    • response.text → 獲取響應的文本數據(字符串)
    • response.json() → 獲取響應的 json 數據(字典 / 列表)
    • response.content → 獲取響應的二進制數據(二進制數據)
  • 對鍵值對進行取值,提取出所需信息。

Python 代碼:

# from pprint import pprint# 獲取數據
data_json = response.json()
# print(data_json)# 解析數據
info_list = data_json['data']['list']
for index in info_list:# pprint(index)# print('-' * 50)info_dict = {'標題': index['title'],'價格': index['price'],'圖片網址': index['logoUrl']}for key, value in info_dict.items():print(f'{key} : {value}')print('-' * 50)

注:如果出現 “requests.exceptions.InvalidHeader: xxx” 的報錯,說明你的 request_header 字典中的值存在多余的空格,仔細檢查后刪除即可。

四、保存數據

1. 保存為 CSV 文件

Python 代碼:

import requests
import csvrequest_header = {...}
request_url = r'https://app.dewu.com/api/v1/h5/commodity-pick-interfaces/pc/pick-rule-result/feeds/info'
request_parameters = {'filterUnbid': True,'pageNum': 1,  # 頁數'pageSize': 24,'pickRuleId': 644443,'showCspu': True,'sign': "0e5d10fb111f2afef6ac0a1776187e23"  # 簽名(加密參數)
}# 創建文件對象
f = open('dewu.csv', mode='w', encoding='utf-8-sig', newline='')
# 字典寫入方法
cd = csv.DictWriter(f, fieldnames=['標題', '價格', '圖片網址'])
# 寫入表頭
cd.writeheader()# 請求數據
response = requests.post(url=request_url, json=request_parameters, headers=request_header)
# 獲取數據
data_json = response.json()
# 解析數據
info_list = data_json['data']['list']
for index in info_list:info_dict = {'標題': index['title'],'價格': index['price'] / 100,'圖片網址': index['logoUrl']}# 寫入數據cd.writerow(info_dict)f.close()

2. 保存為 Excel 文件

Python 代碼:

import requests
import pandas as pdrequest_header = {...}
request_url = r'https://app.dewu.com/api/v1/h5/commodity-pick-interfaces/pc/pick-rule-result/feeds/info'
request_parameters = {'filterUnbid': True,'pageNum': 1,  # 頁數'pageSize': 24,'pickRuleId': 644443,'showCspu': True,'sign': "0e5d10fb111f2afef6ac0a1776187e23"  # 簽名(加密參數)
}# 請求數據
response = requests.post(url=request_url, json=request_parameters, headers=request_header)
# 獲取數據
data_json = response.json()
# 創建一個空列表
dewu_info = []# 解析數據
info_list = data_json['data']['list']
for index in info_list:info_dict = {'標題': index['title'],'價格': index['price'] / 100,'圖片網址': index['logoUrl']}# 寫入數據dewu_info.append(info_dict)# 轉換數據
df = pd.DataFrame(dewu_info)
# 導出保存為 Excel 表格
df.to_excel('dewu.xlsx', index=False)

打開網頁圖片并將其插入到 Excel 文件中

Python 代碼:

import openpyxl
from openpyxl.drawing.image import Image as xlImage
from openpyxl.utils import get_column_letter
from PIL import Image
from io import BytesIOdef download_image(url):rg_url = requests.get(url)# 檢查響應狀態碼if rg_url.status_code == 200:# 創建圖像對象image = Image.open(BytesIO(rg_url.content))# 統一圖像類型if image.mode != 'RGB':image = image.convert('RGB')# 調整圖像大小return image.resize((150, 96))else:raise Exception(f"無法下載圖片,狀態碼: {rg_url.status_code}")# 加載 Excel 文件
wb = openpyxl.load_workbook(r'dewu.xlsx')
# 默認為第一個 sheet
sheet = wb.active
# 調整行高和列寬
for row in range(2, sheet.max_row + 1):sheet.row_dimensions[row].height = 75
sheet.column_dimensions['C'].width = 20# 讀取鏈接并下載圖片插入到對應位置
for row in range(2, sheet.max_row + 1):# 假設圖片鏈接在第 2 行開始,第 C 列是鏈接(對應 column = 3),獲取鏈接單元格的值link = sheet.cell(row=row, column=3).value# 清空內容sheet.cell(row=row, column=3).value = None# 如果鏈接不為空if link:# 發送 HTTP 請求下載圖片try:# 嘗試下載圖像resized_image = download_image(link)except OSError:print(f"下載圖片 {link} 失敗")continueelse:# 將調整后的圖像插入到工作表中img_bytes = BytesIO()resized_image.save(img_bytes, format='PNG')  # 將圖片保存到內存中img = xlImage(img_bytes)sheet.add_image(img, f'{get_column_letter(3)}{row}')  # 插入圖片到指定位置wb.save(r'dewu_result.xlsx')  # 必要
wb.close()  # 必要

參考文章:【Python:openpyxl在excel中讀取url并下載、插入圖片】

五、加密參數逆向分析

1. 定位加密位置

通過開發者工具定位加密位置。

2. 斷點調試分析

斷點調試分析,分析加密規則。

  • 搜索后返回了三個文件中的四個匹配行,分析可能的加密位置,然后添加斷點。

  • 通過對網頁進行操作來調試斷點,程序停止的位置就是我們要找的斷點位置。

  • 通過過濾請求網址,找到對應的請求載荷數據,查看 sign: 后的數據是否與剛剛斷點處的 sign: c(e) 值一致。

  • 移除上面的那個不需要的 sign: c(e) 斷點。

注意:

c(e) 返回 sign 值,其中 e 是參數,c 是方法。

  • e 是除 sign 以外的 POST 請求載荷。

  • c() 的返回值是 “0e5d10fb111f2afef6ac0a1776187e23”(由 0-9 a-f 組成的 32 位字符)。

  • 由 0-9 a-f 組成的 32 位字符可能是 md5 加密。
    驗證是否為標準的 md5 加密,只需要調用加密函數,并傳入字符串參數 ‘123456’ ,如果返回值是以 ‘e10adc’ 開頭、‘883e’ 結尾,那么就是標準的 md5 加密。

由參數 e 是字典也可以看出,該方法 c() 不是 md5 加密,因為 md5 加密的參數一般是字符串。

3. 復制相關 js 加密代碼,在本地進行調試(難)

較難理解的一部分,詳細講解請見:【Python爬蟲實戰:采集常用軟件數據(得物)】的 0:50:25 處。

  • 進入 c() 函數。

  • 新建一個 JavaScript 文件(我的命名:js_file.js),并將上圖紅框中的代碼復制進去。
function c(t) {...}t = {filterUnbid: true,pageNum: 1,pageSize: 24,pickRuleId: 644443,showCspu: true
}  // 請求載荷console.log(c(t))
  • 運行出現錯誤:ReferenceError: u is not defined ,出現此類報錯是正常的,說明存在代碼缺失。解決方案就是:缺方法補方法、缺參數補參數、缺環境補環境。

  • 找到相應的加載器,并將代碼添加至 JavaScript 文件里。

JavaScript 代碼如下:

var a_temp;  // 添加!function a_method(e) {var n = {}function a(r) {...}a_temp = a  // 添加a.e = function (e) {...},a.m = e,a.c = n,a.d = function (e, r, t) {...},a.r = function (e) {...},a.t = function (e, r) {...},a.n = function (e) {...},a.o = function (e, r) {...},a.p = "",a.oe = function (e) {...}
}({});a = (a_temp("cnSC"), a_temp("ODXe"), a_temp("aCH8"))  // 將 r 修改為 a_temp
u = a_temp.n(a);  // 將 r 修改為 a_tempfunction c(t) {...}t = {filterUnbid: true,pageNum: 1,pageSize: 24,pickRuleId: 644443,showCspu: true
}console.log(c(t))
  • 運行上述代碼會出現 TypeError: Cannot read properties of undefined (reading 'call') 的錯誤。如下圖所示添加代碼:

  • 將運行后輸出的缺失代碼添加至 JavaScript 文件里。

JavaScript 代碼如下:

var a_temp;  // 添加!function a_method(e) {var n = {}function a(r) {...try {console.log(r)  // 添加e[r].call(t.exports, t, t.exports, a),o = !1} finally {o && delete n[r]}...}a_temp = a  // 添加a.e = function (e) {...},a.m = e,a.c = n,a.d = function (e, r, t) {...},a.r = function (e) {...},a.t = function (e, r) {...},a.n = function (e) {...},a.o = function (e, r) {...},a.p = "",a.oe = function (e) {...}
}({  // 添加cnSC: function (t, e) {...},ODXe: function (e, t, n) {...},BsWD: function (e, t, n) {...},a3WO: function (e, t, n) {...},aCH8: function (t, e, r) {...},ANhw: function (t, e) {...},mmNF: function (t, e) {...},BEtg: function (t, e) {...}
});a = (a_temp("cnSC"), a_temp("ODXe"), a_temp("aCH8"))  // 將 r 修改為 a_temp
u = a_temp.n(a);  // 將 r 修改為 a_tempfunction c(t) {...}t = {filterUnbid: true,pageNum: 1,pageSize: 24,pickRuleId: 644443,showCspu: true
}console.log(c(t))

詳細的 js_file.js 文件代碼見:【對得物進行爬蟲時使用到的 js 模塊】

  • 運行結果如下圖所示:

4. 獲取 sign 加密參數

  • Win + R 輸入 cmd 進入命令提示符,輸入命令 pip install pyexecjs 安裝 execjs 庫,安裝好后在 PyCharm 中輸入 import execjs 就可以使用該模塊了。

  • 編譯 js 代碼并獲取 sign 加密參數,并將 sign 值添加至請求載荷中。

Python 代碼:

import requests
# 導入編譯 js 代碼模塊
import execjs# 請求標頭
request_header = {...}
# 請求網址
request_url = r'https://app.dewu.com/api/v1/h5/commodity-pick-interfaces/pc/pick-rule-result/feeds/info'
# 請求載荷
request_parameters = {'filterUnbid': True,'pageNum': 1,  # 頁碼'pageSize': 24,'pickRuleId': 644443,  # 類目 ID'showCspu': True
}# 編譯 js 代碼
js_code = execjs.compile(open('./js_file.js', encoding='utf-8').read())
# 獲取 sign 加密參數
sign_data = js_code.call('c', request_parameters)
# 0e5d10fb111f2afef6ac0a1776187e23
# 將 sign 添加至請求載荷中
request_parameters['sign'] = sign_data# 請求數據
response = requests.post(url=request_url, json=request_parameters, headers=request_header)
# 獲取數據
data_json = response.json()
# 解析數據
info_list = data_json['data']['list']
for index in info_list:info_dict = {'標題': index['title'],'價格': index['price'] / 100,'圖片網址': index['logoUrl']}for key, value in info_dict.items():print(f'{key} : {value}')print('-' * 50)

六、其他示例

1. 單頁數據處理與保存

Python 代碼:

# 導入數據請求模塊
import requests
import csvdef get_data_csv(file_path, head_name):# 模擬瀏覽器(請求標頭)request_header = {'Referer': 'https://www.goofish.com/',# cookie 代表用戶信息,常用于檢測是否有登陸賬戶(不論是否登錄都有 cookie)'Cookie': '...'# user-agent 代表用戶代理,顯示瀏覽器 / 設備的基本身份信息'User-Agent': '...'}# 請求網址request_url = r'https://h5api.m.goofish.com/h5/mtop.taobao.idlemtopsearch.pc.search/1.0/'# 查詢參數query_parameters = {'jsv': '2.7.2','appKey': '34839810','t': '1750520204194','sign': '0dba40964b402d00dc448081c8e04127','v': '1.0','type': 'originaljson','accountSite': 'xianyu','dataType': 'json','timeout': '20000','api': 'mtop.taobao.idlemtopsearch.pc.search','sessionOption': 'AutoLoginOnly','spm_cnt': 'a21ybx.search.0.0','spm_pre': 'a21ybx.home.searchSuggest.1.4c053da6IXTxSx','log_id': '4c053da6IXTxSx'}# 表單數據form_data = {"pageNumber": 1,"keyword": "python爬蟲書籍","fromFilter": False,"rowsPerPage": 30,"sortValue": "","sortField": "","customDistance": "","gps": "","propValueStr": {},"customGps": "","searchReqFromPage": "pcSearch","extraFilterValue": "{}","userPositionJson": "{}"}print('Data is being requested and processed…')# 發送請求response = requests.post(url=request_url, params=query_parameters, data=form_data, headers=request_header)# 獲取響應的 json 數據 → 字典數據類型data_json = response.json()# 鍵值對取值,提取商品信息所在列表info_list = data_json['data']['resultList']# 創建文件對象f = open(file_path, mode='a', encoding='utf-8-sig', newline='')# 字典寫入方法cd = csv.DictWriter(f, fieldnames=head_name)cd.writeheader()# for 循環遍歷,提取列表里的元素for index in info_list:# 處理用戶名nick_name = '未知'if 'userNickName' in index['data']['item']['main']['exContent']:nick_name = index['data']['item']['main']['exContent']['userNickName']# 處理售價price_list = index['data']['item']['main']['exContent']['price']price = ''for p in price_list:price += p['text']# 處理詳情頁鏈接item_id = index['data']['item']['main']['exContent']['itemId']link = f'https://www.goofish.com/item?id={item_id}'temporarily_dict = {'標題': index['data']['item']['main']['exContent']['title'],'地區': index['data']['item']['main']['exContent']['area'],'售價': price,'用戶名': nick_name,'詳情頁鏈接': link}cd_file.writerow(temporarily_dict)f.close()if __name__ == '__main__':f_path = './fish.csv'h_name = ['標題', '地區', '售價', '用戶名', '詳情頁鏈接']get_data_csv(f_path, h_name)

2. 翻頁數據采集 — MD5 加密

1)分析請求鏈接 / 參數的變化

如下圖所示,其中 t 可以通過 time 模塊獲取;pageNumber 可以通過 for 循環構建。

2)sign 加密參數逆向分析

  • 通過開發者工具定位加密位置。

  • 斷點調試分析。

k = i(d.token + "&" + j + "&" + h + "&" + c.data) ,其中:

d.token = "b92a905a245d2523e9ca49dd382dad12"  // 固定
j = 1750571387066  // 時間戳(變化)
h = "34839810"  // 固定
// 表單數據,其中只有頁碼 pageNumber 會變化
c.data = ('{"pageNumber": 1, ''"keyword": "python爬蟲書籍", ''"fromFilter": false, ''"rowsPerPage": 30, ''"sortValue": "", ''"sortField": "", ''"customDistance": "", ''"gps": "", ''"propValueStr": {}, ''"customGps": "", ''"searchReqFromPage": "pcSearch", ''"extraFilterValue": "{}", ''"userPositionJson": "{}"}')k = "1c32f4de228112a3a59df6972d186b41"  // 返回值 由 0-9 a-f 構成的 32 位字符
  • 判斷是否為 md5 加密的方法:調用加密函數 i() ,并傳入字符串參數 ‘123456’ ,如果返回值是以 ‘e10adc’ 開頭、‘883e’ 結尾,那么就是標準的 md5 加密。

# 導入哈希模塊
import hashlibd_token = 'b92a905a245d2523e9ca49dd382dad12'
j = 1750571387066  # <class 'int'>
h = '34839810'
c_data = ('{"pageNumber": 1, ''"keyword": "python爬蟲書籍", ''"fromFilter": false, ''"rowsPerPage": 30, ''"sortValue": "", ''"sortField": "", ''"customDistance": "", ''"gps": "", ''"propValueStr": {}, ''"customGps": "", ''"searchReqFromPage": "pcSearch", ''"extraFilterValue": "{}", ''"userPositionJson": "{}"}')
result_str = d_token + "&" + str(j) + "&" + h + "&" + c_data
# 使用 md5 加密
md_str = hashlib.md5()
# 傳入加密參數
md_str.update(result_str.encode('utf-8'))
# 進行加密處理
sign = md_str.hexdigest()  # <class 'str'>
print(sign)  # 1c32f4de228112a3a59df6972d186b41

3)Python 代碼實現

# 導入數據請求模塊
import requests
import csv
# 導入哈希模塊
import hashlib
import timedef get_sign(page):d_token = '...'  # token 是有時效性的,請自行填入j = int(time.time() * 1000)h = '...'c_data = ('{"pageNumber": %d, ...}') % pageresult_str = d_token + "&" + str(j) + "&" + h + "&" + c_data# 使用 md5 加密md_str = hashlib.md5()# 傳入加密參數md_str.update(result_str.encode('utf-8'))# 進行加密處理sign = md_str.hexdigest()return sign, j, c_datadef get_data_csv(file_path, head_name):# 模擬瀏覽器(請求標頭)request_header = {'Referer': 'https://www.goofish.com/',# cookie 代表用戶信息,常用于檢測是否有登陸賬戶(不論是否登錄都有 cookie)# cookie 是有時效性的,請自行填入'Cookie': '...',# user-agent 代表用戶代理,顯示瀏覽器 / 設備的基本身份信息'User-Agent': '...'}# 請求網址request_url = r'https://h5api.m.goofish.com/h5/mtop.taobao.idlemtopsearch.pc.search/1.0/'# 創建文件對象f = open(file_path, mode='a', encoding='utf-8-sig', newline='')# 字典寫入方法cd = csv.DictWriter(f, fieldnames=head_name)cd.writeheader()# for 構建循環翻頁num = 10for i in range(1, num + 1):print(f'正在采集第 {i} 頁數據…')# 獲取 sign 加密參數、時間戳和表單數據sign, j_time, c_data = get_sign(i)# 查詢參數query_parameters = {'jsv': '2.7.2','appKey': '34839810','t': str(j_time),'sign': sign,'v': '1.0','type': 'originaljson','accountSite': 'xianyu','dataType': 'json','timeout': '20000','api': 'mtop.taobao.idlemtopsearch.pc.search','sessionOption': 'AutoLoginOnly','spm_cnt': 'a21ybx.search.0.0','spm_pre': 'a21ybx.home.searchSuggest.1.4c053da6IXTxSx','log_id': '4c053da6IXTxSx'}# 表單數據form_data = {"data": c_data}# 發送請求response = requests.post(url=request_url, params=query_parameters, data=form_data, headers=request_header)# 獲取響應的 json 數據 → 字典數據類型data_json = response.json()# 鍵值對取值,提取商品信息所在列表info_list = data_json['data']['resultList']# for 循環遍歷,提取列表里的元素for index in info_list:# 處理用戶名nick_name = '未知'if 'userNickName' in index['data']['item']['main']['exContent']:nick_name = index['data']['item']['main']['exContent']['userNickName']# 處理售價price_list = index['data']['item']['main']['exContent']['price']price = ''for p in price_list:price += p['text']# 處理詳情頁鏈接item_id = index['data']['item']['main']['exContent']['itemId']link = f'https://www.goofish.com/item?id={item_id}'temporarily_dict = {'標題': index['data']['item']['main']['exContent']['title'],'地區': index['data']['item']['main']['exContent']['area'],'售價': price,'用戶名': nick_name,'詳情頁鏈接': link}cd.writerow(temporarily_dict)f.close()if __name__ == '__main__':f_path = './fish_python.csv'h_name = ['標題', '地區', '售價', '用戶名', '詳情頁鏈接']get_data_csv(f_path, h_name)

運行結果展示:

注意:運行時可能會出現 {'api': 'mtop.taobao.idlemtopsearch.pc.search', 'data': {}, 'ret': ['FAIL_SYS_TOKEN_EXOIRED::令牌過期'], 'v': '1.0'} 的錯誤,那是因為 d_token 和 cookie 都是具有時效性的,每過一段時間都會改變,因此自行修改成當下的 d_token 值和 cookie 值即可。

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

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

相關文章

MySQL行轉列、列轉行

要達到的效果&#xff1a; MySQL不支持動態行轉列 原始數據&#xff1a; 以行的方式存儲 CREATE TABLE product_sales (id INT AUTO_INCREMENT PRIMARY KEY,product_name VARCHAR(50) NOT NULL,category VARCHAR(50) NOT NULL,sales_volume INT NOT NULL,sales_date DATE N…

云創智稱YunCharge充電樁互聯互通平臺使用說明講解

云創智稱YunCharge充電樁互聯互通平臺使用說明講解 一、云創智稱YunCharge互聯互通平臺簡介 云創智稱YunCharge&#xff08;YunCharge&#xff09;互聯互通平臺&#xff0c;旨在整合全國充電樁資源&#xff0c;實現多運營商、多平臺、多用戶的統一接入和管理&#xff0c;打造開…

HTML+JS實現類型excel的純靜態頁面表格,同時單元格內容可編輯

<!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>在線表格</title><style>table {border…

Gartner金融AI應用機會雷達-學習心得

一、引言 在當今數字化時代,人工智能(AI)技術正以前所未有的速度改變著各個行業,金融領域也不例外。財務團隊面臨著如何從AI投資中獲取最大價值的挑戰。許多首席財務官(CFO)和財務領導者期望在未來幾年增加對AI的投入并從中獲得更多收益。據調查,90%的CFO和財務領導者預…

像素著色器沒有繪制的原因

背景 directX調用了 draw&#xff0c;頂點著色器運行&#xff0c;但是像素著色器沒有運行。 原因 光柵化階段被剔除 說明&#xff1a;如果幾何圖元&#xff08;如三角形&#xff09;在光柵化階段被剔除&#xff0c;像素著色器就不會被調用。常見剔除原因&#xff1a; 背面…

jenkins對接、jenkins-rest

https://www.bilibili.com/video/BV1RqNRz5Eo6 Jenkins是一款常見的構建管理工具&#xff0c;配置好后操作也很簡單&#xff0c;只需去控制臺找到對應的項目&#xff0c;再輸入分支名即可 如果每次只發個位數的項目到也還好&#xff0c;一個個進去點嘛。但如果一次要發幾十個項…

北斗導航深度接入小程序打車:高精度定位如何解決定位漂移難題?

你有沒有遇到過這樣的尷尬&#xff1a; 在寫字樓、地下車庫或密集樓群中叫車&#xff0c;系統顯示的位置和你實際所在位置差了幾十米甚至上百米&#xff1b;司機因為找不到你而繞圈&#xff0c;耽誤時間還多花平臺費用&#xff1b;有時明明站在A出口&#xff0c;司機卻跑到B口…

MySQL 主要集群解決方案

MySQL 主要有以下幾種集群解決方案&#xff0c;每種方案針對不同的應用場景和需求設計&#xff1a; 1. MySQL Replication&#xff08;主從復制&#xff09; 類型&#xff1a;異步/半同步復制架構&#xff1a;單主多從特點&#xff1a; 讀寫分離&#xff0c;主庫寫&#xff0c…

基于vue3+express的非遺宣傳網站

? 一個課程大作業&#xff0c;需要源碼可聯系&#xff0c;可以在http://8.138.189.55:3001/瀏覽效果 前端技術 Vue.js 3&#xff1a;我選擇了Vue 3作為核心前端框架&#xff0c;并采用了其最新的Composition API開發模式&#xff0c;這使得代碼組織更加靈活&#xff0c;邏輯…

【7】圖像變換(上)

本節偏難,不用過于深究 考綱 文章目錄 可考題【簡答題】補充第三版內容:圖像金字塔2023甄題【壓軸題】習題7.1【第三版】1 基圖像2 與傅里葉相關的變換2.1 離散哈特利變換(DHT)可考題【簡答題】2.2 離散余弦變換(DCT)2021甄題【簡答題】2.3 離散正弦變換(DST)可考題【簡…

WinUI3入門9:自制SplitPanel

初級代碼游戲的專欄介紹與文章目錄-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代碼都將會位于ctfc庫中。已經放入庫中我會指出在庫中的位置。 這些代碼大部分以Linux為目標但部分代碼是純C的&#xff0c;可以在任何平臺上使用。 源碼指引&#xff1a;github源…

【面板數據】上市公司投資者保護指數(2010-2023年)

上市公司投資者保護指數是基于上市公司年報中公開披露的多項內容&#xff0c;從信息透明度、公司治理結構、關聯交易披露、控股股東行為規范等多個維度&#xff0c;評估企業是否在制度上和實際操作中有效保障投資者&#xff0c;特別是中小投資者的合法權益。本分享數據基于我國…

如何解決USB遠距離傳輸難題?一文了解POE USB延長器及其行業應用

在日常辦公、教學、醫療和工業系統中&#xff0c;USB接口設備扮演著越來越關鍵的角色。無論是視頻采集設備、鍵盤鼠標&#xff0c;還是打印機、條碼槍&#xff0c;USB早已成為主流連接標準。然而&#xff0c;USB原生傳輸距離的限制&#xff08;通常在5米以內&#xff09;常常成…

PostgreSQL(TODO)

(TODO) 功能MySQLPostgreSQLJSON 支持支持&#xff0c;但功能相對弱非常強大&#xff0c;支持 JSONB、索引、函數等并發控制行級鎖&#xff08;InnoDB&#xff09;&#xff0c;不支持 MVCC多版本并發控制&#xff08;MVCC&#xff09;&#xff0c;性能更好存儲過程/觸發器支持&…

LINUX 623 FTP回顧

FTP 權限 /etc/vsftpd/vsftpd.conf anonymous_enableNO local_enableNO 服務器 .20 [rootweb vsftpd]# grep -v ^# vsftpd.conf anonymous_enableNO local_enableYES local_root/data/kefu2 chroot_local_userYES allow_writeable_chrootYES write_enableYES local_umask02…

leetcode:77. 組合

學習要點 學習回溯思想&#xff0c;學習回溯技巧&#xff1b;大家應當先看一下下面這幾道題 leetcode&#xff1a;46. 全排列-CSDN博客leetcode&#xff1a;78. 子集-CSDN博客leetcode&#xff1a;90. 子集 II-CSDN博客 題目鏈接 77. 組合 - 力扣&#xff08;LeetCode&#x…

自定義主題,echarts系列嵌套

自定義主題&#xff0c;echarts系列嵌套&#xff0c;完善map地圖系列與lines系列拋物線 自定義主題開發設計&#xff08;如傳感器數據可視化&#xff09; 1.使用typetreemap自定義 TreeMap 主題&#xff08;矩形樹圖系列&#xff09; 2.在矩形樹圖中畫typelines動態連線和typee…

速度與精度的結合:Faster R-CNN模型的性能剖析

目標檢測作為計算機視覺領域的核心問題之一&#xff0c;其重要性隨著深度學習技術的發展而日益凸顯。本文深入探討了基于深度學習的Faster R-CNN模型&#xff0c;這是一種革命性的目標檢測框架&#xff0c;它通過引入區域提議網絡&#xff08;Region Proposal Network, RPN&…

計算機網絡--期末速通版

以下總結提綱來自于hcgg&#xff0c;偉大無需多言。socket編程沒有寫進去&#xff0c;Rdt的話我后來感覺可能只考概念&#xff0c;其余我感覺會考的部分都在里面了&#xff0c;如果有錯誤或者解釋不清楚造成的疑問&#xff0c;希望大家及時指正&#xff0c;感謝。 應用層 DNS…

AI浪潮拐點:MCP與A2A協議如何重塑AI智能體協作生態

一、AI技術演進的必然拐點:從單機智能到群體協作 當AI技術從單模型推理邁向復雜系統協作,MCP(模型協作協議)與A2A(智能體間協作協議)的誕生標志著產業變革的關鍵轉折點。這一演進并非偶然,而是技術發展與社會需求雙重驅動的必然結果。 從技術脈絡看,AI正經歷從"…