【Python】爬虫练习-爬取豆瓣网电影评论用户的观影习惯数据
目录
前言
一、配置环境
1.1、 安装Python
1.2、 安装Requests库和BeautifulSoup库
1.3.、安装Matplotlib
二、登录豆瓣网(重点)
2.1、获取代理
2.2、测试代理ip是否可用
2.3、设置大量请求头随机使用
2.4、登录豆瓣网
三、爬取某一部热门电影数据
3.1、爬取全部长、短评论
3.2、获取用户观影数据
3.3、存入数据库
四、实战代码示例
五、总结
前言
豆瓣网是一个具有影响力的电影评论网站,其中包含大量的用户评论和评分数据。这些数据可以用于研究电影市场和用户观影习惯,同时还可以用于电影推荐算法以及在线视频网站的用户行为分析等方面,因此对于想要学习数据分析和机器学习的人来说,爬取豆瓣网电影评论数据是一个很好的练手项目。
本文将详细介绍如何使用Python爬虫抓取豆瓣网电影评论用户的观影习惯数据,并进行简单的数据处理和分析。
一、配置环境
在开始爬取豆瓣网电影评论数据之前,我们需要配置好Python开发环境和相关依赖库。
1.1、 安装Python
首先,我们需要安装Python。建议使用Python 3.x版本。可以在官网下载并安装对应版本的Python:https://www.python.org/downloads/。
1.2、 安装Requests库和BeautifulSoup库
接下来,我们需要安装两个Python库:Requests和BeautifulSoup。Requests库可以用于发送HTTP请求,获取网页内容,而BeautifulSoup库可以用于解析HTML文档,提取所需数据。
可以使用pip命令自动安装这两个库:
pip install requestspip install beautifulsoup4
1.3.、安装Matplotlib
如果我们需要对抓取的数据进行可视化分析,可以使用Matplotlib库。可以使用pip命令安装:
pip install matplotlib
安装完成后,我们就可以开始爬取豆瓣网电影评论数据了。
二、登录豆瓣网(重点)
豆瓣网对爬虫有一定的反爬虫策略,根据实战经验反爬一般作用于用户ID、用户IP和请求头的过滤,为了避免被封禁IP,代码中需要加入一些反爬虫措施:
- 设置请求间隔
- 使用代理IP
- 伪装请求头等
2.1、获取代理
使用代理可以帮助我们隐藏自己的真实IP地址,避免被封禁IP或者限制访问。在爬取豆瓣网电影评论数据时,如果频繁地访问同一个IP地址,豆瓣网可能会禁止我们的访问,因此使用代理也可以防止被封禁。这里我使用的是站大爷代理ip来进行操作的。
以下是使用用户名+密码授权获取ip代码示例:
import requests#你要访问的网址
url = 'http://www.ip138.com/'
proxies = {'http': 'http://账号:密码@ip:port','https': 'http://账号:密码@ip:port'
#“用户名+密码”授权,账号为实例ID,密码为8位数字的密码,不用MD5加密,在后台的实例管理下可以看到}
response = requests.get(url, proxies=proxies)
2.2、测试代理ip是否可用
测试代理IP是否可用是为了确保我们使用的代理IP能够正常工作,防止由于代理IP失效或无效而导致爬虫请求失败。一般来说,我们可以通过发送请求来测试代理IP是否可用,如果请求成功则说明代理IP可用,否则说明代理IP无效或被封禁。
测试代理IP的代码可以通过如下方式实现:
- 定义一个函数,接收代理IP和目标网站URL作为参数
- 在函数中,使用requests库发送请求,并设置代理IP
- 如果请求成功,则说明代理IP可用,返回True
- 如果请求失败,则说明代理IP无效或被封禁,返回False
以下是一段测试代理IP的代码示例:
import requestsdef test_proxy_ip(proxy_ip, target_url):proxies = {'http': 'http://' + proxy_ip,'https': 'http://' + proxy_ip}try:response = requests.get(target_url, proxies=proxies, timeout=5)if response.status_code == 200:return Trueelse:return Falseexcept:return False
在上述代码中,我们定义了一个test_proxy_ip函数,该函数接收代理IP和目标网站URL作为参数。在函数中,我们首先根据传入的代理IP构造proxies字典,然后使用requests库发送请求,并设置proxies参数为该字典。如果请求成功,则说明代理IP可用,函数返回True;否则函数返回False。
当我们在爬取豆瓣网电影评论数据时,可以使用上述代码测试代理IP是否可用。如果代理IP可用,则使用该代理IP发送请求;如果代理IP无效或被封禁,则需要更换新的代理IP。
2.3、设置大量请求头随机使用
爬取豆瓣网电影评论用户的观影习惯数据要设置大量请求头随机使用是为了防止网站监测到我们的请求头是模拟的,并防止被反爬虫机制封禁IP。因此,我们需要尽可能多的提供不同的请求头信息,对请求头进行随机使用,以降低被监测到的概率。
以下是一个随机使用请求头的示例代码:
import randomUSER_AGENTS = ['Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582','Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299',# 更多用户代理信息...]def get_random_user_agent():return random.choice(USER_AGENTS)headers = {'User-Agent': get_random_user_agent(),'Referer': 'https://www.douban.com','Cookie': 'your_cookie'}
在以上代码中,我们定义了一个USER_AGENTS列表,包含多个常用浏览器的User-Agent信息。然后定义了一个`get_random_user_agent()`函数,用于随机从USER_AGENTS列表中获取一个User-Agent信息。最后,我们设置headers变量,使用`get_random_user_agent()`函数获取随机的User-Agent信息,并将其赋值到headers变量中,作为请求头信息。
需要注意的是,我们在使用随机请求头的同时,仍然需要保持一定的爬取速度和请求间隔,以避免被封禁。同时,如果服务器在返回的内容中发现请求头信息异常,我们也可能被视为爬虫而被封禁。因此,在进行豆瓣网电影评论用户数据爬取时,需要谨慎处理请求头信息。
2.4、登录豆瓣网
以下是一个使用selenium模拟登录豆瓣网并保存cookie的示例代码:
from selenium import webdriver
import time
import picklelogin_url = 'https://accounts.douban.com/passport/login?source=movie'
username = 'your_username'
password = 'your_password'
cookie_file = 'cookies.pkl'
# 启动浏览器
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
# 访问登录页面
driver.get(login_url)
# 输入用户名和密码
driver.find_element_by_id('username').send_keys(username)
driver.find_element_by_id('password').send_keys(password)
# 等待用户输入验证码
time.sleep(30)
# 点击登录按钮
driver.find_element_by_class_name('account-form-field-submit ').click()
# 等待新页面加载完成
time.sleep(10)
# 保存cookie到文件
cookies = driver.get_cookies()
with open(cookie_file, 'wb') as f:pickle.dump(cookies, f)
# 关闭浏览器
driver.quit()
在以上代码中,我们首先初始化了一些变量,包括登录页面的URL、豆瓣账号的用户名和密码、以及保存cookie的文件名。
然后,我们启动了Chrome浏览器,并通过`driver.get()`方法访问了豆瓣登录页面。接着,我们使用`selenium`模拟了用户在页面上输入了用户名和密码,并等待了30秒,以留出时间输入验证码。
最后,我们点击登录按钮,等待新页面加载完成,获取了cookies并将其保存到本地文件中。注意,这里我们使用了pickle模块将cookies对象序列化并保存到文件中,以便后续使用。
同时,我们还使用了`driver.quit()`方法关闭了浏览器。
三、爬取某一部热门电影数据
前面我们已经把爬取豆瓣网的准备工作全部完成,然后接下来就是爬取豆瓣网中某一部热门电影的各种数据了
3.1、爬取全部长、短评论
爬取热门电影的全部长短评论可以获得以下信息:
- 用户评价:通过阅读用户的评论,可以了解用户对电影的评价、看法和推荐指数等信息,有助于我们更好地了解电影的口碑和观众反应。
- 关键词提取:通过分析评论文本提取关键词,可以了解电影的主题、情感、人物关系等信息,有助于我们深入了解电影的故事情节和风格。
- 数据分析:通过统计评论数量、评分分布、用户画像等数据,可以帮助我们更好地了解电影的市场表现和受众群体,为影视公司、制片人和电影院等决策者提供有价值的数据支持。
因此,爬取热门电影的全部长短评论是一项非常有价值的工作,可以为我们提供大量有用的信息和数据分析基础。
以下是一个使用BeautifulSoup和requests库爬取豆瓣网某部电影全部长、短评论说明的示例代码
import requests
from bs4 import BeautifulSoup# 设置请求头
headers = {'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'
}
# 豆瓣电影页面URL
url = 'https://movie.douban.com/subject/1292052/'
# 发送请求获取页面HTML
response = requests.get(url, headers=headers)
html = response.text
# 使用BeautifulSoup解析HTML
soup = BeautifulSoup(html, 'html.parser')
# 查找长评和短评标签
long_comments = soup.select_one('#hot-comments > div > div.article > span')
short_comments = soup.select_one('#comments > div > h2 > span')
# 提取评论数量并输出
long_comments_count = long_comments.text.replace('全部', '').replace('条', '').strip()
short_comments_count = short_comments.text.replace('全部', '').replace('条', '').strip()
print(f"长评:{long_comments_count}")
print(f"短评:{short_comments_count}")
# 查找所有长评和短评内容
long_comments_list = soup.select('#hot-comments > div > div.article > div > div.comment > p')
short_comments_list = soup.select('#comments > div > div.comment > p')
# 输出每个评论的内容
for comment in long_comments_list:print(comment.text.strip())
for comment in short_comments_list:print(comment.text.strip())
在以上代码中,我们首先设置了请求头,指定了请求的User-Agent信息。然后,我们定义了电影页面的URL,并发送了GET请求获取了页面的HTML。
接着,我们使用BeautifulSoup解析了页面的HTML,并查找了长评和短评标签。通过提取标签文本中的评论数量信息,我们可以输出电影的长、短评数量。
最后,我们再次使用CSS选择器查找所有长、短评内容,并通过遍历列表输出了每个评论的文本内容。
3.2、获取用户观影数据
获取用户观影数据可以帮助我们了解用户的观影喜好和习惯,可以通过分析用户的观影历史和评分记录等内容,得到以下信息:
- 用户偏好:根据用户观影历史和评分记录,可以了解用户的观影偏好和喜好,有助于我们推荐更符合用户口味的电影和影视作品
- 影视推荐:通过分析用户的观影历史和评分记录,可以为用户推荐更符合其口味的电影和影视作品,提高用户体验和满意度
- 数据分析:通过统计用户评分和观影记录,可以了解影片的市场表现和受众群体,为制片人、电影院和影视公司等提供有价值的数据分析支持
因此,获取用户观影数据是一项非常有价值的工作。以下是获取用户观影数据的Python代码示例:
import requests
import json# 登录豆瓣网
session = requests.session()
url = 'https://accounts.douban.com/j/mobile/login/basic'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3','Referer': 'https://accounts.douban.com/passport/login',
}
data = {'name': 'your_username', # 替换为自己的用户名'password': 'your_password', # 替换为自己的密码'remember': 'false',
}
session.post(url, headers=headers, data=data)
# 获取用户观影数据
uid = 'your_user_id' # 替换为自己的用户ID
url = 'https://movie.douban.com/subject_suggest?q=%E7%94%B5%E5%BD%B1' # 电影页面URL
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3','Referer': 'https://www.douban.com/',
}
response = session.get(url, headers=headers)
data = json.loads(response.text)
movie_id = data[0]['id'] # 获取电影ID
url = f'https://movie.douban.com/subject/{movie_id}/' # 获取电影详情页面URL
response = session.get(url, headers=headers)
url = response.url + 'comments?start=0&limit=20&status=P&sort=new_score' # 获取电影短评页面URL
response = session.get(url, headers=headers)
data = response.text
print(data) # 输出评论内容
以上代码示例中,我们首先需要登录豆瓣网,然后通过获取电影ID和电影详情页面URL来获取其热门评论页面的URL,最后通过发送HTTP请求获取评论数据。注意,需要设置请求头信息,以避免请求被网站屏蔽。
3.3、存入数据库
将获取的数据存入数据库的好处:
- 数据持久化:将数据存入数据库中可以保证数据长期保存,避免数据丢失的情况
- 数据分析:将数据存入数据库后,可以使用SQL等工具进行数据分析和数据挖掘,得到更深入的信息和结论
- 数据管理:将数据存入数据库后,可以方便对数据进行管理、查询和更新
以下是将获取的去重后的数据存入数据库的Python代码示例:
import requests
import json
import pymysql# 登录豆瓣网
session = requests.session()
url = 'https://accounts.douban.com/j/mobile/login/basic'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3','Referer': 'https://accounts.douban.com/passport/login',
}
data = {'name': 'your_username', # 替换为自己的用户名'password': 'your_password', # 替换为自己的密码'remember': 'false',
}
session.post(url, headers=headers, data=data)
# 获取用户观影数据
uid = 'your_user_id' # 替换为自己的用户ID
url = 'https://movie.douban.com/subject_suggest?q=%E7%94%B5%E5%BD%B1' # 电影页面URL
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3','Referer': 'https://www.douban.com/',
}
response = session.get(url, headers=headers)
data = json.loads(response.text)
movie_id = data[0]['id'] # 获取电影ID
url = f'https://movie.douban.com/subject/{movie_id}/' # 获取电影详情页面URL
response = session.get(url, headers=headers)
url = response.url + 'comments?start=0&limit=20&status=P&sort=new_score' # 获取电影短评页面URL
response = session.get(url, headers=headers)
data = response.json()
result = []
for comment in data['comments']:item = {'id': comment['id'],'user_name': comment['author']['name'],'rating': comment['rating']['value'],'create_time': comment['created_at'],'content': comment['content'],}result.append(item)
# 去重
result2 = []
for i in result:if i not in result2:result2.append(i)
# 存入数据库
db = pymysql.connect(host='localhost', user='root', password='123456', database='test')
cursor = db.cursor()
for item in result2:sql = f"insert into movie_comment (id, user_name, rating, create_time, content) values ({item['id']}, '{item['user_name']}', {item['rating']}, '{item['create_time']}', '{item['content']}')"cursor.execute(sql)
db.commit()
db.close()
以上代码示例中,我们使用Python连接到本地MySQL数据库,并将去重后的数据存入到数据库中的movie_comment表中。注意,需要根据自己的数据库用户名、密码、数据库名以及数据表名进行替换。
四、实战代码示例
由于豆瓣网对爬虫有一定的反爬虫策略,为了避免被封禁IP,代码中需要加入一些反爬虫措施,如设置请求间隔、使用代理IP、伪装请求头等。
以下是一个基于Python的爬虫示例,可以爬取指定电影的所有评论用户的观影习惯数据,并保存至CSV文件中:
import requestsfrom bs4 import BeautifulSoupimport csvimport timefrom random import randintMOVIE_URL = 'https://movie.douban.com/subject/xxxxxx/' # 请替换成具体电影的URL
CSV_FILE = 'douban.csv' # CSV文件名
# 设置请求头部信息,包括User-Agent和Referer
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3','Referer': MOVIE_URL,
}
# 设置代理IP列表,用于反爬虫策略
proxies = ['http://xxx.xxx.xx.xx:xxxx', 'http://yyy.yyy.yy.yy:yyyy', ...] # 请替换成实际的代理IP
# 设置请求间隔,用于反爬虫策略
WAIT_TIME = 1 # 单位为秒,可适当调整
# 定义函数获取指定URL的HTML内容def get_html(url):try:proxy = {'http': proxies[randint(0, len(proxies)-1)]} # 从代理IP列表中随机选择一个代理response = requests.get(url, headers=headers, proxies=proxy)if response.status_code == 200:return response.textexcept requests.exceptions.RequestException as e:print(e)return None
# 获取评论用户主页链接def get_user_link(comment_soup):try:user_tag = comment_soup.find('span', class_='comment-info').find('a')user_link = user_tag.get('href')return user_linkexcept:return None
# 解析评论用户主页,获取观影习惯数据def get_user_data(user_link):user_data = {}html = get_html(user_link)time.sleep(WAIT_TIME)if html:soup = BeautifulSoup(html, 'html.parser')# 获取用户常看类型try:type_tags = soup.find_all('span', class_='tags-body')type_list = [t.text.strip() for t in type_tags]user_data['type'] = ','.join(type_list)except:user_data['type'] = ''# 获取用户评分前几名的电影(除当前电影外)user_data['top_movies'] = ''try:movie_tags = soup.find_all('div', class_='info')movie_list = []for tag in movie_tags:movie_name_tag = tag.find('a', class_='title')if movie_name_tag and movie_name_tag['href'] != MOVIE_URL: # 排除当前电影movie_list.append(movie_name_tag.text)if len(movie_list) >= 5: # 最多获取前5名breakuser_data['top_movies'] = ','.join(movie_list)except:passreturn user_data
# 主函数def main():print('开始爬取...')# 获取评论列表comments = []page = 0while True:page += 1url = MOVIE_URL + 'comments?start=' + str((page-1) * 20)html = get_html(url)time.sleep(WAIT_TIME)if html:soup = BeautifulSoup(html, 'html.parser')comment_tags = soup.find_all('div', class_='comment-item')if comment_tags:comments.extend(comment_tags)else:break # 没有更多评论else:break # 请求失败# 获取每个评论用户的观影习惯数据user_data_list = []for comment in comments:user_link = get_user_link(comment)if user_link:user_data = get_user_data(user_link)user_data_list.append(user_data)print('已爬取 {} 个用户观影数据'.format(len(user_data_list)))time.sleep(WAIT_TIME)# 将数据保存至CSV文件with open(CSV_FILE, mode='w', encoding='utf-8', newline='') as f:fieldnames = ['type', 'top_movies']writer = csv.DictWriter(f, fieldnames=fieldnames)writer.writeheader()for data in user_data_list:writer.writerow(data)print('爬取完成,数据已保存至 {} 文件中。'.format(CSV_FILE))
if __name__ == '__main__':main()
需要注意的是,以上代码仅供参考,实际使用时需要根据具体情况进行调整。另外,爬虫涉及到的法律问题和道德问题需要认真考虑,不要用于非法用途或侵犯他人隐私等行为。
需要注意的几点:
- 为了避免被豆瓣网封禁IP,建议设置访问间隔时间至少为1秒
- 豆瓣网的HTML代码变化频繁,需要不断调整解析代码以适应新的HTML格式
- 爬取用户信息可能涉及到用户隐私,应严格按照相关法律法规来进行。
五、总结
爬取豆瓣网电影评论用户的观影习惯数据能够得出用户的观影时间偏好、观影类型偏好、观影评分偏好、观影影院偏好和地理位置偏好等信息。通过这些数据分析,豆瓣网能够更好地为用户推荐电影和为广告主提供更精准的广告投放服务。
相关文章:

【Python】爬虫练习-爬取豆瓣网电影评论用户的观影习惯数据
目录 前言 一、配置环境 1.1、 安装Python 1.2、 安装Requests库和BeautifulSoup库 1.3.、安装Matplotlib 二、登录豆瓣网(重点) 2.1、获取代理 2.2、测试代理ip是否可用 2.3、设置大量请求头随机使用 2.4、登录豆瓣网 三、爬取某一部热门电影…...
webpack基础配置【总结】
webpack打包原理: webpack是一个js应用程序的静态模块打包工具,当webpack处理应用程序时,它的内部构建一个依赖图,此时依赖会映射项目中所需的每个模块,并生成一个或多个bundle包。因此我们会安装配置各种打包规则&…...

typescript 支持与本地调试
typescript 支持与本地调试 typescript 支持与本地调试 前言支持 typescript函数的本地调试 启用 node-terminal 调试invoke localserverless-offline Next Chapter完整示例及文章仓库地址 前言 在上一章节,我们创建了一个 hello world 函数,并把它顺…...
后端面试话术集锦第 十八 篇:JVM面试话术
这是后端面试集锦第十八篇博文——JVM面试话术❗❗❗ 1. 介绍下JVM JVM主要包括:类加载器(class loader)、执行引擎(exection engine)、本地接口(native interface)、运行时数据区(Runtimedata area) 类加载器:加载类文件到内存。Class loader只管加载,只要符合文件…...

“历久弥新 | 用AI修复亚运珍贵史料”活动震撼来袭!
时隔近半个世纪,新中国第一次参与亚运会的影像资料将首次对外披露。只是年代久远,老照片老视频都有了岁月痕迹,画面不再清晰,这些珍贵史料急需你的帮助! 一、活动介绍 2023年,正值亚运110周年,…...
uni-app 之 scroll-view和swiper
uni-app 之 scroll-view和swiper <!-- vue2的<template>里必须要有一个盒子,不能有两个,这里的盒子就是 view--> <template><view><navigator url"/pages/home/home"><button style"background: #ff00f…...
Harmony网络请求工具类
使用的网络请求框架是axios 1、安装axios ohpm install @ohos/axios2、封装 import axios, { FormData } from "@ohos/axios" import fs from @ohos.file.fs import ArrayList from @ohos.util.ArrayList/*** 网络请求工具类*/ class HttpManager {baseUrl:string…...
【Python 自动化】自媒体剪辑第一版·思路简述与技术方案
大家都知道我主业是个运维开发(或者算法工程师),每天时间不多,但我又想做自媒体。然后呢,我就想了个方案,每天起来之后写个短视频的脚本,包含一系列图片和文字,然后上班的时候给它提…...
【前端】webpack打包去除console.log
0 问题 需要在打包的时候,自动地去除掉所有console.log 1 方法 // vue.config.js //... module.exports {//...config.optimization.minimizer[0].iptions.terserOptions.compress.drop_console true//... } //...也可以用if(process.env.NODE_ENV production…...

docker使用(二)提交到dockerhub springboot制作镜像
docker使用(二) dockerhub创建账号创建存储库成功!开始推送获取image名 提交成功SpringBoot项目制作Dockerfile镜像部署打jar包 dockerhub创建账号 (自认为可以理解为github一类的东西) 单击创建存储库按钮。 设定存…...
antd中Popover 气泡卡片样式修改
最近在开发react项目的一个新需求时,遇到气泡卡片Popover组件样式调整的问题,发现不管是在标签中设置className属性,还是在<Popover>标签中直接设置style属性,都不起作用。 最后搜索查阅发现要使用overlayClassName index…...

3月面试华为被刷,准备半年,9月二战华为终于上岸,要个27K不过分吧?
终于二战上岸了,二战华为也并不是说非华为不可,只是觉得心里憋着一口气,这就导致我当时有其他比较好的offer,我也没有去,就是想上岸华为来证明自己,现在也算是如愿了,来跟大伙们分享一下~ 个人情况 我本人…...

Kali之BurpSuite_pro安装配置
文章目录 配置jdk环境安装BurpSuitePro设置快捷方式启动方式 BurpSuite2021专业版本地址: 下载链接:https://pan.baidu.com/s/1PjzcukRDoc_ZFjrNxI8UjA 提取码:nwm7 我的安装工具都在/home/kali/tools/ 解压后我放在burpsuite_pro目录下 把j…...
双指针算法总结
双指针 常见的双指针有两种形式:对撞指针,左右指针。 对撞指针: 对撞指针一般用于顺序结构中,也称左右指针。 • 对撞指针从两端向中间移动。以个指针从最左端开始,另⼀个从最右端开始,然后逐渐往中间逼…...

开源照片管理服务LibrePhotos
本文是为了解决网友 赵云遇到的问题,顺便折腾的。虽然软件跑起来了,但是他遇到的问题,超出了老苏的认知。当然最终问题还是得到了解决,不过与 LibrePhotos 无关; 什么是 LibrePhotos ? LibrePhotos 是一个自托管的开源…...
Linux指令
1 Linux 系统目录结构 /bin 存放系统指令(可执行文件) /boot 存放linux系统开机引导程序 /dev 存放设备文件的地方 /etc 存放系统配置文件的地方 /home 存放用户家目录的地方。 /lib和/lib64 存放系统动态链接库的地方。 /lostfound linux文件系统下特有…...

如何在Mac电脑上安装WeasyPrint:简单易懂的步骤
1. 安装homebrew 首先需要确保安装了homebrew,通过homebrew安装weasyprint可以将需要的库都安装好,比pip安装更简单快捷。 安装方法如下: /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)&qu…...

手机电脑scoket通信 手机软件 APP inventor 服务端程序python
python scoket 通信 再帮助同学坐课题的时候接触到了scoket通信,了解到这应该是基层网络通信的原理,于是就导出搜索了一下相关的资料,简单来说scoket通信就是,可以让不同设备在同一个网络环境的条件下,可以实现相互通…...
软考高级之系统架构师之系统安全性和保密性设计
今天是2023年08月31日,距离软考高级只有65天,加油! 备注:资料搜集自网络。 基础 信息必须依赖于存储、传输、处理及应用的载体(媒介)而存在。信息系统安全可以划分设备安全、数据安全、内容安全和行为安…...

FPGA实现电机转速PID控制
通过纯RTL实现电机转速PID控制,包括电机编码器值读取,电机速度、正反转控制,PID算法,卡尔曼滤波,最终实现对电机速度进行控制,使其能够渐近设定的编码器目标值。 一、设计思路 前面通过SOPC之NIOS Ⅱ实现电…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
2.2.2 ASPICE的需求分析
ASPICE的需求分析是汽车软件开发过程中至关重要的一环,它涉及到对需求进行详细分析、验证和确认,以确保软件产品能够满足客户和用户的需求。在ASPICE中,需求分析的关键步骤包括: 需求细化:将从需求收集阶段获得的高层需…...

Axure零基础跟我学:展开与收回
亲爱的小伙伴,如有帮助请订阅专栏!跟着老师每课一练,系统学习Axure交互设计课程! Axure产品经理精品视频课https://edu.csdn.net/course/detail/40420 课程主题:Axure菜单展开与收回 课程视频:...
Docker、Wsl 打包迁移环境
电脑需要开启wsl2 可以使用wsl -v 查看当前的版本 wsl -v WSL 版本: 2.2.4.0 内核版本: 5.15.153.1-2 WSLg 版本: 1.0.61 MSRDC 版本: 1.2.5326 Direct3D 版本: 1.611.1-81528511 DXCore 版本: 10.0.2609…...

RabbitMQ 各类交换机
为什么要用交换机? 交换机用来路由消息。如果直发队列,这个消息就被处理消失了,那别的队列也需要这个消息怎么办?那就要用到交换机 交换机类型 1,fanout:广播 特点 广播所有消息:将消息…...
当下AI智能硬件方案浅谈
背景: 现在大模型出来以后,打破了常规的机械式的对话,人机对话变得更聪明一点。 对话用到的技术主要是实时音视频,简称为RTC。下游硬件厂商一般都不会去自己开发音视频技术,开发自己的大模型。商用方案多见为字节、百…...
Android多媒体——音/视频数据播放(十八)
在媒体数据完成解码并准备好之后,播放流程便进入了最终的呈现阶段。为了确保音视频内容能够顺利输出,系统需要首先对相应的播放设备进行初始化。只有在设备初始化成功后,才能真正开始音视频的同步渲染与播放。这一过程不仅影响播放的启动速度,也直接关系到播放的稳定性和用…...