Python进阶--下载想要的格言(基于格言网的Python爬虫程序)

 注:由于上篇帖子(Python进阶--爬取下载人生格言(基于格言网的Python3爬虫)-CSDN博客)篇幅长度的限制,此篇帖子对上篇做一个拓展延伸。 

目录

一、爬取格言网中想要内容的url

1、找到想要的内容

2、抓包分析,找到想要内容的url

3、改写爬虫代码

二、输入想要的内容即可下载到本地

1、抓包分析

2、具备上一页和下一页的正常目录页下载内容代码

3、只具备下一页的非正常目录页下载内容代码

4、针对以上情况都适用的完整代码


一、爬取格言网中想要内容的url

1、找到想要的内容

        在格言网中,里面包含大量类型的格言、经典语录、句子、对联、成语等内容。上篇帖子仅仅只是爬取了人生格言这一部分,如果想要爬取下载其他内容,只需要将上篇帖子的全部代码中的url方面的代码做一个修改,即可爬取你想要的内容。

查看格言网的所有类型的内容步骤如下:

1、打开格言网首页(http://www.mouxiao.com/)

2、往下翻找到栏目导航

3、此部分就是格言网所有类型的内容

注:格言网中其他部分的内容都是此部分的子节点

2、抓包分析,找到想要内容的url

        根据上篇帖子抓包分析的方式,在此处继续根据此方式进行抓包分析,定位到想要内容的url。

        此处,定位到想要内容的url。(开心!!!)

3、改写爬虫代码

        思路:将想要内容的url赋给上篇博客代码中的url部分即可   

上篇帖子中的所有代码:

import re
import requests
from lxml import etree
# 获取user-agent,用于身份识别
header = {'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Mobile Safari/537.36'}
# 1、获取具体格言内容和标题
# 封装成一个函数,输入具体人生格言页的地址,获取其具体的人生格言和标题
def get_content(url):
    # 请求当前网页的源代码
    r = requests.get(url,headers=header)
    # 拒绝requests的自动编码,保留源代码
    r.encoding = r.apparent_encoding
    # 解析源代码提取具体格言内容和标题
    # 获取网页源代码
    html = etree.HTML(r.text)
    # 获取格言内容
    content = html.xpath('//div[@class="maike"]/p[@class="p"]/text()')
    # 使用 join() 方法将列表中的元素用换行符连接起来
    content = '\n'.join(content)
    # 获取标题
    title = html.xpath('//div[@class="maike"]/h1[@class="title_l"]/text()')[0]
    # 返回标题和内容
    return title,content
# 当前页面
index_url = 'http://www.mouxiao.com/renshenggeyan/index.html'
# 2、获取各种类型的人生格言链接并下载其具体人生格言内容和标题
# 输入当前人生格言的目录页地址,获取各种类型的人生格言链接并下载其具体人生格言内容和标题
def pageupload_play(index_url):
    # 请求当前网页的源代码
    r = requests.get(index_url,headers=header)
    # 由于requests模块会将获取的网页源代码进行自动编码,此处我们不需要编码。
    # 故采用apparent_encoding方法,禁止requests模块自动编码。
    r.encoding = r.apparent_encoding
    # 采用xpath的方式定位获取链接所在位置
    html = etree.HTML(r.text)
    links = html.xpath('//ul[@class="readers-list"]//a/@href')
    # 要匹配所有以数字开头,后面跟 '.html' 的元素,可以遍历列表
    matched_links = []
    for link in links:
        # 采用正则表达式筛选出我们所需要的链接,将其保存到matched_links中
        if re.findall(r'^\d+\.html', link):
            matched_links.append(link)
    # 遍历每个类型人生格言的具体人生格言内容和标题,对其进行下载
    for link in matched_links:
        # link中获取的链接是相对地址,需要补全前面的地址
        link1 = 'http://www.mouxiao.com/renshenggeyan/'+link
        # 调用get_content方法下载内容和标题并保存到本地
        title, content = get_content(link1)
        with open(f'格言/{title}.txt','w',encoding='utf-8') as f:
            f.write('\t'+title + '\n\n')
            f.write(content)
            print(f'已下载...{title}')
# 3、获取下一页的地址
# 封装成一个函数,输入当前页面的url,返回下一页的url
def get_nextpage(url):
    #请求当前网页的源代码
    r = requests.get(url, headers=header)
    # 拒绝requests的自动编码,保留源代码
    r.encoding = r.apparent_encoding
    # 定位到下一页的url地址
    html = etree.HTML(r.text)
    next_page = html.xpath('//div[@class="maike"]//p[@class="p"]//a/@href')[3]
    # 因为所获取的下一页地址是相对地址,故进行补全
    next_page = 'http://www.mouxiao.com/renshenggeyan/'+ next_page
    # 如果下一页地址和当前页地址不相等,则将下一页地址返回
    if next_page != url:
        return next_page
# 4、将以上函数排放好顺序进行调用,下载人生格言的全部内容及标题
n = 1
while 1:
    print(f"正在下载第{n}页...")
    print("下载地址为:"+index_url)
    pageupload_play(index_url)
    page = get_nextpage(index_url)
    index_url = page
    if index_url==None:
        break
    n+=1

   此处以爬取励志格言为例,只需要将上面部分代码中的url改为励志格言的url即可。

代码如下:

import re
import requests
from lxml import etree
# 获取user-agent,用于身份识别
header = {'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Mobile Safari/537.36'}
# 1、获取具体格言内容和标题
# 封装成一个函数,输入具体人生格言页的地址,获取其具体的人生格言和标题
def get_content(url):
    # 请求当前网页的源代码
    r = requests.get(url,headers=header)
    # 拒绝requests的自动编码,保留源代码
    r.encoding = r.apparent_encoding
    # 解析源代码提取具体格言内容和标题
    # 获取网页源代码
    html = etree.HTML(r.text)
    # 获取格言内容
    content = html.xpath('//div[@class="maike"]/p[@class="p"]/text()')
    # 使用 join() 方法将列表中的元素用换行符连接起来
    content = '\n'.join(content)
    # 获取标题
    title = html.xpath('//div[@class="maike"]/h1[@class="title_l"]/text()')[0]
    # 返回标题和内容
    return title,content
# 当前页面
index_url = 'http://www.mouxiao.com/lizhimingyan/index.html'
# 2、获取各种类型的人生格言链接并下载其具体人生格言内容和标题
# 输入当前人生格言的目录页地址,获取各种类型的人生格言链接并下载其具体人生格言内容和标题
def pageupload_play(index_url):
    # 请求当前网页的源代码
    r = requests.get(index_url,headers=header)
    # 由于requests模块会将获取的网页源代码进行自动编码,此处我们不需要编码。
    # 故采用apparent_encoding方法,禁止requests模块自动编码。
    r.encoding = r.apparent_encoding
    # 采用xpath的方式定位获取链接所在位置
    html = etree.HTML(r.text)
    links = html.xpath('//ul[@class="readers-list"]//a/@href')
    # 要匹配所有以数字开头,后面跟 '.html' 的元素,可以遍历列表
    matched_links = []
    for link in links:
        # 采用正则表达式筛选出我们所需要的链接,将其保存到matched_links中
        if re.findall(r'^\d+\.html', link):
            matched_links.append(link)
    # 遍历每个类型人生格言的具体人生格言内容和标题,对其进行下载
    for link in matched_links:
        # link中获取的链接是相对地址,需要补全前面的地址
        link1 = 'http://www.mouxiao.com/lizhimingyan/'+link
        # 调用get_content方法下载内容和标题并保存到本地
        title, content = get_content(link1)
        with open(f'励志格言/{title}.txt','w',encoding='utf-8') as f:
            f.write('\t'+title + '\n\n')
            f.write(content)
            print(f'已下载...{title}')
# 3、获取下一页的地址
# 封装成一个函数,输入当前页面的url,返回下一页的url
def get_nextpage(url):
    #请求当前网页的源代码
    r = requests.get(url, headers=header)
    # 拒绝requests的自动编码,保留源代码
    r.encoding = r.apparent_encoding
    # 定位到下一页的url地址
    html = etree.HTML(r.text)
    next_page = html.xpath('//div[@class="maike"]//p[@class="p"]//a/@href')[3]
    # 因为所获取的下一页地址是相对地址,故进行补全
    next_page = 'http://www.mouxiao.com/lizhimingyan/'+ next_page
    # 如果下一页地址和当前页地址不相等,则将下一页地址返回
    if next_page != url:
        return next_page
# 4、将以上函数排放好顺序进行调用,下载人生格言的全部内容及标题
n = 1
while 1:
    print(f"正在下载第{n}页...")
    print("下载地址为:"+index_url)
    pageupload_play(index_url)
    page = get_nextpage(index_url)
    index_url = page
    if index_url==None:
        break
    n+=1

二、输入想要的内容即可下载到本地

1、抓包分析

        根据上面的抓包分析,可知栏目导航部分内容的url如下图所示:

  根据以上情况,可以分析得出:

  • 栏目导航的链接地址是以下构造
    http://www.mouxiao.com/{你想要的内容的中文拼音}
    注:好书推荐为book,不为中文拼音:haoshutuijian
    

       注:/index.html或者/index-数字.html或者数字.html是属于子页节点,它被包括在以上url的地址中。(此处我们只要找到父页节点,即可访问到其子页节点)

        思路:想要通过输入想要的内容来下载,则可以通过读取键盘消息,来填充此部分内容的url。

        点击栏目导航中所有部分的类型链接跳转到其目录页,查看其目录页的布局情况。据此发现: 

  • 如果要下载的某个内容的目录页只有下一页选项的情况,其获取下一页的所在源代码的链接位置有所改变,获取下一页的链接地址的代码需要做相应修改。

  • 正常的网页应具备上一页和下一页,这样下一页的url位置不会改变,可以适用上篇帖子获取下一页的函数代码 

2、具备上一页和下一页的正常目录页下载内容代码

        具备上一页和下一页的正常目录页下载的代码为:

import os
import re
import requests
from lxml import etree
# 获取user-agent,用于身份识别
header = {'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Mobile Safari/537.36'}
# 1、获取具体格言内容和标题
# 封装成一个函数,输入具体人生格言页的地址,获取其具体的人生格言和标题
def get_content(url):
    # 请求当前网页的源代码
    r = requests.get(url,headers=header)
    # 拒绝requests的自动编码,保留源代码
    r.encoding = r.apparent_encoding
    # 解析源代码提取具体格言内容和标题
    # 获取网页源代码
    html = etree.HTML(r.text)
    # 获取格言内容
    content = html.xpath('//div[@class="maike"]/p[@class="p"]/text()')
    # 使用 join() 方法将列表中的元素用换行符连接起来
    content = '\n'.join(content)
    # 获取标题
    title = html.xpath('//div[@class="maike"]/h1[@class="title_l"]/text()')[0]
    # 返回标题和内容
    return title,content
# 当前页面
keyword = input("情输入你想要的内容(拼音):")
index_url = f'http://www.mouxiao.com/{keyword}'
regular_part = f'http://www.mouxiao.com/{keyword}/'
dictionary = f'../{keyword}'
os.makedirs(dictionary, exist_ok=True)
# 2、获取各种类型的人生格言链接并下载其具体人生格言内容和标题
# 输入当前人生格言的目录页地址,获取各种类型的人生格言链接并下载其具体人生格言内容和标题
def pageupload_play(index_url):
    # 请求当前网页的源代码
    r = requests.get(index_url,headers=header)
    # 由于requests模块会将获取的网页源代码进行自动编码,此处我们不需要编码。
    # 故采用apparent_encoding方法,禁止requests模块自动编码。
    r.encoding = r.apparent_encoding
    # 采用xpath的方式定位获取链接所在位置
    html = etree.HTML(r.text)
    links = html.xpath('//ul[@class="readers-list"]//a/@href')
    # 要匹配所有以数字开头,后面跟 '.html' 的元素,可以遍历列表
    matched_links = []
    for link in links:
        # 采用正则表达式筛选出我们所需要的链接,将其保存到matched_links中
        if re.findall(r'^\d+\.html', link):
            matched_links.append(link)
    # 遍历每个类型人生格言的具体人生格言内容和标题,对其进行下载
    for link in matched_links:
        # link中获取的链接是相对地址,需要补全前面的地址
        link1 = regular_part+link
        # 调用get_content方法下载内容和标题并保存到本地
        title, content = get_content(link1)
        with open(f'../{keyword}/{title}.txt','w',encoding='utf-8') as f:
            f.write('\t'+title + '\n\n')
            f.write(content)
            print(f'已下载...{title}')
# 3、获取下一页的地址
# 封装成一个函数,输入当前页面的url,返回下一页的url
def get_nextpage(url):
    #请求当前网页的源代码
    r = requests.get(url, headers=header)
    # 拒绝requests的自动编码,保留源代码
    r.encoding = r.apparent_encoding
    # 定位到下一页的url地址
    html = etree.HTML(r.text)
    next_page = html.xpath('//div[@class="maike"]//p[@class="p"]//a/@href')[3]
    # 因为所获取的下一页地址是相对地址,故进行补全
    next_page = regular_part+ next_page
    # 如果下一页地址和当前页地址不相等,则将下一页地址返回
    if next_page != url:
        return next_page
# 4、将以上函数排放好顺序进行调用,下载人生格言的全部内容及标题
n = 1
while 1:
    print(f"正在下载第{n}页...")
    print("下载地址为:"+index_url)
    pageupload_play(index_url)
    page = get_nextpage(index_url)
    index_url = page
    if index_url==None:
        break
    n+=1

        输入你想要的内容,即可下载获得!!!

3、只具备下一页的非正常目录页下载内容代码

        这种情况下,下一页所在的源代码的url位置发生了变化,抓包分析出此时下一页url所在位置,修改这部分代码即可。

注:

  • 在调试的时候发现,这种情况下在处于最后一页时,没有下一页的选项反而出现上一页的选项,且上一页选项的链接所在源代码的位置与下一页选项的链接所在源代码的位置一致。
  •  在正常页面中,处于最后一页时,上一页和下一页选项仍然出现,且链接所在位置都没有发生改变,下一页的链接地址与当前页面的链接地址一致。

        基于以上情况,返回下一页url时需要使用不同的条件。

代码如下:

import os
import re
import requests
from lxml import etree
# 获取user-agent,用于身份识别
header = {'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Mobile Safari/537.36'}
# 1、获取具体格言内容和标题
# 封装成一个函数,输入具体人生格言页的地址,获取其具体的人生格言和标题
def get_content(url):
    # 请求当前网页的源代码
    r = requests.get(url,headers=header)
    # 拒绝requests的自动编码,保留源代码
    r.encoding = r.apparent_encoding
    # 解析源代码提取具体格言内容和标题
    # 获取网页源代码
    html = etree.HTML(r.text)
    # 获取格言内容
    content = html.xpath('//div[@class="maike"]/p[@class="p"]/text()')
    # 使用 join() 方法将列表中的元素用换行符连接起来
    content = '\n'.join(content)
    # 获取标题
    title = html.xpath('//div[@class="maike"]/h1[@class="title_l"]/text()')[0]
    # 返回标题和内容
    return title,content
# 当前页面
keyword = input("情输入你想要的内容(拼音):")
index_url = f'http://www.mouxiao.com/{keyword}'
regular_part = f'http://www.mouxiao.com/{keyword}/'
dictionary = f'../{keyword}'
os.makedirs(dictionary, exist_ok=True)
# 2、获取各种类型的人生格言链接并下载其具体人生格言内容和标题
# 输入当前人生格言的目录页地址,获取各种类型的人生格言链接并下载其具体人生格言内容和标题
def pageupload_play(index_url):
    # 请求当前网页的源代码
    r = requests.get(index_url,headers=header)
    # 由于requests模块会将获取的网页源代码进行自动编码,此处我们不需要编码。
    # 故采用apparent_encoding方法,禁止requests模块自动编码。
    r.encoding = r.apparent_encoding
    # 采用xpath的方式定位获取链接所在位置
    html = etree.HTML(r.text)
    links = html.xpath('//ul[@class="readers-list"]//a/@href')
    # 要匹配所有以数字开头,后面跟 '.html' 的元素,可以遍历列表
    matched_links = []
    for link in links:
        # 采用正则表达式筛选出我们所需要的链接,将其保存到matched_links中
        if re.findall(r'^\d+\.html', link):
            matched_links.append(link)
    # 遍历每个类型人生格言的具体人生格言内容和标题,对其进行下载
    for link in matched_links:
        # link中获取的链接是相对地址,需要补全前面的地址
        link1 = regular_part+link
        # 调用get_content方法下载内容和标题并保存到本地
        title, content = get_content(link1)
        with open(f'../{keyword}/{title}.txt','w',encoding='utf-8') as f:
            f.write('\t'+title + '\n\n')
            f.write(content)
            print(f'已下载...{title}')
# 3、获取下一页的地址
# 封装成一个函数,输入当前页面的url,返回下一页的url
def get_nextpage(url):
    #请求当前网页的源代码
    r = requests.get(url, headers=header)
    # 拒绝requests的自动编码,保留源代码
    r.encoding = r.apparent_encoding
    # 定位到下一页的url地址
    html = etree.HTML(r.text)
    next_page = html.xpath('//div[@class="maike"]//p[@class="p"]//a[text()="下一页"]/@href')
    if len(next_page)==0:
        return
    # 因为所获取的下一页地址是相对地址,故进行补全
    next_page = regular_part + ''.join(next_page)
    return next_page
    # 如果下一页地址和当前页地址不相等,则将下一页地址返回
# 4、将以上函数排放好顺序进行调用,下载人生格言的全部内容及标题
n = 1
while 1:
    print(f"正在下载第{n}页...")
    print("下载地址为:"+index_url)
    pageupload_play(index_url)
    page = get_nextpage(index_url)
    index_url = page
    if index_url==None:
        break
    n+=1

4、针对以上情况都适用的完整代码

        将以上两种情况用if语句做一个判断,即可。完整代码如下:

import os
import re
import requests
from lxml import etree
# 获取user-agent,用于身份识别
header = {'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Mobile Safari/537.36'}
# 1、获取具体格言内容和标题
# 封装成一个函数,输入具体人生格言页的地址,获取其具体的人生格言和标题
def get_content(url):
    # 请求当前网页的源代码
    r = requests.get(url,headers=header)
    # 拒绝requests的自动编码,保留源代码
    r.encoding = r.apparent_encoding
    # 解析源代码提取具体格言内容和标题
    # 获取网页源代码
    html = etree.HTML(r.text)
    # 获取格言内容
    content = html.xpath('//div[@class="maike"]/p[@class="p"]/text()')
    # 使用 join() 方法将列表中的元素用换行符连接起来
    content = '\n'.join(content)
    # 获取标题
    title = html.xpath('//div[@class="maike"]/h1[@class="title_l"]/text()')[0]
    # 返回标题和内容
    return title,content
# 当前页面
keyword = input("情输入你想要的内容(拼音):")
index_url = f'http://www.mouxiao.com/{keyword}'
regular_part = f'http://www.mouxiao.com/{keyword}/'
dictionary = f'../{keyword}'
os.makedirs(dictionary, exist_ok=True)
# 2、获取各种类型的人生格言链接并下载其具体人生格言内容和标题
# 输入当前人生格言的目录页地址,获取各种类型的人生格言链接并下载其具体人生格言内容和标题
def pageupload_play(index_url):
    # 请求当前网页的源代码
    r = requests.get(index_url,headers=header)
    # 由于requests模块会将获取的网页源代码进行自动编码,此处我们不需要编码。
    # 故采用apparent_encoding方法,禁止requests模块自动编码。
    r.encoding = r.apparent_encoding
    # 采用xpath的方式定位获取链接所在位置
    html = etree.HTML(r.text)
    links = html.xpath('//ul[@class="readers-list"]//a/@href')
    # 要匹配所有以数字开头,后面跟 '.html' 的元素,可以遍历列表
    matched_links = []
    for link in links:
        # 采用正则表达式筛选出我们所需要的链接,将其保存到matched_links中
        if re.findall(r'^\d+\.html', link):
            matched_links.append(link)
    # 遍历每个类型人生格言的具体人生格言内容和标题,对其进行下载
    for link in matched_links:
        # link中获取的链接是相对地址,需要补全前面的地址
        link1 = regular_part+link
        # 调用get_content方法下载内容和标题并保存到本地
        title, content = get_content(link1)
        with open(f'../{keyword}/{title}.txt','w',encoding='utf-8') as f:
            f.write('\t'+title + '\n\n')
            f.write(content)
            print(f'已下载...{title}')
# 3、获取下一页的地址
# 封装成一个函数,输入当前页面的url,返回下一页的url
def get_nextpage(url):
    #请求当前网页的源代码
    r = requests.get(url, headers=header)
    # 拒绝requests的自动编码,保留源代码
    r.encoding = r.apparent_encoding
    # 定位到下一页的url地址
    html = etree.HTML(r.text)
    next_page = html.xpath('//div[@class="maike"]//p[@class="p"]//a/@href')
    # 如果是具有上一页和下一页的正常目录页面
    if len(next_page) > 2:
        next_page = next_page[3]
        next_page = regular_part + next_page
        if next_page != url:
            return next_page
    # 如果只有下一页的目录页面
    else:
        next_page = html.xpath('//div[@class="maike"]//p[@class="p"]//a[text()="下一页"]/@href')
        if len(next_page)==0:
            return
        next_page = regular_part + ''.join(next_page)
        return next_page
n = 1
while 1:
    print(f"正在下载第{n}页...")
    print("下载地址为:"+index_url)
    pageupload_play(index_url)
    page = get_nextpage(index_url)
    index_url = page
    if index_url==None:
        break
    n+=1

 运行以上代码需要注意的地方:

  • 造句大全和成语大全,需要输入的是zaoju和fanwen。而不是zaojudaquan和chengyudaquan

  • 英语角和道德经的目录页布局跟其他内容的目录页布局不同,内容和所在标签都不是跟以上情况处于网页源代码的相同位置。如果需要爬取则需根据上篇贴子进行抓包分析,修改其相应代码即可。
  • 书评的页面布局与以上布局类似,但所有的内容在网页源代码的的位置与以上情况有所不同。如果需要爬取,需要抓包分析修改其xpath所定位到的部分。

注:本帖只用于学习交流,禁止商用! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/376297.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Netty源码系列 之 bind绑定流程 源码

Netty框架总览 Netty是一个基于NIO异步通信框架 Netty框架是由许多组件,优化的数据结构所构建成。 正是通过灵活的组件构建,优化后的数据结构,进而才能保证Netty框架面对高并发场景具有一定的能力 Netty相关组件 Netty重要的组件有&…

代码随想录算法训练营DAY14 | 二叉树 (1)

一、二叉树理论基础 1.存储方式 链式存储: 顺序存储: 2.二叉树标准定义(Java) public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val val; }TreeNode(int val, TreeNode left, TreeNode right) {…

spring cloud stream

背景 主要解决不同消息中间件切换问题。实现不同中间件的代码解耦。 链接: 支持的中间件 后文使用kafka测试。 引入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-stream</artifactId></depende…

微服务介绍、使用 Nacos 实现远程调用以及 OpenFeign 的使用

1 微服务的概念 区别于单体项目 单体项目拆分成微服务项目的目标&#xff1a;高内聚、低耦合 拆分思路 纵向拆分&#xff1a;根据功能模块 横向拆分&#xff1a;抽取可复用模块 2 微服务拆分——远程调用 背景&#xff1a;微服务单一职责&#xff0c;每个服务只有自己的功能…

电脑没有声音是怎么回事?几招快速解决

当电脑突然失去声音&#xff0c;这可能成为一种令人烦恼的体验&#xff0c;尤其是在你期望享受音乐、观看视频或进行在线会议的时候。幸运的是&#xff0c;大多数时候&#xff0c;电脑没有声音的问题是可以迅速解决的。电脑没有声音是怎么回事&#xff1f;本文将为你介绍一些常…

老是抓不准现货白银实时报价怎么办?

现货白银的实时报价是不断变动的&#xff0c;投资者要了解当下的现货白银实时走势&#xff0c;并且依靠对实时报价的分析预判未来的趋势&#xff0c;这是不容易的&#xff0c;但是不是不能做到呢&#xff1f;也不是。因为市场不是横盘就是趋势&#xff0c;只要有趋势&#xff0…

零代码3D可视化快速开发平台

老子云平台 老子云3D可视化快速开发平台&#xff0c;集云压缩、云烘焙、云存储云展示于一体&#xff0c;使3D模型资源自动输出至移动端PC端、Web端&#xff0c;能在多设备、全平台进行展示和交互&#xff0c;是全球领先、自主可控的自动化3D云引擎。此技术已经在全球申请了专利…

.NET Avalonia开源、免费的桌面UI库 - SukiUI

前言 今天分享一款.NET Avalonia基于MIT License协议开源、免费的桌面UI库&#xff1a;SukiUI。 Avalonia介绍 Avalonia是一个强大的框架&#xff0c;使开发人员能够使用.NET创建跨平台应用程序。它使用自己的渲染引擎绘制UI控件&#xff0c;确保在Windows、macOS、Linux、An…

用云手机打造tiktok账号需要注意些什么?

随着tiktok平台的火热&#xff0c;越来越多的商家开始尝试更高效的tiktok运营方法。其中&#xff0c;tiktok云手机作为一种新科技引起了很多人的注意&#xff0c;那么用云手机运营tiktok需要注意些什么&#xff1f;下文将对此进行详细解析。 1. 不是所有的云手机都适合做tiktok…

跳过mysql密码并重置密码 shell脚本

脚本 目前只是验证了5.7 版本是可以的&#xff0c;8.多的还需要验证 以下是一个简单的Shell脚本&#xff0c;用于跳过MySQL密码设置并重置密码&#xff1a; #!/bin/bash yum install psmisc -y# 停止MySQL服务 sudo service mysqld stop# 跳过密码验证 sudo mysqld --skip-g…

通过 docker-compose 部署 Flink

概要 通过 docker-compose 以 Session Mode 部署 flink 前置依赖 Docker、docker-composeflink 客户端docker-compose.yml version: "2.2" services:jobmanager:image: flink:1.17.2ports:- "8081:8081"command: jobmanagervolumes:- ${PWD}/checkpoin…

分析伦敦银报价总失败?你试试这样

做伦敦银交易的投资者要先对伦敦银报价进行分析&#xff0c;但是有些投资者反映自己分析伦敦银报价总是失败&#xff0c;抓不住市场价格的变化趋势&#xff0c;为什么会这样呢&#xff1f;我们可以从以下这两个方面来考虑。 转变分析工具。为什么分析伦敦银报价总失败&#xff…

提升你的PHP开发效率:探索JetBrains PhpStorm 2022的全新特性

在当今快速发展的软件开发领域&#xff0c;选择一个强大且高效的开发工具对于提升开发效率、保证代码质量至关重要。对于PHP开发者来说&#xff0c;JetBrains PhpStorm一直是市场上最受欢迎的IDE之一。随着JetBrains PhpStorm 2022的发布&#xff0c;这款工具带来了一系列创新功…

蓝桥杯-求阶乘-python

问题描述 满足N!的末尾恰好有K个0的最小的N是多少&#xff1f; 如果这样的N不存在输出一1。 思路解析 末尾的0是由10产生的&#xff0c;而10是由质数2和5产生的 在求阶乘的过程中&#xff0c;只要是偶数就会有2&#xff0c;而5相对2更少&#xff0c;所以对于10的数量我们可以…

机器学习-梯度下降法

不是一个机器学习算法是一种基于搜索的最优化方法作用&#xff1a;最小化一个损失函数梯度上升法&#xff1a;最大化一个效用函数 并不是所有函数都有唯一的极值点 解决方法&#xff1a; 多次运行&#xff0c;随机化初始点梯度下降法的初始点也是一个超参数 代码演示 impor…

手势检测跟踪解决方案

美摄科技&#xff0c;作为业界领先的人工智能技术提供商&#xff0c;致力于为企业提供先进的手势检测与跟踪解决方案&#xff0c;以推动企业在智能化、高效化的道路上阔步前行。 一、手势检测与跟踪技术的优势 手势检测与跟踪技术作为人机交互的重要一环&#xff0c;具有以下…

视频无损放大修复工具Topaz Video AI 新手入门教程

想要自学Topaz Video AI &#xff1f;Topaz Video AI 如何使用&#xff1f;这里给大家带来了视频无损放大修复工具Topaz Video AI 新手入门教程&#xff0c;快来看看吧&#xff01; 下载&#xff1a;Topaz Video AI for mac 导入您的文件 有两种方法可以将文件导入 Topaz Vid…

《乱弹篇(十一)过年与心灵鸡汤》

快过年了&#xff0c;为了不使一些网站感到为难&#xff0c;也让笔者绕开“敏感词”&#xff0c;营造一个眼不见心不烦&#xff0c;双方都能接受的安宁清静的好心境&#xff0c;今天本“人民体验”推广人民日报官方微博文化产品《夜读&#xff1a;快过年了&#xff0c;这三句话…

每日一练:LeeCode-112、路径总和【二叉树+DFS+回溯】

本文是力扣LeeCode-112、路径总和 学习与理解过程&#xff0c;本文仅做学习之用&#xff0c;对本题感兴趣的小伙伴可以出门左拐LeeCode。 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有…

CSS太极动态图

CSS太极动态图 1. 案例效果 我们今天学习用HTML和CSS实现动态的太极&#xff0c;看一下效果。 2. 分析思路 太极图是由两个旋转的圆组成&#xff0c;一个是黑圆&#xff0c;一个是白圆。实现现原理是使用CSS的动画和渐变背景属性。 首先&#xff0c;为所有元素设置默认值为0…