Python3爬取淘宝网商品数据__m_h5_tk-程序员宅基地

技术标签: 淘宝网数据爬取  python3  爬虫  python3爬取淘宝网  Python  Python3爬虫  

前言

在这里我就不再一一介绍每个步骤的具体操作了,因为在上一次爬取今日头条数据的时候都已经讲的非常清楚了,所以在这里我只会在重点上讲述这个是这么实现的,如果想要看具体步骤请先去看我今日头条的文章内容,里面有非常详细的介绍以及是怎么找到加密js代码和api接口。

Python3爬取今日头条文章视频数据,完美解决as、cp、_signature的加密方法

QQ群聊

855262907

分析淘宝网

这次选择的是淘宝网热卖而不是淘宝网,二者虽然名字有不同,但是数据还是一样的,区别就在于前者把后者的所有店铺和商品的海量数据按照销售量、好评度、信誉度综合测评、重新计算、重新排序展现给买家的一个导购网站。

找到准确数据:

在这里插入图片描述
请求参数对比:

在这里插入图片描述
在这里插入图片描述

jsv: 2.4.0
appKey: 12574478
t: 1597626852590
sign: 457c09a81147eb493d1f58ad6ab64d52
api: mtop.alimama.union.sem.landing.pc.items
v: 1.0
AntiCreep: true
dataType: jsonp
type: jsonp
ecode: 0
callback: mtopjsonp1
data: {"keyword":"女装","ppath":"","loc":"","minPrice":"","maxPrice":"","ismall":"","ship":"","itemAssurance":"","exchange7":"","custAssurance":"","b":"","clk1":"91a160066daf9f8b69646bd610341da7","pvoff":"","pageSize":"100","page":"","elemtid":"1","refpid":"mm_26632258_3504122_32538762","pid":"430673_1006","featureNames":"spGoldMedal,dsrDescribe,dsrDescribeGap,dsrService,dsrServiceGap,dsrDeliver, dsrDeliverGap","ac":"5TGcF6nyjHkCAXt4MaK1QH5c","wangwangid":"","catId":""}
jsv: 2.4.0
appKey: 12574478
t: 1597626856031
sign: 4a87f4308903ded469a1328275ded458
api: mtop.alimama.union.sem.landing.pc.items
v: 1.0
AntiCreep: true
dataType: jsonp
type: jsonp
ecode: 0
callback: mtopjsonp1
data: {"keyword":"女装","ppath":"","loc":"","minPrice":"","maxPrice":"","ismall":"","ship":"","itemAssurance":"","exchange7":"","custAssurance":"","b":"","clk1":"91a160066daf9f8b69646bd610341da7","pvoff":"","pageSize":"100","page":"","elemtid":"1","refpid":"mm_26632258_3504122_32538762","pid":"430673_1006","featureNames":"spGoldMedal,dsrDescribe,dsrDescribeGap,dsrService,dsrServiceGap,dsrDeliver, dsrDeliverGap","ac":"5TGcF6nyjHkCAXt4MaK1QH5c","wangwangid":"","catId":""}

发现请求数据有所改变的地方只有tsign以及data中的pageac,其他均没有发生改变,t参数明眼就能猜出是时间戳sign参数还得通过调试和阅读源码进行逆向分析。

解决t和sign参数

发现signt以及其他参数都在这里面构造的。

在这里插入图片描述
所以我们现在开始下断点调试这些参数,得出sign参数的构造过程。可以发现t就是当前时间戳,然后sign是由h(d.token + "&" + i + "&" + g + "&" + c.data)构成,d.tokenthis.options.token也就是cookie值中的_m_h5_tk参数的前部分,i时间戳g就是12574478c.data就是this.params.data

this.options.token = e4a0bbef377f5792e1852f92581f769c(参考值)

this.params.data = {"keyword":"女装","ppath":"","loc":"","minPrice":"","maxPrice":"","ismall":"","ship":"","itemAssurance":"","exchange7":"","custAssurance":"","b":"","clk1":"91a160066daf9f8b69646bd610341da7","pvoff":"","pageSize":"100","page":"","elemtid":"1","refpid":"mm_26632258_3504122_32538762","pid":"430673_1006","featureNames":"spGoldMedal,dsrDescribe,dsrDescribeGap,dsrService,dsrServiceGap,dsrDeliver, dsrDeliverGap","ac":"5TGcF6nyjHkCAXt4MaK1QH5c","wangwangid":"","catId":""}

在这里插入图片描述
h函数就是下图所示。

在这里插入图片描述

function h(a) {
    
     function b(a, b) {
    
         return a << b | a >>> 32 - b
     }
     function c(a, b) {
    
         var c, d, e, f, g;
         return e = 2147483648 & a,
         f = 2147483648 & b,
         c = 1073741824 & a,
         d = 1073741824 & b,
         g = (1073741823 & a) + (1073741823 & b),
         c & d ? 2147483648 ^ g ^ e ^ f : c | d ? 1073741824 & g ? 3221225472 ^ g ^ e ^ f : 1073741824 ^ g ^ e ^ f : g ^ e ^ f
     }
     function d(a, b, c) {
    
         return a & b | ~a & c
     }
     function e(a, b, c) {
    
         return a & c | b & ~c
     }
     function f(a, b, c) {
    
         return a ^ b ^ c
     }
     function g(a, b, c) {
    
         return b ^ (a | ~c)
     }
     function h(a, e, f, g, h, i, j) {
    
         return a = c(a, c(c(d(e, f, g), h), j)),
         c(b(a, i), e)
     }
     function i(a, d, f, g, h, i, j) {
    
         return a = c(a, c(c(e(d, f, g), h), j)),
         c(b(a, i), d)
     }
     function j(a, d, e, g, h, i, j) {
    
         return a = c(a, c(c(f(d, e, g), h), j)),
         c(b(a, i), d)
     }
     function k(a, d, e, f, h, i, j) {
    
         return a = c(a, c(c(g(d, e, f), h), j)),
         c(b(a, i), d)
     }
     function l(a) {
    
         for (var b, c = a.length, d = c + 8, e = (d - d % 64) / 64, f = 16 * (e + 1), g = new Array(f - 1), h = 0, i = 0; c > i; )
             b = (i - i % 4) / 4,
             h = i % 4 * 8,
             g[b] = g[b] | a.charCodeAt(i) << h,
             i++;
         return b = (i - i % 4) / 4,
         h = i % 4 * 8,
         g[b] = g[b] | 128 << h,
         g[f - 2] = c << 3,
         g[f - 1] = c >>> 29,
         g
     }
     function m(a) {
    
         var b, c, d = "", e = "";
         for (c = 0; 3 >= c; c++)
             b = a >>> 8 * c & 255,
             e = "0" + b.toString(16),
             d += e.substr(e.length - 2, 2);
         return d
     }
     function n(a) {
    
         a = a.replace(/\r\n/g, "\n");
         for (var b = "", c = 0; c < a.length; c++) {
    
             var d = a.charCodeAt(c);
             128 > d ? b += String.fromCharCode(d) : d > 127 && 2048 > d ? (b += String.fromCharCode(d >> 6 | 192),
             b += String.fromCharCode(63 & d | 128)) : (b += String.fromCharCode(d >> 12 | 224),
             b += String.fromCharCode(d >> 6 & 63 | 128),
             b += String.fromCharCode(63 & d | 128))
         }
         return b
     }
     var o, p, q, r, s, t, u, v, w, x = [], y = 7, z = 12, A = 17, B = 22, C = 5, D = 9, E = 14, F = 20, G = 4, H = 11, I = 16, J = 23, K = 6, L = 10, M = 15, N = 21;
     for (a = n(a),
     x = l(a),
     t = 1732584193,
     u = 4023233417,
     v = 2562383102,
     w = 271733878,
     o = 0; o < x.length; o += 16)
         p = t,
         q = u,
         r = v,
         s = w,
         t = h(t, u, v, w, x[o + 0], y, 3614090360),
         w = h(w, t, u, v, x[o + 1], z, 3905402710),
         v = h(v, w, t, u, x[o + 2], A, 606105819),
         u = h(u, v, w, t, x[o + 3], B, 3250441966),
         t = h(t, u, v, w, x[o + 4], y, 4118548399),
         w = h(w, t, u, v, x[o + 5], z, 1200080426),
         v = h(v, w, t, u, x[o + 6], A, 2821735955),
         u = h(u, v, w, t, x[o + 7], B, 4249261313),
         t = h(t, u, v, w, x[o + 8], y, 1770035416),
         w = h(w, t, u, v, x[o + 9], z, 2336552879),
         v = h(v, w, t, u, x[o + 10], A, 4294925233),
         u = h(u, v, w, t, x[o + 11], B, 2304563134),
         t = h(t, u, v, w, x[o + 12], y, 1804603682),
         w = h(w, t, u, v, x[o + 13], z, 4254626195),
         v = h(v, w, t, u, x[o + 14], A, 2792965006),
         u = h(u, v, w, t, x[o + 15], B, 1236535329),
         t = i(t, u, v, w, x[o + 1], C, 4129170786),
         w = i(w, t, u, v, x[o + 6], D, 3225465664),
         v = i(v, w, t, u, x[o + 11], E, 643717713),
         u = i(u, v, w, t, x[o + 0], F, 3921069994),
         t = i(t, u, v, w, x[o + 5], C, 3593408605),
         w = i(w, t, u, v, x[o + 10], D, 38016083),
         v = i(v, w, t, u, x[o + 15], E, 3634488961),
         u = i(u, v, w, t, x[o + 4], F, 3889429448),
         t = i(t, u, v, w, x[o + 9], C, 568446438),
         w = i(w, t, u, v, x[o + 14], D, 3275163606),
         v = i(v, w, t, u, x[o + 3], E, 4107603335),
         u = i(u, v, w, t, x[o + 8], F, 1163531501),
         t = i(t, u, v, w, x[o + 13], C, 2850285829),
         w = i(w, t, u, v, x[o + 2], D, 4243563512),
         v = i(v, w, t, u, x[o + 7], E, 1735328473),
         u = i(u, v, w, t, x[o + 12], F, 2368359562),
         t = j(t, u, v, w, x[o + 5], G, 4294588738),
         w = j(w, t, u, v, x[o + 8], H, 2272392833),
         v = j(v, w, t, u, x[o + 11], I, 1839030562),
         u = j(u, v, w, t, x[o + 14], J, 4259657740),
         t = j(t, u, v, w, x[o + 1], G, 2763975236),
         w = j(w, t, u, v, x[o + 4], H, 1272893353),
         v = j(v, w, t, u, x[o + 7], I, 4139469664),
         u = j(u, v, w, t, x[o + 10], J, 3200236656),
         t = j(t, u, v, w, x[o + 13], G, 681279174),
         w = j(w, t, u, v, x[o + 0], H, 3936430074),
         v = j(v, w, t, u, x[o + 3], I, 3572445317),
         u = j(u, v, w, t, x[o + 6], J, 76029189),
         t = j(t, u, v, w, x[o + 9], G, 3654602809),
         w = j(w, t, u, v, x[o + 12], H, 3873151461),
         v = j(v, w, t, u, x[o + 15], I, 530742520),
         u = j(u, v, w, t, x[o + 2], J, 3299628645),
         t = k(t, u, v, w, x[o + 0], K, 4096336452),
         w = k(w, t, u, v, x[o + 7], L, 1126891415),
         v = k(v, w, t, u, x[o + 14], M, 2878612391),
         u = k(u, v, w, t, x[o + 5], N, 4237533241),
         t = k(t, u, v, w, x[o + 12], K, 1700485571),
         w = k(w, t, u, v, x[o + 3], L, 2399980690),
         v = k(v, w, t, u, x[o + 10], M, 4293915773),
         u = k(u, v, w, t, x[o + 1], N, 2240044497),
         t = k(t, u, v, w, x[o + 8], K, 1873313359),
         w = k(w, t, u, v, x[o + 15], L, 4264355552),
         v = k(v, w, t, u, x[o + 6], M, 2734768916),
         u = k(u, v, w, t, x[o + 13], N, 1309151649),
         t = k(t, u, v, w, x[o + 4], K, 4149444226),
         w = k(w, t, u, v, x[o + 11], L, 3174756917),
         v = k(v, w, t, u, x[o + 2], M, 718787259),
         u = k(u, v, w, t, x[o + 9], N, 3951481745),
         t = c(t, p),
         u = c(u, q),
         v = c(v, r),
         w = c(w, s);
     var O = m(t) + m(u) + m(v) + m(w);
     return O.toLowerCase()
 }

发现这个h函数就是个md5加密方式,这样的话也就太容易了。

在这里插入图片描述
在这里插入图片描述

解决page和ac参数

page参数一看就知道是页数了,第一页为空,第二页为2,如:访问第一页时,page:"",访问第二页时,page:"2",后面以此类推。

ac参数就是我们cookie值中的cna参数值,cna参数值得访问网站获得https://log.mmstat.com/eg.js,获得
代码如下:

import requests

session = requests.Session()
headers = {
    
   'authority': 'log.mmstat.com',
   'method': 'GET',
   'path': '/eg.js',
   'scheme': 'https',
   'accept': '*/*',
   'accept-encoding': 'gzip, deflate, br',
   'accept-language': 'zh-CN,zh;q=0.9',
   'referer': "https://uland.taobao.com/sem/tbsearch?spm=a2e15.8261149.07626516003.1.7ab029b4ZS1aM4&refpid=mm_26632258_3504122_32538762&keyword=%E6%B7%98%E5%AE%9D&clk1=f1a5efd94339f0e6e7cba63ed79b8554&upsid=f1a5efd94339f0e6e7cba63ed79b8554&page=2&_input_charset=utf-8",
   'sec-fetch-dest': 'script',
   'sec-fetch-mode': 'no-cors',
   'sec-fetch-site': 'cross-site',
   'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
}
session.get('https://log.mmstat.com/eg.js', headers=headers)
print(session.cookies.get('cna'))

在这里插入图片描述

有人可能说我为什么会知道这些,因为我认真的分析了整个网站,这个部分的分析过程就不放出来了。

Python进行爬取

前面已经分析了整个网站了,废话不多说了,直接开始上开始上全代码了,复制过去就可以直接运行的代码,淘宝对每个结果最多只显示100页,所以这里也只有100页,如果你需要搜索的与我的不同自己直接修改即可。

import hashlib
import time
import requests
from urllib import parse
import json

class TaoBao():

    def __init__(self,keyword):
        self.keyword = keyword
        self.session = requests.Session()
        self.cookies = {
    }
        self.data = {
    }
        self.params = {
    }
        self.headers = {
    }
        for page in range(1,100+1):
            if page == 1:
                self.get_url()
                self.get_m_h5_tk()
                self.get_cna()
                self.get_data(page)
            else:
                self.get_data(page)

    def to_cookie(self):
        cookie = ''
        for key, value in self.cookies.items():
            if '_m_h5' in key or 'cna' == key:
                cookie += key + '=' + value + '; '
        return cookie

    def h(self,a):
        md5 = hashlib.md5()
        md5.update(a.encode())
        return md5.hexdigest()

    # 获取uland地址和clk1值
    def get_url(self):
        headers = {
    
            "Host":"redirect.simba.taobao.com",
            "Upgrade-Insecure-Requests":"1",
            "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36",
            "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
            "Accept-Encoding":"gzip, deflate",
            "Accept-Language":"zh-CN,zh;q=0.9",
            "Connection":"keep-alive"
        }
        url = 'http://redirect.simba.taobao.com/rd?c=un&w=unionsem&k=74175f13c74157df&p=mm_26632258_3504122_32538762&b=R9JQC0peugGMqgRlL5O&s={keyword}&f=https%3A%2F%2Fuland.taobao.com%2Fsem%2Ftbsearch%3Frefpid%3Dmm_26632258_3504122_32538762%26keyword{keywords}'.format(keyword=parse.quote(self.keyword),keywords=parse.quote(parse.quote('='+self.keyword)))
        response = self.session.get(url,headers=headers,allow_redirects=False)
        self.clk1 = response.headers.get('Location').split('&')[2]
        self.uland_url = response.headers.get('Location')

    # 获取_m_h5_tk和_m_h5_tk_enc
    def get_m_h5_tk(self):
        self.data = {
    
            "keyword": self.keyword,
            "ppath": "", "loc": "",
            "minPrice": "",
            "maxPrice": "",
            "ismall": "",
            "ship": "",
            "itemAssurance": "",
            "exchange7": "",
            "custAssurance": "",
            "b": "",
            "clk1": self.clk1,
            "pvoff": "",
            "pageSize": "100",
            "page": "",
            "elemtid": "1",
            "refpid": "mm_26632258_3504122_32538762",
            "pid": "430673_1006",
            "featureNames": "spGoldMedal,dsrDescribe,dsrDescribeGap,dsrService,dsrServiceGap,dsrDeliver, dsrDeliverGap",
            "ac": "",
            "wangwangid": "",
            "catId": ""
        }
        self.timestamp = str(time.time()).replace('.', '')[:13]
        self.params = {
    
            'jsv': '2.4.0',
            'appKey': '12574478',
            't': self.timestamp,
            'sign': self.h('undefined' + "&" + self.timestamp + "&" + '12574478' + "&" + json.dumps(self.data,ensure_ascii=False).replace(' ', '')),
            'api': 'mtop.alimama.union.sem.landing.pc.items',
            'v': '1.0',
            'AntiCreep': 'true',
            'dataType': 'jsonp',
            'type': 'jsonp',
            'ecode': '0',
            'callback': 'mtopjsonp1',
            'data': json.dumps(self.data, ensure_ascii=False).replace(' ', '')
        }
        self.headers = {
    
            'host': 'h5api.m.taobao.com',
            'accept': '*/*',
            'accept-encoding': 'gzip, deflate, br',
            'accept-language': 'zh-Hans-CN, zh-Hans; q=0.8, en-US; q=0.5, en; q=0.3',
            'referer': self.uland_url,
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36',
        }
        self.session.get('https://h5api.m.taobao.com' + '/h5/mtop.alimama.union.sem.landing.pc.items/1.0/?' + parse.urlencode(self.params), headers=self.headers)
        for key, value in self.session.cookies.items():
            self.cookies[key] = value
        self.token = self.cookies['_m_h5_tk'].split('_')[0]

    # 获取cna
    def get_cna(self):
        headers = {
    
            'authority': 'log.mmstat.com',
            'method': 'GET',
            'path': '/eg.js',
            'scheme': 'https',
            'accept': '*/*',
            'accept-encoding': 'gzip, deflate, br',
            'accept-language': 'zh-CN,zh;q=0.9',
            'referer': self.uland_url,
            'sec-fetch-dest': 'script',
            'sec-fetch-mode': 'no-cors',
            'sec-fetch-site': 'cross-site',
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
        }
        self.session.get('https://log.mmstat.com/eg.js', headers=headers)
        for key, value in self.session.cookies.items():
            self.cookies[key] = value

    # 获取数据
    def get_data(self, page):
        self.data['page'] = "" if page == 1 else page
        self.data['ac'] = "" if page == 1 else self.cookies.get('cna')
        self.timestamp = str(time.time()).replace('.', '')[:13]
        self.params['t'] = self.timestamp
        self.params['sign'] = self.h(self.token + "&" + self.timestamp + "&" + '12574478' + "&" + json.dumps(self.data,ensure_ascii=False).replace(' ',''))
        self.params['data'] = json.dumps(self.data, ensure_ascii=False).replace(' ', '')
        self.headers['cookie'] = self.to_cookie()
        response = self.session.get('https://h5api.m.taobao.com' + '/h5/mtop.alimama.union.sem.landing.pc.items/1.0/?' + parse.urlencode(self.params), headers=self.headers)
        json_data = json.loads(response.text.replace('mtopjsonp1(','').replace(')',''))
        print(json_data)

if __name__ == '__main__':
    TaoBao('男装')		# 搜索关键词

在这里插入图片描述

声明:本文仅供学习交流使用,请勿用于商业用途,违者后果自负。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42279077/article/details/108048697

智能推荐

echarts 显示下载按钮,echarts 自定义按钮,echarts 添加按钮-程序员宅基地

文章浏览阅读2.5k次。echarts 显示下载按钮,echarts 自定义按钮,echarts 添加按钮 &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&_echarts 图标上的下载按钮不能用

el-table表头添加图标_el table 表头加图片-程序员宅基地

文章浏览阅读149次。el-table的表头添加特殊内容。_el table 表头加图片

如何防止网页的背景图片重复 no-repeat_网页重复背景-程序员宅基地

文章浏览阅读1.2w次。(1)现在一般都用css设定了,比如在一个div下设背景图片切不让其重复,则可设一个样式,比如:.nobgrepeat{background:url(背景图片地址) left top no-repeat;}(2)也可以设置背景图片的高宽,要与背景图片的大小一样注意:但是有时候加了 no-repeate之后,图片就会不见了,这种情况与设置的 left _网页重复背景

计算机网络的性能指标以及相关计算_计算机网络数据率计算公式-程序员宅基地

文章浏览阅读1.5k次,点赞2次,收藏17次。用来表示网络的通信线路所能传送数据的能力,因此网络带宽表示在单位时间内从网络中的某一点到另一点所能通过的"最高数据率"单位和速率一样:b/s(kb/s,Mb/s,Gb/s);RTT计算公式:因为是从发送方发送完数据才开始计算的所以公式中并没有结点A的发送时延,但是有结点B的发送时延;结论:若主机在一段链路上连续不断的发送分组,则总时延为所有分组的发送时延+信号在这一段链路上的传播时延;吞吐量受网络的带宽或额定速率的限制;分组丢失率,是指在一定的时间范围内,传输过程中的丢失的分组数量与总分组数量的比率;_计算机网络数据率计算公式

012信息打点-Web应用&企业产权&指纹识别&域名资产&网络空间&威胁情报_资产指纹和应用-程序员宅基地

文章浏览阅读188次。针对各种应用的信息收集(Web网站、APP应用、PC应用、小程序应用、微信公众号等企业资产分五类:Web应用、APP应用、PC端应用、小程序应用、微信公众号、其他产品信息收集目标:某某企业、某某学校、网址、ip地址_资产指纹和应用

机器学习 - 随机森林手动10 折交叉验证-程序员宅基地

文章浏览阅读5.6k次,点赞3次,收藏36次。随机森林的 10 折交叉验证再回到之前的随机森林(希望还没忘记,机器学习算法-随机森林初探(1))library(randomForest)set.seed(304)rf1000 &..._随机森林交叉验证结果怎么看

随便推点

《QT从基础到进阶·三十五》QT插件实现侧边工具栏tabBar_qt侧面工具栏-程序员宅基地

文章浏览阅读655次,点赞3次,收藏4次。内部先拿到TabBar的dll转为QObject,再把QObject强转为TabBarPlugin对象,这是插件的使用方法,也可以直接new一个TabBarPlugin对象。四个小工具也是由插件实现,先拿到他们的对象,通过对象指针获取他们的界面,再把每个界面addWidget添加到标签栏中。(2)调换tabBar标签栏中所有界面的循序和删除小工具界面。(3)把tabBar标签栏中的小工具界面拖出来在放回去。3、现在可以对标签栏上的所有界面进行交互。(1)可以收缩和展开tabBar。_qt侧面工具栏

Microsoft Office LTSC 2021企业办公新标杆,稳定高效助力业务发展-程序员宅基地

文章浏览阅读267次,点赞4次,收藏10次。总的来说,Office套件的功能特色在于其强大的文档处理、数据分析、演示制作和邮件管理等功能,以及各应用程序之间的协同工作,能够极大地提高用户的工作效率。除了上述三个主要应用程序外,Office套件还包括其他应用程序,如Outlook、OneNote、Publisher和Access等,每个应用程序都有其独特的功能特色,满足用户在不同场景下的办公需求。Office是一款功能强大的办公软件套件,包含了多个应用程序,每个应用程序都有其独特的功能特色。

Elasticsearch--解决JVM 堆内存使用率很高的问题_elasticsearch8占用大量内存-程序员宅基地

文章浏览阅读2k次,点赞22次,收藏16次。本文介绍如何解决ES的JVM 堆内存使用率飙升的问题。_elasticsearch8占用大量内存

《Selenium 2 自动化测试实战》读书笔记_selenium2自动化测试实战-程序员宅基地

文章浏览阅读136次。最近在弄 appium,然后顺便发现了 Selenium 框架和这本书,恰好这本书也介绍了一些软件测试 & 自动化测试的理论知识,遂拿过来学习学习。所以本文几乎没有实践内容,大多都是概念和工具的 mark,后续若有实践,我会来补充的。_selenium2自动化测试实战

树莓派4B 与 stm32 通信_树莓派4b 与 stm32 采用usb-ttl通信-程序员宅基地

文章浏览阅读1.7w次,点赞33次,收藏486次。本文用来记录智能控制课设中的通信环节的实现硬件便是树莓派4Bstm32(我用的是正点原子的STM32F103ZET6的核心板)从头开始做的,带着你去从烧录树莓派,安装STM32的编译环境开始,直到二者成功通信。如何使用串口助手进行调试,以及如何通过代码进行通信。1.准备环节(树莓派已经烧录好镜像可以正常使用,stm32也已经装好keil5的同学可以略过)1.1 树莓派新买的树莓派4B一般TF卡没有烧入镜像(也就是树莓派的操作系统)官方推荐系统是以下三种32位Lite版(无桌面)32位桌面版_树莓派4b 与 stm32 采用usb-ttl通信

Ubuntu系统下JDK环境切换_ubuntu切换jdk-程序员宅基地

文章浏览阅读251次。请注意,如果系统上没有安装Java,你将看到一个类似"command not found"的错误信息,这意味着你需要先安装Java。如果你需要切换到一个新的Java版本,首先需要安装该版本。这将列出系统中已安装的Java版本,并要求你选择默认的Java版本。完成上述步骤后,你已经成功安装并配置了新的Java版本。如果需要切换回先前的Java版本或者安装其他版本,重复步骤2和步骤3即可。首先,我们需要检查系统上已安装的Java版本。接下来,需要配置系统使用新安装的Java版本。_ubuntu切换jdk