数据采集作业4

news/2025/12/9 2:26:10/文章来源:https://www.cnblogs.com/xwj777/p/19324138

目录

  • 第一题
    • 1.1 主要代码
    • 1.2 实验结果
    • 1.3 心得体会
  • 第二题
    • 2.1 主要代码
    • 2.2 实验结果
    • 2.3 心得体会
  • 第三题
    • 3.1 主要代码
    • 3.2 实验结果
    • 3.3 心得体会

1.第一题


使用Selenium框架+ MySQL数据库存储技术路线爬取“沪深A股”、“上证A股”、“深证A股”3个板块的股票数据信息。

1.1主要代码


第一题全部代码

点击查看代码
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.edge.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException, TimeoutException
import time
import pymysql
from beautifultable import BeautifulTabledriver = webdriver.Edge(service=Service())
class DatabaseManager:def __init__(self):self.db = Noneself.cursor = Noneself.connect()def connect(self):"""连接数据库"""try:self.db = pymysql.connect(host='localhost',user='root',password='826922',database='stocks_db',charset='utf8mb4',port=3306)self.cursor = self.db.cursor()print("MySQL数据库连接成功")self.create_table()except Exception as e:print(f"MySQL连接失败: {e}")self.db = Noneself.cursor = Nonedef create_table(self):"""创建数据表"""self.cursor.execute('DROP TABLE IF EXISTS stocks1')try:self.cursor.execute('''CREATE TABLE IF NOT EXISTS stocks1 (stock_code VARCHAR(20) PRIMARY KEY,stock_name VARCHAR(50),last_price DECIMAL(10,2),change_percent VARCHAR(30),change_amount DECIMAL(10,2),volume VARCHAR(30),turnover VARCHAR(30),turnover_rate VARCHAR(30),high_price DECIMAL(10,2),low_price DECIMAL(10,2),open_price DECIMAL(10,2),close_price DECIMAL(10,2)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4''')self.db.commit()print("数据表 stocks1 创建成功或已存在")except Exception as e:print(f"创建表失败: {e}")def insert_stock_data(self, stock_data):"""插入股票数据"""if not self.db or not self.cursor:print("数据库未连接,跳过数据插入")return Falsetry:sql = '''INSERT INTO stocks1 (stock_code, stock_name, last_price, change_percent, change_amount, volume, turnover,turnover_rate,high_price, low_price, open_price, close_price)VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,%s)ON DUPLICATE KEY UPDATEstock_name = VALUES(stock_name),last_price = VALUES(last_price),change_percent = VALUES(change_percent),change_amount = VALUES(change_amount),volume = VALUES(volume),turnover = VALUES(turnover),turnover_rate = VALUES(turnover_rate),high_price = VALUES(high_price),low_price = VALUES(low_price),open_price = VALUES(open_price),close_price = VALUES(close_price)'''self.cursor.executemany(sql, stock_data)self.db.commit()print(f"成功插入/更新 {self.cursor.rowcount} 条股票数据")return Trueexcept Exception as e:self.db.rollback()print(f"数据插入失败: {e}")return False
def get_html(url, max_page):"""获取HTML数据"""driver.get(url)current_page = 1data = []while current_page <= max_page:try:print(f"\n正在获取第 {current_page} 页数据...")# 等待表格数据加载完成wait = WebDriverWait(driver, 10)marks = wait.until(EC.presence_of_all_elements_located((By.XPATH, '//table//tbody/tr[td[2]/a[contains(@href, "quote.eastmoney.com")]]')))print(f"找到 {len(marks)} 条数据")# 提取当前页的所有数据for mark in marks:try:code = mark.find_element(By.XPATH, './/td[2]').textname = mark.find_element(By.XPATH, './/td[3]').text# 价格信息last_price = mark.find_element(By.XPATH, './/td[5]').textchange_percent = mark.find_element(By.XPATH, './/td[6]').textchange_amount = mark.find_element(By.XPATH, './/td[7]').text# 成交量信息volume = mark.find_element(By.XPATH, './/td[8]').textturnover = mark.find_element(By.XPATH, './/td[9]').textturnover_rate = mark.find_element(By.XPATH, './/td[10]').text# 价格区间high_price = mark.find_element(By.XPATH, './/td[11]').textlow_price = mark.find_element(By.XPATH, './/td[12]').textopen_price = mark.find_element(By.XPATH, './/td[13]').textclose_price = mark.find_element(By.XPATH, './/td[14]').textdata.append([ code, name, last_price, change_percent, change_amount,volume, turnover, turnover_rate, high_price, low_price,open_price, close_price])except NoSuchElementException as e:print(f"提取数据时元素未找到: {e}")continue# 翻页逻辑(处理完当前页所有数据后再翻页)if current_page < max_page:if not click_next_page():print("没有下一页,停止翻页")breakelse:break  # 已经达到最大页数,退出循环# 当前页处理完成,页码递增current_page += 1time.sleep(2)  # 翻页间隔except TimeoutException:print("页面加载超时,未找到数据")breakexcept Exception as e:print(f"获取第 {current_page} 页数据时出错: {e}")breakreturn data  # 添加返回值def click_next_page():try:time.sleep(2)# 查找并点击下一页按钮next_buttons = driver.find_elements(By.XPATH, '//a[@title="下一页"]')for button in next_buttons:if button.is_displayed() and button.is_enabled():driver.execute_script("arguments[0].click();", button)time.sleep(3)return Truereturn Falseexcept Exception as e:print(f"翻页失败: {e}")return False
def main():try:markets = ["https://quote.eastmoney.com/center/gridlist.html#hs_a_board","https://quote.eastmoney.com/center/gridlist.html#sh_a_board","https://quote.eastmoney.com/center/gridlist.html#sz_a_board"]market_names = ["沪深京A股", "上证A股", "深证A股"]all_data = []db_manager = DatabaseManager()for i, url in enumerate(markets):print(f"\n{'=' * 50}")print(f"开始处理板块: {market_names[i]}")print(f"{'=' * 50}")data = get_html(url, 2)if data:all_data.extend(data)print(f"{market_names[i]} 获取到 {len(data)} 条数据")# 显示当前板块的数据预览print(f"\n{market_names[i]} 数据:")table = BeautifulTable()table.set_style(BeautifulTable.STYLE_COMPACT)table.columns.alignment = BeautifulTable.ALIGN_CENTERtable.columns.header = ['代码', '名称', '最新价', '涨跌幅', '涨跌额','成交量', '成交额', '换手率', '最高价', '最低价', '开盘价', '昨收价']table.columns.width = [14,12,12,12,12,12,12,12,12,12,12,12]for product in data:# 简化商品名称显示table.rows.append(product)print(table)else:print(f"{market_names[i]} 没有获取到数据")# 板块间短暂停顿if i < len(markets) - 1:time.sleep(3)if all_data:success = db_manager.insert_stock_data(all_data)if success:print(f"成功保存股票数据到数据库")else:print("保存数据到数据库失败")else:print("没有获取到任何股票数据")except Exception as e:print(f"主程序执行出错: {e}")finally:input("按回车键关闭浏览器...")driver.quit()if __name__ == "__main__":main()

image

通过图片可以看到通过标签//table//tbody/tr定位到每个股票的数据,再通过td[i]来提取到对应的数据,但是仅靠这个提取,会出现一个空的标头,所以加上[td[2]/a[contains(@href, "quote.eastmoney.com")]],来更好的定位.

def get_html(url, max_page):"""获取HTML数据"""driver.get(url)current_page = 1data = []while current_page <= max_page:try:print(f"\n正在获取第 {current_page} 页数据...")# 等待表格数据加载完成wait = WebDriverWait(driver, 10)marks = wait.until(EC.presence_of_all_elements_located((By.XPATH, '//table//tbody/tr[td[2]/a[contains(@href, "quote.eastmoney.com")]]')))print(f"找到 {len(marks)} 条数据")# 提取当前页的所有数据for mark in marks:try:code = mark.find_element(By.XPATH, './/td[2]').textname = mark.find_element(By.XPATH, './/td[3]').text# 价格信息last_price = mark.find_element(By.XPATH, './/td[5]').textchange_percent = mark.find_element(By.XPATH, './/td[6]').textchange_amount = mark.find_element(By.XPATH, './/td[7]').text# 成交量信息volume = mark.find_element(By.XPATH, './/td[8]').textturnover = mark.find_element(By.XPATH, './/td[9]').textturnover_rate = mark.find_element(By.XPATH, './/td[10]').text# 价格区间high_price = mark.find_element(By.XPATH, './/td[11]').textlow_price = mark.find_element(By.XPATH, './/td[12]').textopen_price = mark.find_element(By.XPATH, './/td[13]').textclose_price = mark.find_element(By.XPATH, './/td[14]').textdata.append([ code, name, last_price, change_percent, change_amount,volume, turnover, turnover_rate, high_price, low_price,open_price, close_price])except NoSuchElementException as e:print(f"提取数据时元素未找到: {e}")continue# 翻页逻辑(处理完当前页所有数据后再翻页)if current_page < max_page:if not click_next_page():print("没有下一页,停止翻页")breakelse:break  # 当前页处理完成,页码递增current_page += 1time.sleep(2)  # 翻页间隔except TimeoutException:print("页面加载超时,未找到数据")breakexcept Exception as e:print(f"获取第 {current_page} 页数据时出错: {e}")breakreturn data  

image

对于翻页,通过定位到下一页的按钮,然后自动点击。

def click_next_page():try:time.sleep(2)# 查找并点击下一页按钮next_buttons = driver.find_elements(By.XPATH, '//a[@title="下一页"]')for button in next_buttons:if button.is_displayed() and button.is_enabled():driver.execute_script("arguments[0].click();", button)time.sleep(3)return Truereturn Falseexcept Exception as e:print(f"翻页失败: {e}")return False

再往数据库里面存储数据

点击查看代码
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.edge.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException, TimeoutException
import time
import pymysql
from beautifultable import BeautifulTabledriver = webdriver.Edge(service=Service())
class DatabaseManager:def __init__(self):self.db = Noneself.cursor = Noneself.connect()def connect(self):"""连接数据库"""try:self.db = pymysql.connect(host='localhost',user='root',password='826922',database='stocks_db',charset='utf8mb4',port=3306)self.cursor = self.db.cursor()print("MySQL数据库连接成功")self.create_table()except Exception as e:print(f"MySQL连接失败: {e}")self.db = Noneself.cursor = Nonedef create_table(self):"""创建数据表"""self.cursor.execute('DROP TABLE IF EXISTS stocks1')try:self.cursor.execute('''CREATE TABLE IF NOT EXISTS stocks1 (stock_code VARCHAR(20) PRIMARY KEY,stock_name VARCHAR(50),last_price DECIMAL(10,2),change_percent VARCHAR(30),change_amount DECIMAL(10,2),volume VARCHAR(30),turnover VARCHAR(30),turnover_rate VARCHAR(30),high_price DECIMAL(10,2),low_price DECIMAL(10,2),open_price DECIMAL(10,2),close_price DECIMAL(10,2)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4''')self.db.commit()print("数据表 stocks1 创建成功或已存在")except Exception as e:print(f"创建表失败: {e}")def insert_stock_data(self, stock_data):"""插入股票数据"""if not self.db or not self.cursor:print("数据库未连接,跳过数据插入")return Falsetry:sql = '''INSERT INTO stocks1 (stock_code, stock_name, last_price, change_percent, change_amount, volume, turnover,turnover_rate,high_price, low_price, open_price, close_price)VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,%s)ON DUPLICATE KEY UPDATEstock_name = VALUES(stock_name),last_price = VALUES(last_price),change_percent = VALUES(change_percent),change_amount = VALUES(change_amount),volume = VALUES(volume),turnover = VALUES(turnover),turnover_rate = VALUES(turnover_rate),high_price = VALUES(high_price),low_price = VALUES(low_price),open_price = VALUES(open_price),close_price = VALUES(close_price)'''self.cursor.executemany(sql, stock_data)self.db.commit()print(f"成功插入/更新 {self.cursor.rowcount} 条股票数据")return Trueexcept Exception as e:self.db.rollback()print(f"数据插入失败: {e}")return False

1.2实验结果

从运行结果里面查看:
image
从Mysql里面查看:
image

1.3心得提会

在本次实验中,通过使用 Selenium 爬取了东方财富网的股票数据。在提取数据的时候,不需要做可以处理,可以直接读出单位与正确的数据格式,其次,在翻页的时候,可以通过定位到下一页的按钮的位置,直接进行点击,而非之前的,需要采用url里面的页数的参数,来作为翻页。最后往数据库里面使用ON DUPLICATE KEY UPDATE语句的设计很实用,能够实现数据的更新而非简单插入。

2.第二题


使用Selenium框架+MySQL爬取中国mooc网课程资源信息(课程号、课程名称、学校名称、主讲教师、团队成员、参加人数、课程进度、课程简介)

2.1主要代码


第二题全部代码

点击查看代码
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.edge.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
from beautifultable import BeautifulTable
from selenium.webdriver.common.keys import Keys
import pymysql
driver = webdriver.Edge(service=Service())#数据库:
class DatabaseManager:def __init__(self):self.db = Noneself.cursor = Noneself.connect()def connect(self):"""连接数据库"""try:self.db = pymysql.connect(host='localhost',user='root',password='826922',database='mooc_db',charset='utf8mb4',port=3306)self.cursor = self.db.cursor()print("MySQL数据库连接成功")self.create_table()except Exception as e:print(f"MySQL连接失败: {e}")self.db = Noneself.cursor = Nonedef create_table(self):"""创建数据表"""self.cursor.execute('DROP TABLE IF EXISTS mooc1')try:self.cursor.execute('''CREATE TABLE IF NOT EXISTS mooc1 (mooc_name VARCHAR(255),school VARCHAR(100),teacher VARCHAR(100),teamates TEXT,num VARCHAR(50),schedule VARCHAR(100),text TEXT) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4''')self.db.commit()print("数据表 mooc1 创建成功或已存在")except Exception as e:print(f"创建表失败: {e}")def insert_mooc_data(self, mooc_data):"""插入mooc数据"""if not self.db or not self.cursor:print("数据库未连接,跳过数据插入")return Falsetry:sql = '''INSERT INTO mooc1 (mooc_name, school, teacher, teamates, num,schedule,text)VALUES (%s, %s, %s, %s, %s, %s, %s)'''self.cursor.executemany(sql, mooc_data)self.db.commit()print(f"成功插入/更新 {self.cursor.rowcount} 条股票数据")return Trueexcept Exception as e:self.db.rollback()print(f"数据插入失败: {e}")return False
def click_login_button():try:wait = WebDriverWait(driver, 10)login_button = wait.until(EC.element_to_be_clickable((By.CLASS_NAME,'_3uWA6')))login_button.click()print("点击登录按钮成功")return Trueexcept Exception as e:print(f"点击登录按钮失败: {e}")return Falsedef fill_login_form():try:try:# 查找所有iframeiframes = driver.find_elements(By.TAG_NAME, "iframe")print(f"找到 {len(iframes)} 个iframe")# 切换到第一个iframe(通常是登录框)driver.switch_to.frame(iframes[0])print("已切换到第一个iframe")except Exception as e:print(f"切换iframe失败: {e}")time.sleep(2)  #等待切换至iframe结构#1.找到手机号输入框phone_input = driver.find_element(By.ID, "phoneipt")phone_input.send_keys("15880128200")print("已输入手机号")time.sleep(1)password_input = driver.find_element(By.CLASS_NAME, "j-inputtext")password_input.send_keys("Xwj.826922")print("已输入密码")# 点击登录submit_btn = driver.find_element(By.ID, 'submitBtn')submit_btn.click()print("已提交登录")#再切换回原本的iframe结构driver.switch_to.default_content()return Trueexcept Exception as e:print(f"自动填写失败: {e}")return Falsedef find_selection(keyword):print("等待页面加载...")time.sleep(3)try:select_btn = driver.find_element(By.CLASS_NAME, "ant-input")select_btn.clear()select_btn.send_keys(keyword)print("已成功输入数据")select_btn.send_keys(Keys.ENTER)print("已按回车键搜索")time.sleep(10)return Trueexcept Exception as e:print(f"搜索失败:{e}")return Falsedef get_html():wait = WebDriverWait(driver, 10)wait.until(EC.presence_of_element_located((By.CLASS_NAME, "_3NYsM")))data=[]# 给页面更多时间加载time.sleep(2)# 查找所有搜索结果项result_items = driver.find_elements(By.CLASS_NAME, "_3NYsM")print(f"找到 {len(result_items)} 个搜索结果")for mark in result_items:title = mark.find_element(By.CLASS_NAME, '_1vfZ-').text.strip()author_elements = mark.find_elements(By.CLASS_NAME, '_3t_C8')teacher=author_elements[0].textteammates = ' '.join([auth.text.strip() for auth in author_elements])school = mark.find_elements(By.CLASS_NAME, '_3vJDG')[0].text.strip() if mark.find_elements(By.CLASS_NAME, '_3vJDG') else 'Null'num=mark.find_element(By.CLASS_NAME, '_CWjg').text.strip()text = mark.find_element(By.CLASS_NAME, '_3JEMz').text.strip()schedule = mark.find_elements(By.CLASS_NAME, 'NOdDs')[0].text.strip() if mark.find_elements(By.CLASS_NAME, 'NOdDs') else 'Null'data.append([title,school,teacher, teammates, num,schedule,text])return datadef main(url):db_manager =DatabaseManager()all_data=[]driver.get(url)wait = WebDriverWait(driver, 10)click_login_button()time.sleep(10)  # 等待10秒fill_login_form()time.sleep(10)print("等待登录完成...")time.sleep(5)  # 等待页面跳转和加载# 检查是否登录成功print("在新页面查找搜索框...")find_selection("计算机网络")all_data=get_html()if all_data:success=db_manager.insert_mooc_data(all_data)if success:print(f"成功保存{len(all_data)}条数据到数据库")else:print("保存数据到数据库失败")else:print("没有获取到课程数据")print("等待结束,页面即将关闭")return all_data
if __name__ == '__main__':url="https://www.icourse163.org/"all_data=main(url)table = BeautifulTable()table.set_style(BeautifulTable.STYLE_COMPACT)table.columns.alignment = BeautifulTable.ALIGN_CENTERtable.columns.header = ['课程名称', '学校', '老师', '团队成员', '参与人数','进度', '简介']table.columns.width = [20, 18, 14,20,14,20,100]for course in all_data:# 简化商品名称显示table.rows.append(course)print(table)

image

对于爬去中国mooc网时,首先要是实现自动登录的功能,所以使用click_login_button函数,找到定位到‘登录’的按钮

def click_login_button():try:wait = WebDriverWait(driver, 10)login_button = wait.until(EC.element_to_be_clickable((By.CLASS_NAME,'_3uWA6')))login_button.click()print("点击登录按钮成功")return Trueexcept Exception as e:print(f"点击登录按钮失败: {e}")return False

image
点击登录后,会弹出登录页面,但是输入框是一个嵌套的iframe结构,所以需要切换至iframe,在这里面定位到输入手机号和密码,输入手机号与密码,实现自动登录,并且登录完后需要再重新切换回原本的iframe结构。

def fill_login_form():try:try:# 查找所有iframeiframes = driver.find_elements(By.TAG_NAME, "iframe")print(f"找到 {len(iframes)} 个iframe")# 切换到第一个iframe(通常是登录框)driver.switch_to.frame(iframes[0])print("已切换到第一个iframe")except Exception as e:print(f"切换iframe失败: {e}")time.sleep(2)  #等待切换至iframe结构#1.找到手机号输入框phone_input = driver.find_element(By.ID, "phoneipt")phone_input.send_keys("15880128200")print("已输入手机号")time.sleep(1)password_input = driver.find_element(By.CLASS_NAME, "j-inputtext")password_input.send_keys("Xwj.826922")print("已输入密码")# 点击登录submit_btn = driver.find_element(By.ID, 'submitBtn')submit_btn.click()print("已提交登录")#再切换回原本的iframe结构driver.switch_to.default_content()return Trueexcept Exception as e:print(f"自动填写失败: {e}")return False

image
在成功登录后,定位搜索框,input数据,再点击搜索,找到需要的课程。

def find_selection(keyword):print("等待页面加载...")time.sleep(3)try:select_btn = driver.find_element(By.CLASS_NAME, "ant-input")select_btn.clear()select_btn.send_keys(keyword)print("已成功输入数据")select_btn.send_keys(Keys.ENTER)print("已按回车键搜索")time.sleep(10)return Trueexcept Exception as e:print(f"搜索失败:{e}")return False

image

在搜索后,到达课程页面,最后开始爬取课程,将没有的数据设置为Null。

def get_html():wait = WebDriverWait(driver, 10)wait.until(EC.presence_of_element_located((By.CLASS_NAME, "_3NYsM")))data=[]# 给页面更多时间加载time.sleep(2)# 查找所有搜索结果项result_items = driver.find_elements(By.CLASS_NAME, "_3NYsM")print(f"找到 {len(result_items)} 个搜索结果")for mark in result_items:title = mark.find_element(By.CLASS_NAME, '_1vfZ-').text.strip()author_elements = mark.find_elements(By.CLASS_NAME, '_3t_C8')teacher=author_elements[0].textteammates = ' '.join([auth.text.strip() for auth in author_elements])school = mark.find_elements(By.CLASS_NAME, '_3vJDG')[0].text.strip() if mark.find_elements(By.CLASS_NAME, '_3vJDG') else 'Null'num=mark.find_element(By.CLASS_NAME, '_CWjg').text.strip()text = mark.find_element(By.CLASS_NAME, '_3JEMz').text.strip()schedule = mark.find_elements(By.CLASS_NAME, 'NOdDs')[0].text.strip() if mark.find_elements(By.CLASS_NAME, 'NOdDs') else 'Null'data.append([title,school,teacher, teammates, num,schedule,text])return data

最后往数据库里面插入数据:

点击查看代码
class DatabaseManager:def __init__(self):self.db = Noneself.cursor = Noneself.connect()def connect(self):"""连接数据库"""try:self.db = pymysql.connect(host='localhost',user='root',password='826922',database='mooc_db',charset='utf8mb4',port=3306)self.cursor = self.db.cursor()print("MySQL数据库连接成功")self.create_table()except Exception as e:print(f"MySQL连接失败: {e}")self.db = Noneself.cursor = Nonedef create_table(self):"""创建数据表"""self.cursor.execute('DROP TABLE IF EXISTS mooc1')try:self.cursor.execute('''CREATE TABLE IF NOT EXISTS mooc1 (mooc_name VARCHAR(255),school VARCHAR(100),teacher VARCHAR(100),teamates TEXT,num VARCHAR(50),schedule VARCHAR(100),text TEXT) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4''')self.db.commit()print("数据表 mooc1 创建成功或已存在")except Exception as e:print(f"创建表失败: {e}")def insert_mooc_data(self, mooc_data):"""插入mooc数据"""if not self.db or not self.cursor:print("数据库未连接,跳过数据插入")return Falsetry:sql = '''INSERT INTO mooc1 (mooc_name, school, teacher, teamates, num,schedule,text)VALUES (%s, %s, %s, %s, %s, %s, %s)'''self.cursor.executemany(sql, mooc_data)self.db.commit()print(f"成功插入/更新 {self.cursor.rowcount} 条股票数据")return Trueexcept Exception as e:self.db.rollback()print(f"数据插入失败: {e}")return False

2.2运行结果


从终端查看
image

从数据库里面查看
image

2.3心得体会

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

251208 周一是工作的一天

晚睡就会导致晚起 现在衣食住行都还可以,其实不缺啥了。以后要保持积攒,不要一直买买买,东西还能用就不用再买啦,争取现在的这些物资都能多用几年。 保持简单,单调一点没事儿的。今天发货发出去一只拍子,希望继续…

记 Docker 运行公共 MySQL 数据库供其他服务使用的配置过程

在 VPS 上部署服务时,使用 Docker 或 Docker Compose 是最方便的方式之一。例如博客系统Typecho和短链接服务Shlink都要求外部数据库,如果在每个服务的 Docker Compose 中都各自启动一个 MySQL,既浪费空间,维护也更…

记Docker运行公共MySQL数据库供其他服务使用

在 VPS 上部署服务时,使用 Docker 或 Docker Compose 是最方便的方式之一。例如博客系统Typecho和短链接服务Shlink都要求外部数据库,如果在每个服务的 Docker Compose 中都各自启动一个 MySQL,既浪费空间,维护也更…

手竿新手买什么品牌好?新手买鱼竿品牌推荐:鱼竿新手入门推荐

不少钓鱼新手一进渔具店就头大,“调性”“碳布吨位”“钓重”这些词跟天书似的,越听越懵。其实新手挑鱼竿特简单,抓住好操控、够耐用、用着爽这三点就行,至于手竿新手买啥品牌,答案就藏在产品参数和你常去的钓点里…

2025年中国鱼竿十大名单 国产良心钓鱼竿品牌排行榜全解析

垂钓作为一项兼具休闲与竞技属性的活动,鱼竿的品质直接影响着垂钓体验。随着钓具制造技术的不断发展,市场上涌现出众多专注于鱼竿生产的品牌,它们在材料研发、工艺创新和服务保障等方面各有特色,为不同需求的钓友提…

2025年台钓竿品牌排行榜前十,中国质量好的手竿盘点

台钓竿特指适应台湾钓鱼技法的专用钓竿,具有调性精准、手感轻盈等特点,是淡水垂钓的主流装备。手竿则是无绕线轮钓竿的统称,台钓竿正是手竿中技术含量较高的品类。而“质量好”的核心评判点则集中在强度、轻量化、耐…

2025高碳素超轻超硬鱼竿哪家好?高碳素超轻超硬鱼竿推荐

随着垂钓运动成为大众休闲生活的重要组成,“高碳素超轻超硬鱼竿推荐”“高碳素超轻超硬鱼竿哪家好”等问题持续升温,这些长尾词的背后,是钓友对装备性能升级的迫切需求。在2025年的渔具市场中,高碳素鱼竿已成为主流…

STM32设置为I2C从机模式(HAL库版本)转

1、初始化I2C配置注:除了最后的HAL_I2C_EnableListen_IT()函数,其他代码都可以用STM32CubeMX自动生成参考代码:1 static void MX_I2C1_Init(void)2 {3 hi2c1.Instance = I2C1; //…

手竿什么品牌质量好?选购指南:中国手竿十大品牌,公认好用的手竿

手竿作为淡水垂钓的核心装备,其质量好坏直接决定垂钓体验。判断一款手竿是否优质,关键看材质、调性、钓重、工艺四大维度。材质上,30-40T碳布是性价比黄金区间,过高的T数易导致竿体过脆,反而不适合野钓;调性方面…

STM32设置为I2C从机模式(转)

测试例程:定义一个256字节的buffer用来存放I2C从机的数据,默认赋初值0-255,然后通过中断的方式实现I2C数据读写。示例代码如下:1 #include "stm32f10x.h"2 #include "stm32f10x_gpio.h"3 #inc…

Linux Mint在更新内核后出现网卡未识别的问题

Linux Mint在更新内核后出现网卡未识别的问题前段时间在U盘中安装了一个Linux Mint,但后来因为更新了一下内核版本导致无线网卡无法识别(network UNCLAIMED),问了deepseek和chatgpt后(进入Live模式给新内核的Linu…

jittor和torch的爱恨情仇

左jittor右torch execute --- forward concat --- cat zeros_like --- empty_like jt.array --- torch.tensor greater --- gt 需要注意的 unique在 Jittor 中只有 return_inverse=True 时 return_counts=True 才有效…

FeatherNotes

https://github.com/tsujan/FeatherNotes

XHORSE XSGA80EN Universal Smart Key 5pcs/lot – Ideal for European American Car Owners Mechanics

Solving the Smart Key Replacement Headache: Introducing the XHORSE XSGA80EN Universal Smart Key Problem: The High Cost and Compatibility Nightmare of Smart Key Replacement For European and American car…

P1036 选数

点击查看代码 #include<bits/stdc++.h> using namespace std;int n,m; int a[25]; long long ans;bool prime(int x) {if(x==1||x!=2&&x%2==0) return false;for(int i=3;i<=x/i;i++) if(x%i==0) ret…

GIT-01 Fuel Injection Drivebox Injector Tester: Universal Plugs for All Injectors + Frequency Lock

The Pain of Fuel Injector Diagnostics: A Common Challenge for Mechanics and Car Owners Fuel injectors are the heart of modern engines, responsible for delivering precise fuel to combustion chambers. Wh…

虚拟机 VMware Tools 工具安装失败/缺失的问题

开源的VMware Tools工具下载方法 VMware Tools 有多种获取方式,以下是主要方法: 1. 通过 VMware 产品直接安装(推荐) 这是最简单的方法,在安装 VMware 虚拟机时:自动安装:VMware Workstation/Fusion 在新建虚拟…

AgileConfig-1.11.0 发布:增强的权限管理

AgileConfig 作为一个轻量级配置中心,我一直强调其“轻量”的概念。因此,权限管理这一块一直比较薄弱,甚至可以说形同虚设。然而,在实际项目实施中,用户对于权限管理的需求非常强烈,因为某些配置(如数据库连接串…

Windows 10 终止服务,趁微软官方下载通道还没有关闭,现在教大家如何用电脑浏览器下载。

微软下载通道虽然还在,但是桌面浏览器访问,默认是看不到的。但是使用手机浏览器还是可以看的到的。https://www.microsoft.com/zh-cn/software-download/windows10   那么第一种方式:可以使用手机浏览器访问上面链…

CSAPP 存储器层次结构

CSAPP 存储器层次结构目录存储器层次结构存储技术RAMDRAM的读写内存模块ROM主存的访问磁盘的存储磁盘的构造磁盘的存储磁盘的读写逻辑磁盘块 存储器层次结构 存储器系统是一个具有不同容量,成本和访问时间的存储设备的…