Selenium控制已运行的Edge和Chrome浏览器(详细启动步骤和bug记录)

文章目录

  • 前期准备
  • 1. 浏览器开启远程控制指令
    • (1)Edge
    • (2)Chrome
  • 2. 执行python代码
    • (1)先启动浏览器后执行代码
    • (2)通过代码启动浏览器
  • 3. 爬取效果
  • 3. 完整代码共享
    • 3.1 包含Excel部分的完整代码
    • 3.2 爬虫部分的完整代码

说明:本记录是在Windows系统上执行的!
起因是:博导要求统计一下国内某个领域的专家情况,统计主持国家自然科学基金的副教授和教授都有哪些大牛!
于是:本人去[NSFC]:https://kd.nsfc.cn/ 下载全部的历史基金项目书。。。。工作量太大就……半自动化实现吧!!!

前期准备

1. python Selenium库
2. Edge浏览器 或 Chrome浏览器

1. 浏览器开启远程控制指令

  1. 无论是哪种浏览器,都需要使用终端独立运行浏览器的远程调试模式。
  2. 开启方式:加入指令(–remote-debugging-port=9222 --user-data-dir=“D:\selenium\AutomationProfile”)

需要进入目标浏览器的根目录! 不然就输入全路径!

(1)Edge

.\msedge.exe --remote-debugging-port=9222 --user-data-dir=“D:\selenium\AutomationProfile”

(2)Chrome

 .\chrome.exe --remote-debugging-port=9222 --user-data-dir=“D:\selenium\AutomationProfile”

在这里插入图片描述

2. 执行python代码

(1)先启动浏览器后执行代码

  • 必须是先执行上述步骤,开启了浏览器的远程调试端口后,才能通过下方代码进行控制。

  • add_experimental_option("debuggerAddress", "127.0.0.1:9222") 这句话是关键!

from selenium import webdriver
from selenium.webdriver.edge.options import Options

class Test:
    def edge(self):
        edge_driver_path = executable_path=r'C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe'
        chrome_options = Options()
        # chrome_options.binary_location = edge_driver_path  #  传入驱动地址
        chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")  # "127.0.0.1:9222"其中,9222是浏览器的运行端口
        # 让浏览器带着这个配置运行
        # chrome_options.add_experimental_option('detach', True)  # 通过option参数,设置浏览器不关闭
        driver = webdriver.Edge(options=chrome_options, keep_alive=True)
        driver.implicitly_wait(10)  # 页面元素查找的等待时间
        self.driver = driver
        pass
        
    def chrome_drive(self, drive='chrome'):
        edge_driver_path = executable_path = r'D:\Program Files\Google\Chrome\Application'
        if drive == 'chrome':
            chrome_options = webdriver.ChromeOptions()
            # chrome_options.binary_location = edge_driver_path    #  传入驱动地址
            # chrome_options.add_experimental_option('detach', True)  # 通过option参数,设置浏览器不关闭
            chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
            driver = webdriver.Chrome(options=chrome_options, keep_alive=False)
            driver.implicitly_wait(10)  # 页面元素查找的等待时间
	        self.driver = driver
	        pass

(2)通过代码启动浏览器

  • 这个时候被注释掉的 .binary_location = edge_driver_path 是关键!
  • 这种情况下,需要下载对应的驱动软件(.exe)
  • 博主在笔记本电脑上首次尝试Selenium时就下载了驱动软件!但后来在台式电脑使用相同代码时发现,压根不需要下载什么驱动软件!
  • 只需要使用终端提前启动浏览器的调试模型即可。 (这是弯路、坑)
  • 因为,如果是通过代码启动浏览器的调试模型,需要配置路径,然后保证程序关闭后浏览器依旧运行!麻烦!!!

3. 爬取效果

![(https://img-blog.csdnimg.cn/direct/492fe54da6c24809a654191a43365f14.png)

3. 完整代码共享

以下代码主要实现了:

  • 浏览器标签页的翻动和选择
  • 爬取 – 青塔网检索”国家自然科学基金项目“的作者信息,并保存到表格。
  • 爬取 – NSFC”国家自然科学基金项目“的作者信息,并保存到表格。
  • 爬取 – 国际某个领域专家的作者信息,并保存到表格。

3.1 包含Excel部分的完整代码

包含Excel部分的完整代码见:资源文件

3.2 爬虫部分的完整代码

import os
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.action_chains import ActionChains

# '.\chrome.exe --remote-debugging-port=9222 --user-data-dir=“D:\selenium\AutomationProfile”             n "*" --ws --allow-insecure-unlock --nodiscover --authrpc.addr 127.0.1.2 --authrpc.port 8545'
# '.\chrome.exe --remote-debugging-port=9222 --user-data-dir=“D:\selenium\AutomationProfile”'


class Web_Browser:
    def __init__(self, drive='chrome'):
        self.driver = None
        # self.edge()
        self.chrome_drive()

    def edge(self):
        # edge_driver_path = executable_path=r'D:\Program Files\Google\Chrome\Application\chromedriver.exe'
        edge_driver_path = executable_path=r'C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe'
        chrome_options = Options()
        # chrome_options.binary_location = edge_driver_path
        # 配置浏览器
        # 添加User-Agent到Chrome选项中
        # chrome_options.add_argument("--user-agent=windows 10 Edge")
        # "127.0.0.1:9222"其中,9222是浏览器的运行端口
        chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
        # 让浏览器带着这个配置运行
        # chrome_options.add_experimental_option('detach', True)  # 通过option参数,设置浏览器不关闭
        driver = webdriver.Edge(options=chrome_options, keep_alive=True)
        # driver = webdriver.Chrome( options=chrome_options)
        print('===================')
        # driver.get('www.baidu.com')
        driver.implicitly_wait(10)
        self.driver = driver



    def chrome_drive(self, drive='chrome'):
        edge_driver_path = executable_path = r'D:\Program Files\Google\Chrome\Application\chromedriver.exe'
        if drive == 'chrome':
            chrome_options = webdriver.ChromeOptions()
            # chrome_options.binary_location = edge_driver_path
            # chrome_options.add_experimental_option('detach', True)  # 通过option参数,设置浏览器不关闭
            chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")

            driver = webdriver.Chrome(options=chrome_options, keep_alive=False)
            self.driver = driver
            driver.implicitly_wait(10)
        self.opened_windows_dict = None
        pass

    def get_all_opened_windows(self):
        driver = self.driver
        cw = driver.current_window_handle
        res = {}
        # 获取已打开的标签页的信息
        tabs = driver.window_handles
        for t in tabs:
            driver.switch_to.window(t)
            res[str(driver.title)] = str(t)
        self.opened_windows_dict = res
        driver.switch_to.window(cw)
        print('已打开的标签页的信息:',)
        for k in res: print(f"\t{k}: {res[k]}")
        return res

    def switch_window(self, key):
        driver = self.driver
        cw = driver.current_window_handle
        # 获取已打开的标签页的信息
        tabs = driver.window_handles
        for t in tabs:
            driver.switch_to.window(t)
            if key in str(driver.title): cw = t
            break
        # driver.switch_to.window(cw)
        self.driver = driver
        pass


    def open_new_window(self, driver=None, url=None, delay_t=0.6):
        '''# 打开新标签页'''
        driver = self.driver if not driver else driver
        old_handle = driver.window_handles  # 获取已打开的标签页的信息
        # driver.find_element("body").send_keys(Keys.CONTROL + 't')  # 没有实体会报错
        # driver.execute_script("window.open('','_blank');")  # 可能被拦截
        driver.switch_to.new_window('tab')
        time.sleep(delay_t)
        if len(driver.window_handles) >len(old_handle): return True
        driver.execute_script(f"window.open('{url if url else ''}');")
        time.sleep(delay_t)
        if len(driver.window_handles) >len(old_handle): return True
        return False

    def func1(self, xlsx):
        """ 学术网 """
        for p in range(50):
            # self.switch_window('故障诊断')
            driver = self.driver
            web = driver.find_element(by=By.XPATH, value='//*[@id="search_body"]/div[2]/div[3]/div[1]/div[2]/div[1]/div[3]/div[2]/div/div[2]/div[2]/div/div')
            web1 = web.find_elements(by=By.CLASS_NAME, value='inner-content')
            print('web1 len=', len(web1))
            num = 0
            for i, w in enumerate(web1):
                try:
                    # '//*[@id="search_body"]/div[2]/div[3]/div[1]/div[2]/div[1]/div[3]/div[2]/div/div[2]/div[2]/div/div'
                    #
                    a = w.find_element(by=By.XPATH, value=f'//div[{1+i}]/div/div[2]/div[1]/div[1]/div/a/strong/span/span').text
                    try:
                        b = w.find_element(by=By.XPATH, value=f'//div[{1 + i}]/div/div[2]/div[3]/p[2]').text
                        school = str(b).split(',')
                        for s in school:
                            if 'university' in s.lower(): b = s[1:]
                    except: b = None
                    c = w.find_element(by=By.XPATH, value=f'//div[{1 + i}]/div/div[2]/div[3]/p[1]').text
                    d = None
                    e = None
                    f = None
                    try:
                        h_index = w.find_element(by=By.XPATH, value=f'//div[{1 + i}]/div/div[2]/div[2]/div/span[1]/span[3]').text
                        paper = w.find_element(by=By.XPATH, value=f'//div[{1 + i}]/div/div[2]/div[2]/div/span[2]/span[3]').text
                        cite = w.find_element(by=By.XPATH, value=f'//div[{1 + i}]/div/div[2]/div[2]/div/span[3]/span[3]').text
                        f = f"H-index: {h_index},  papers: {paper}, cites: {cite}"
                    except: pass

                    g = None
                    h = w.find_element(by=By.XPATH, value=f'//div[{1 + i}]/div/div[2]/div[1]/div[1]/div/a')
                    h = 'https://www.aminer.cn/' + h.get_attribute('href')
                    print(a, b ,c, g)
                    xlsx.input_data(a,b,c,d,e,f,g, h)
                    num += 1
                except: pass
            print('记录:', num)
            # aa = driver.find_elements(by=By.XPATH, value='//*[@id="search_body"]/div[2]/div[3]/div[1]/div[2]/div[1]/div[3]/div[2]/div/div[2]/div[3]/ul/li')
            # aa = aa[-1]
            aa = driver.find_element(by=By.CLASS_NAME, value='ant-pagination-next')
            # v = '#search_body > div.ant-tabs.ant-tabs-top.a-aminer-core-search-index-searchPageTab.ant-tabs-line.ant-tabs-no-animation > div.ant-tabs-content.ant-tabs-content-no-animated.ant-tabs-top-content > div.ant-tabs-tabpane.ant-tabs-tabpane-active > div.a-aminer-core-search-index-componentContent > div.a-aminer-core-search-c-search-component-temp-searchComponent > div.view > div:nth-child(2) > div > div:nth-child(2) > div.paginationWrap > ul > li.ant-pagination-next'
            # aa = driver.find_element(by=By.CSS_SELECTOR, value=v)
            # 创建一个ActionChains对象,用于执行鼠标动作
            action_chains = ActionChains(driver)
            # 将鼠标移动到链接元素上并点击
            action_chains.move_to_element(aa).click().perform()
            print(f'第{p+1}页 --> 第{p+2}页')
            try:
                xlsx.make_frame()
                xlsx.save_excel()
            except: pass
            time.sleep(5)
        pass

    def func2(self, xlsx=None):
        for p in range(50):
            self.switch_window('青塔')
            driver = self.driver
            web = driver.find_element(by=By.XPATH,
                                      value='//*[@id="app"]/div[2]/div[1]/div/div[2]/div[2]/div/div[2]')

            web1 = web.find_elements(by=By.CLASS_NAME, value='list-item')
            print('web1 len=', len(web1))
            num = 0
            for i, w in enumerate(web1):
                # try:
                # //*[@id="app"]/div[2]/div[1]/div/div[2]/div[2]/div/div[2]
                # '//*[@id="app"]/div[2]/div[1]/div/div[2]/div[2]/div/div[2]/div/div[2]/div[2]/div[2]/div[1]/div[2]'
                # //*[@id="app"]/div[2]/div[1]/div/div[2]/div[2]/div/div[2]/div/div[1]/div[2]/div[2]/div[1]/div[1]

                b = w.find_element(by=By.XPATH, value=f'//div[2]/div[1]/div[1]/div[2]')
                print(b)
                b = b.text
                print('b=', b)
                a = w.find_element(by=By.XPATH, value=f'//div[2]/div[2]/div[1]/div[2]').text
                print('a=', a)
                c = None
                d = None
                e = w.find_element(by=By.XPATH, value=f'//div[1]/div[1]').text
                print('e=', e)
                year = w.find_element(by=By.XPATH, value=f'//div[2]/div[2]/div[2]/div[2]').text
                money = w.find_element(by=By.XPATH, value=f'//div[2]/div[1]/div[2]/div[2]').text
                print('year=', year, 'money=', money)
                e = f"{e}, 立项: {year}, 资助: {money}"
                jijin = w.find_element(by=By.XPATH, value=f'//div[2]/div[3]/div[1]/div[2]').text
                domain = w.find_element(by=By.XPATH, value=f'//div[2]/div[3]/div[2]/div[2]').text
                print('jijin=',jijin, 'domain=', domain)
                f = f"{jijin}, 领域: {domain}"
                g = None
                h = None
                print(i, '-----------', i)
                print(a, b, c, d, e, f)
                xlsx.input_data(a, b, c, d, e, f, g, h)
                num += 1
                break
                # except: pass
            print('记录:', num)
            break
            aa = driver.find_element(by=By.XPATH, value=f'//*[@id="app"]/div[2]/div[1]/div/div[2]/div[2]/div/div[3]/button[2]')
            # 创建一个ActionChains对象,用于执行鼠标动作
            action_chains = ActionChains(driver)
            # 将鼠标移动到链接元素上并点击
            action_chains.move_to_element(aa).click().perform()
            print(f'第{p + 1}页 --> 第{p + 2}页')
            try:
                xlsx.make_frame()
                xlsx.save_excel()
            except:
                pass
            time.sleep(5)
        pass

    def func3(self, xlsx=None):
        for p in range(50):
            self.switch_window('大数据知识管理服务门户')
            driver = self.driver
            d = driver.find_element(by=By.CLASS_NAME, value='container_list_right')
            print('d==', d)
            # web = driver.find_element(by=By.XPATH,
            #                           value='//*[@id="app"]/div[1]/div[3]/div/div[3]/div[1]/div')
            web = d.find_element(by=By.XPATH, value='//div[1]/div')
            # web1 = web.find_elements(by=By.CLASS_NAME, value='list-item')
            # print('web1 len=', len(web1))
            num = 0
            for i, w2 in enumerate(range(6)):
                w = web
                try:
                    # //*[@id="app"]/div[1]/div[3]/div/div[3]/div[1]/div
                    # //*[@id="app"]/div[1]/div[3]/div/div[3]
                    # //*[@id="app"]/div[1]/div[3]/div/div[3]/div[1]/div/div[2]/div[2]/div[1]

                    b = w.find_element(by=By.XPATH, value=f'//div[{i+1}]/div[3]/div[4]/a')
                    b = b.text
                    # print('b=', b)
                    a = w.find_element(by=By.XPATH, value=f'//div[{i+1}]/div[2]/div[4]/a').text
                    # print('a=', a)
                    c = None
                    d = None
                    e = w.find_element(by=By.XPATH, value=f'//div[{i+1}]/div[1]/div[1]/p/a').text
                    # print('e=', e)
                    year = w.find_element(by=By.XPATH, value=f'//div[{i+1}]/div[3]/div[3]').text
                    money = w.find_element(by=By.XPATH, value=f'//div[{i+1}]/div[3]/div[1]').text
                    # print('year=', year, 'money=', money)
                    e = f"{e}, {year}, {money}"
                    jijin = w.find_element(by=By.XPATH, value=f'//div[{i+1}]/div[2]/div[3]').text
                    domain = w.find_element(by=By.XPATH, value=f'//div[{i+1}]/div[2]/div[1]').text
                    # print('jijin=',jijin,  domain)
                    f = f"{jijin}, {domain}"
                    g = None
                    h = None
                    print(i+1, '-----------', i+1)
                    print(a, b, c, d, e, f)
                    xlsx.input_data(a, b, c, d, e, f, g, h)
                    num += 1
                # break
                except: pass
            print('记录:', num)
            # break
            # aa = driver.find_element(by=By.CLASS_NAME, value=f'btn-next')
            # # 创建一个ActionChains对象,用于执行鼠标动作
            # action_chains = ActionChains(driver)
            # # 将鼠标移动到链接元素上并点击
            # action_chains.move_to_element(aa).click().perform()
            print(f'第{p + 1}页 --> 第{p + 2}页')
            try:
                xlsx.make_frame()
                xlsx.save_excel()
            except:
                pass
            break
            # time.sleep(5)
        pass


    def func4(self, xlsx=None, key='Google2'):
        if key == 'Google': self.switch_window('Google')
        else: self.switch_window('必应')
        driver = self.driver
        data = xlsx.read_excel()
        # print(data['姓名'])
        for i, name in enumerate(data['姓名']):
            school = data['学校'][i]
            text = f'{school}{name}是不是教授'
            print(f'search [{i+1}]:  {name} -》 ', text)
            if key == 'Google': web = driver.find_element(by=By.XPATH, value='//*[@id="APjFqb"]')
            else: web = driver.find_element(by=By.XPATH, value='//*[@id="sb_form_q"]')
            web.clear()
            web.send_keys(text)

            if key == 'Google': web = driver.find_element(by=By.XPATH, value='//*[@id="tsf"]/div[1]/div[1]/div[2]/button')
            else: web = driver.find_element(by=By.XPATH, value='//*[@id="sb_form_go"]')
            # try:
            web.click()
            # except: pass
            time.sleep(5)
        num = 0


if __name__ == '__main__':
    from temp import Make_Excel, input_data_list, input_data
    xlsx = Make_Excel()
    web = Web_Browser()
    web.get_all_opened_windows()
    # web.switch_window('故障诊断')

    ''' 学术网 '''
    web.func1(xlsx)  # 学术网
    # web.func2(xlsx)  #  青塔网
    # web.func3(xlsx)  #  NSFC官网

    # web.func4(xlsx, )    # goole搜索网


    # xlsx.make_frame()
    # xlsx.save_excel()

    pass


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

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

相关文章

旅游景区公共广播 园区广播 公路服务区广播

旅游景区公共广播 园区广播 公路服务区广播 旅游景区公共广播 旅游景区公共广播(又称背景音乐)简称BGM,它的主要作用是掩盖噪声并创造一种轻松和谐的气氛,是一种创造轻松愉快环境气氛的音乐。掩盖环境噪声,创造与旅游景区相适应的气氛&#…

ubuntu20.04上获取Livox Avia雷达点云数据

若拿到手的Livox Avia激光雷达不知道它的ip信息,可以在官网上LiDAR Sensors - Livox下载上位机软件Livox Viewer,查看IP,下载window版本就可以。雷达通过网线连上电脑后,该软件就可以自动识别出来。按照下图步骤,就可以…

自动化运维工具---------------ANSIBLE

一、Ansible 发展史及功能 作者:Michael DeHaan( Cobbler pxe kikstar 与 Func 作者)ansible 的名称来自科幻小说《安德的游戏》中跨越时空的即时通信工具,使用它可以在相距数光年的距离,远程实时控制前线的舰队战斗2…

遥感云计算的一个拐点

GeoForge,一个值得关注的遥感大数据应用 简介 GeoForge是由Ageospatial公司开发的一个基于大语言模型(GeoLLMs)的地理空间分析平台。GeoForg的目的是使每个人都可以轻松进行地图绘制和地理空间分析,无论您是外行还是专家。 Geo for ChatGPT 作者团队已…

Extropic.AI:终结GPU/TPU的热力学未来Chip?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

一台GTX1080显卡的怪兽,我可不能错过这个机会!

标题:我花了30块钱买了一台电脑主机。 这个配置能赚钱吗? 1. 收购惊喜 那是一个阳光明媚的下午,我在水管修理店里闲逛。 突然,一位老顾客手里拿着一台旧电脑主机匆匆走了进来。 他说:“小王,你能帮我看看…

芯片电源设计原则

一、芯片供电 每路电源都要求在一定范围内。每路电源都有允许的输入电压范围。可能需求多路电源;可能分模块供给。 不同模块对电源质量的要求可能不同。有些模块可能较为敏感,抗扰度低。有些模块可能容易干扰其他模块。 电源分配网络存在一定电感&…

07-java基础-锁之AQSReentrantLockBlockingQueueCountDownLatchSemapho

文章目录 0:AQS简介-常见面试题AQS具备特性state表示资源的可用状态AQS定义两种资源共享方式AQS定义两种队列自定义同步器实现时主要实现以下几种方法:同步等待队列条件等待队列 1:AQS应用之ReentrantLockReentrantLock如何实现synchronized不…

string的使用

前言 我们前面已经介绍了C的基本知识,本期开始我们将进入C的第二部分,也是非常重要的一个部分!他就是STL!本期我们来先介绍string及其使用! 本期内容介绍 STL介绍 为什么要学习string? string的常用接口介绍 一、ST…

【Twinmotion】Twinmotion导入UE5

步骤 1. 在虚幻商城中安装“Datasmith Twinmotion导入器插件” 安装“面向虚幻引擎的Twinmotion内容” 2. 打开虚幻引擎,在插件中搜索“twinmotion”,勾选如下两个插件,然后重启虚幻引擎 3. 打开Twinmotion,随便添加一个物体 导出…

NAND和NOR Flash 完全学习笔记

本文要点: NAND FLASH与NOR FLASH 的技术对比;最详细的存储单元对比详解;NAND FLASH与NOR FLASH 的最新市场份额及应用;NAND FLASH与NOR FLASH 的基础原理分析。 目前,NOR FLASH和NAND FLASH是市场上主要的非易失性闪…

李彦宏:在中文上文心大模型4.0已经超过了GPT-4!如何优雅地反驳

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,所以创建了“AI信息Gap”这个公众号,专注于分享AI全维度知识…

<逻辑回归算法(Logistic regression)>——《机器学习算法初识》

目录 一、 逻辑回归介绍 1 逻辑回归的应用场景 2 逻辑回归的原理 2.1 输入 2.2 激活函数 3 损失以及优化 3.1 损失 3.2 优化 4 小结 二、逻辑回归api介绍 实现过程: 三、分类评估方法 1.分类评估方法 1.1 精确率与召回率 1.1.1 混淆矩阵 1.1.2 精确…

【五、接口自动化测试】5分钟掌握python + requests接口测试

你好啊!我是山茶,一个持续探索AI 测试的程序员! 在做接口测试时,在python中内置了HTTP库 urllib,可以用于发送http请求。基于urllib二次封装的三方库Requests,相较于urllib更佳简介易用。所以,…

LED基础知识分享(一)

大家好,我是砖一。 今天给大家分享一下,LED的基础知识,有照明行业,或者对LED感兴趣的朋友,可以学习一下,希望对你有用~ 一,什么是LED (Light Emitting Diode)? 1,LED是一种发出某…

MathType7最新软件产品秘钥2024中文版

MathType 7是一款功能强大的数学公式编辑器,专为教育工作者、学生、科研人员以及任何需要处理数学公式的人群设计。以下是对MathType 7的详细介绍: 一、功能特点: 广泛的符号和模板支持:MathType 7支持各种数学符号、公式、方程…

Centos7 安装postgresql14后无法连接数据库

1、数据库服务器允许外部访问5432端口。 2、postgresql.conf 3、pg_hba.conf a、制定某个IP(192.168.0.107)访问 b、指定ip段访问 允许10.1.1.0~10.1.1.255网段登录数据库 host all all 10.1.1.0/24 trust c、指定全网访问 host a…

mysql5.6---windows和linux安装教程和忘记密码怎么办

一、windows安装 1.完成解压 解压完成之后将其放到你喜欢的地址当中去,这里我默认放在了D盘,这是我的根目录 2.配置环境变量 我的电脑->属性->高级->环境变量->系统变量 选择PATH,在其后面添加: (注意自己的安装地址) D:\mysql-5.6.49…

【C++庖丁解牛】vector容器的简易模拟实现(C++实现)(最后附源码)

🍁你好,我是 RO-BERRY 📗 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 目录 前言vector容器代码实现内…

【测试开发学习历程】Linux用户管理+文件权限管理

目录 一、用户管理 (一)用户和用户组的基本概念 1.概念 2.设置原因 3.用户与用户组的关系 4.用户类型 (二)用户的创建、修改属性和删除用户 1.用户信息文件 2.创建用户 3.修改用户密码 4.修改用户信息 5.用户查询 6.…