【Python爬虫(60)】解锁社交媒体数据宝藏:Python爬虫实战攻略
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取,还涉及数据处理与分析。无论是新手小白还是进阶开发者,都能从中汲取知识,助力掌握爬虫核心技能,开拓技术视野。
目录
- 一、某博数据爬取
- 1.1 准备工作
- 1.2 获取用户信息
- 1.3 某博内容爬取
- 1.4 评论获取
- 二、某音数据爬取
- 2.1 环境搭建
- 2.2 视频信息提取
- 2.3 用户粉丝关系获取
- 2.4 点赞评论数据爬取
- 三、应对反爬虫机制
- 3.1 某博反爬虫策略及应对
- 3.2 某音反爬虫策略及应对
- 四、数据隐私问题处理
- 4.1 法律法规遵守
- 4.2 数据脱敏处理
- 五、总结与展望
一、某博数据爬取
1.1 准备工作
在进行某博数据爬取之前,我们需要准备好一些必要的工具,主要是安装和导入相关的 Python 库。首先是requests库,它是一个用于发送 HTTP 请求的强大库,使用它可以方便地与某博服务器进行交互,获取网页内容。通过pip install requests命令即可完成安装,安装完成后在代码中使用import requests导入。
BeautifulSoup库也是不可或缺的,它主要用于解析 HTML 和 XML 文档,能够帮助我们从获取到的网页内容中提取出我们需要的数据,比如某博的用户信息、某博内容等。安装命令为pip install beautifulsoup4 ,导入方式是from bs4 import BeautifulSoup。
另外,如果需要处理 JSON 数据格式(某博 API 返回的数据很多是 JSON 格式),还需要用到 Python 内置的json库,直接使用import json导入即可。
1.2 获取用户信息
获取某博用户信息有两种常见的方式,一种是通过某博 API,另一种是通过网页解析。
使用某博 API 获取用户信息,首先需要在某博开放平台注册并创建应用,获取 App Key、App Secret 等认证信息。以获取用户基本信息(如昵称、粉丝数、关注数等)为例,使用weibo库(需提前安装,pip install weibo ),代码示例如下:
from weibo import APIClientAPP_KEY = '你的App Key'
APP_SECRET = '你的App Secret'
CALLBACK_URL = 'https://api.weibo.com/oauth2/default.html'client = APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=CALLBACK_URL)
# 获取授权码等步骤省略
access_token = '你的access_token'
client.set_access_token(access_token, '123456') # 假设用户ID为123456
user_info = client.users.show.get(uid='123456')
nickname = user_info['screen_name']
followers_count = user_info['followers_count']
friends_count = user_info['friends_count']
print(f"昵称: {nickname}, 粉丝数: {followers_count}, 关注数: {friends_count}")
如果通过网页解析获取用户信息,可以先发送 HTTP 请求获取用户主页内容,然后使用BeautifulSoup进行解析。例如:
url = 'https://weibo.com/u/123456' # 假设用户ID为123456
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
nickname = soup.find('a', class_='name').text
followers_count = soup.find('li', class_='followed').find('em').text
friends_count = soup.find('li', class_='following').find('em').text
print(f"昵称: {nickname}, 粉丝数: {followers_count}, 关注数: {friends_count}")
1.3 某博内容爬取
爬取某博内容同样可以通过 API 或网页解析实现。通过 API 获取某博内容时,以获取某个用户发布的某博列表为例:
statuses = client.statuses.user_timeline.get(uid='123456', count=20) # 获取20条某博
for status in statuses['statuses']:text = status['text']pic_urls = status.get('pic_urls', [])created_at = status['created_at']print(f"某博内容: {text}, 图片链接: {pic_urls}, 发布时间: {created_at}")
通过网页解析爬取某博内容时,要注意某博内容很多是动态加载的。以抓取某个用户的某博内容为例,可能需要分析网页的 XHR(XMLHttpRequest)请求,找到加载某博内容的接口。假设找到接口为https://m.weibo.cn/api/container/getIndex ,参数type=uid ,value=123456 (用户 ID),containerid=107603123456 :
url = 'https://m.weibo.cn/api/container/getIndex'
params = {'type': 'uid','value': '123456','containerid': '107603123456'
}
response = requests.get(url, params=params)
data = response.json()
for card in data['data']['cards']:if 'mblog' in card:mblog = card['mblog']text = mblog['text']pic_urls = mblog.get('pic_urls', [])created_at = mblog['created_at']print(f"某博内容: {text}, 图片链接: {pic_urls}, 发布时间: {created_at}")
1.4 评论获取
获取某博评论可以通过分析评论页面的网络请求来实现。一般来说,某博评论也是通过 AJAX 请求动态加载的。例如,对于某条某博,其评论接口可能是https://m.weibo.cn/comments/hotflow ,参数包括某博的id等。
weibo_id = '4900000000000000' # 某博ID
url = 'https://m.weibo.cn/comments/hotflow'
params = {'id': weibo_id,'mid': weibo_id,'max_id_type': '0'
}
response = requests.get(url, params=params)
data = response.json()
for comment in data['data']['data']:comment_text = comment['text']comment_user = comment['user']['screen_name']comment_created_at = comment['created_at']print(f"评论内容: {comment_text}, 评论者: {comment_user}, 评论时间: {comment_created_at}")
在实际获取评论时,还需要解决评论与某博内容对应的问题。可以在获取某博内容时,记录下每条某博的唯一标识(如某博 ID),在获取评论时,通过评论接口中的参数(如某博 ID)来确保获取的评论是对应某博的 。同时,由于某博评论可能较多,可能需要分页获取,通过修改请求参数中的max_id等实现分页。
二、某音数据爬取
2.1 环境搭建
要进行某音数据爬取,首先需要搭建合适的环境。Python 的requests库是必不可少的,用于发送 HTTP 请求,和某音服务器进行通信,通过pip install requests进行安装。
BeautifulSoup库用于解析 HTML 和 XML 文档,方便从某音网页中提取数据,安装命令为pip install beautifulsoup4 。
如果需要进行模拟浏览器操作,比如处理登录、获取动态加载的数据等,Selenium库是个不错的选择。Selenium可以驱动真实的浏览器,如 Chrome、Firefox 等,安装方式为pip install selenium 。同时,还需要下载对应浏览器的驱动,例如 Chrome 浏览器需要下载 ChromeDriver,将其路径添加到系统环境变量中。
此外,由于某音数据很多以 JSON 格式返回,json库(Python 内置)用于处理 JSON 数据,直接导入即可使用。
2.2 视频信息提取
获取某音视频信息有多种途径。如果是通过网页端获取,首先要分析某音网页的结构。在浏览器中打开某音视频页面,按F12键打开开发者工具,切换到 “Network” 选项卡,刷新页面,就可以看到浏览器与服务器之间的通信请求。
通过分析这些请求,我们可以找到包含视频信息的接口。例如,某个视频的信息可能在一个类似https://www.douyin.com/aweme/v1/aweme/detail/?aweme_id=视频ID的接口中返回,其中aweme_id是视频的唯一标识。使用requests库发送请求获取该接口的数据:
import requestsaweme_id = '6900000000000000000'
url = f'https://www.douyin.com/aweme/v1/aweme/detail/?aweme_id={aweme_id}'
response = requests.get(url)
if response.status_code == 200:data = response.json()video_title = data['aweme_detail']['desc']digg_count = data['aweme_detail']['statistics']['digg_count']comment_count = data['aweme_detail']['statistics']['comment_count']share_count = data['aweme_detail']['statistics']['share_count']print(f"视频标题: {video_title}, 点赞数: {digg_count}, 评论数: {comment_count}, 转发数: {share_count}")
如果是从 APP 端获取视频信息,可以使用抓包工具,如 Fiddler、Charles 等。以 Fiddler 为例,首先需要将手机和电脑连接到同一局域网,然后配置手机的代理为电脑的 IP 和 Fiddler 的端口(默认 8888) 。在手机上打开某音 APP,播放视频,Fiddler 就能捕获到手机与某音服务器之间的通信数据包。通过分析这些数据包,找到包含视频信息的请求,提取其中的数据。
2.3 用户粉丝关系获取
获取某音用户粉丝关系可以通过某音 API 或者特定的网页分析方法。
使用某音 API 获取粉丝列表和关注列表时,需要先在某音开放平台注册并创建应用,获取相关的认证信息。以获取用户粉丝列表为例,假设 API 接口为https://api.amemv.com/aweme/v1/user/follower/list/ ,参数包括user_id(用户 ID)、max_time(获取列表的最后一条数据的创建时间,用于分页)、count(每页返回的数据量)等。代码示例如下:
import requests
import jsonuser_id = '123456789'
max_time = 0
count = 20
followers = []while True:url = f'https://api.amemv.com/aweme/v1/user/follower/list/?user_id={user_id}&max_time={max_time}&count={count}'response = requests.get(url)if response.status_code == 200:data = json.loads(response.text)has_more = data.get('has_more')if not has_more:breakmax_time = data.get('max_time')followers += data.get('followers', [])else:breakfor follower in followers:follower_nickname = follower['nickname']follower_uid = follower['uid']print(f"粉丝昵称: {follower_nickname}, 粉丝ID: {follower_uid}")
通过网页分析方法获取粉丝关系时,需要分析用户主页的 HTML 结构和相关的 JavaScript 代码。在用户主页中,粉丝列表和关注列表通常是通过 AJAX 请求动态加载的。通过查找这些 AJAX 请求的接口,发送请求并解析返回的数据,从而获取粉丝和关注者的信息。同时,可以通过分析粉丝和关注者之间的相互关系,比如 A 关注了 B,B 是否也关注了 A,统计出互相关注的用户数量等。
2.4 点赞评论数据爬取
获取某音视频点赞用户列表、评论内容及评论者信息可以通过以下方法。
对于点赞用户列表,同样可以通过分析某音网页或 APP 的请求来获取。在网页端,点赞用户列表可能在一个类似https://www.douyin.com/aweme/v1/aweme/digg/list/?aweme_id=视频ID的接口中返回,通过发送请求并解析 JSON 数据,可以获取点赞用户的信息:
import requests
import jsonaweme_id = '6900000000000000000'
url = f'https://www.douyin.com/aweme/v1/aweme/digg/list/?aweme_id={aweme_id}'
response = requests.get(url)
if response.status_code == 200:data = response.json()for digg_user in data['digg_list']:digg_user_nickname = digg_user['nickname']digg_user_uid = digg_user['uid']print(f"点赞用户昵称: {digg_user_nickname}, 点赞用户ID: {digg_user_uid}")
获取评论内容及评论者信息时,在网页端,评论数据可能在https://www.douyin.com/aweme/v1/comment/list/?aweme_id=视频ID接口中返回。并且由于评论可能较多,需要处理分页问题,通过修改请求参数中的cursor(游标,用于标识下一页的起始位置)和count(每页评论数量)来获取下一页的评论数据:
import requests
import jsonaweme_id = '6900000000000000000'
cursor = 0
count = 20while True:url = f'https://www.douyin.com/aweme/v1/comment/list/?aweme_id={aweme_id}&cursor={cursor}&count={count}'response = requests.get(url)if response.status_code == 200:data = response.json()for comment in data['comments']:comment_text = comment['text']comment_user_nickname = comment['user']['nickname']print(f"评论内容: {comment_text}, 评论者昵称: {comment_user_nickname}")has_more = data['has_more']if not has_more:breakcursor = data['cursor']else:break
在 APP 端,同样可以使用抓包工具捕获评论相关的请求,按照类似的方法提取评论数据。
三、应对反爬虫机制
3.1 某博反爬虫策略及应对
某博作为一个拥有庞大用户群体和海量数据的社交媒体平台,为了保护自身数据安全和服务器稳定,采取了一系列严格的反爬虫机制。
IP 限制是某博常用的反爬虫手段之一。当某博服务器检测到某个 IP 在短时间内发送大量请求时,会认为该 IP 可能是爬虫程序,进而对其进行限制,比如限制该 IP 的访问频率,或者直接封禁该 IP 一段时间。例如,若一个 IP 在 1 分钟内对某博接口发起超过 100 次请求,就可能会被限制访问。
验证码机制也是某博反爬虫的重要组成部分。当某博怀疑某个请求可能来自爬虫时,会弹出验证码要求用户输入。验证码的形式多种多样,有数字字母混合的图片验证码,也有滑动拼图验证码等。比如在获取大量某博评论时,频繁请求可能就会触发验证码。
User - Agent 检测同样不可忽视。某博服务器会检查请求头中的 User - Agent 字段,判断请求是否来自真实的浏览器。如果 User - Agent 字段不符合常见浏览器的特征,或者多个请求的 User - Agent 字段完全相同,就可能被判定为爬虫请求。
针对某博的这些反爬虫机制,我们可以采取相应的应对策略。使用代理 IP 是突破 IP 限制的有效方法。通过搭建代理 IP 池,每次请求时随机从代理 IP 池中获取一个 IP,这样可以避免因单个 IP 请求过于频繁而被限制。例如,可以使用知名的代理 IP 服务提供商,如阿布云、讯代理等,获取高质量的代理 IP。
设置合理请求头也至关重要。在请求头中,除了设置随机的 User - Agent,还可以添加其他常见的字段,如 Accept、Accept - Encoding、Accept - Language 等,使其更接近真实浏览器的请求。比如:
headers = {'User - Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8','Accept - Encoding': 'gzip, deflate, br','Accept - Language': 'zh - CN,zh;q=0.9'
}
模拟用户行为同样能有效应对反爬虫。在请求之间设置合理的时间间隔,模拟真实用户浏览网页的速度。比如,在获取某博内容时,每次请求后随机等待 3 - 5 秒再发送下一次请求,避免短时间内的大量集中请求。
3.2 某音反爬虫策略及应对
某音作为短视频领域的巨头,其反爬虫机制也相当复杂和严格。
设备指纹识别是某音独特的反爬虫手段之一。某音会收集设备的各种信息,如设备型号、操作系统版本、屏幕分辨率、浏览器信息等,生成一个唯一的设备指纹。如果发现多个请求来自具有相同设备指纹但行为异常(如请求频率过高)的设备,就可能判定为爬虫行为。
频繁请求限制也是某音常用的反爬虫策略。某音会对每个设备或 IP 的请求频率进行监控,当请求频率超过一定阈值时,就会限制该设备或 IP 的访问。例如,若一个设备在 10 分钟内请求某音视频接口超过 500 次,就可能被限制访问。
为了应对某音的反爬虫机制,使用无头浏览器是一种可行的方法。无头浏览器可以在没有图形界面的情况下运行浏览器,模拟真实用户的操作。比如使用 Puppeteer(Node.js 库)或 Selenium 配合 Chrome 无头浏览器,通过编写脚本模拟用户登录、浏览视频页面等操作,获取所需数据。以 Puppeteer 为例:
const puppeteer = require('puppeteer');(async () => {const browser = await puppeteer.launch({headless: true});const page = await browser.newPage();await page.goto('https://www.douyin.com');// 在这里进行数据提取等操作await browser.close();
})();
随机化请求参数也能降低被检测到的风险。在发送请求时,对请求参数进行随机化处理,如添加随机的时间戳、随机的请求 ID 等。例如,在请求某音视频接口时,将时间戳参数timestamp设置为当前时间加上一个随机的毫秒数:
import random
import timetimestamp = int(time.time() * 1000) + random.randint(100, 999)
params = {'aweme_id': '视频ID','timestamp': timestamp
}
控制请求频率同样重要。根据某音的请求频率限制,合理设置请求间隔,避免频繁请求。可以使用 Python 的time.sleep()函数,在每次请求后等待一定时间,如每次请求后等待 5 - 10 秒再发送下一次请求。
四、数据隐私问题处理
4.1 法律法规遵守
在社交媒体数据爬取过程中,严格遵守相关法律法规是首要原则。以我国为例,《中华人民共和国个人信息保护法》明确规定了个人信息的收集、使用、存储等各个环节的规范 。该法律强调,收集个人信息应当遵循合法、正当、必要和诚信原则,不得通过误导、欺诈、胁迫等方式获取个人信息。
在爬取某博和某音数据时,我们只能获取公开的数据,对于用户设置为隐私的数据,绝对不能通过不正当手段获取。例如,在爬取某博用户信息时,对于用户未公开的私信内容、地理位置等敏感信息,不能进行爬取。在某音数据爬取中,对于用户未公开的收藏列表、历史浏览记录等也应予以尊重,不进行非法获取。
同时,要遵守平台自身的使用条款和服务协议。某博和某音都在其平台规则中明确了数据的使用范围和方式,我们在爬取数据时必须严格按照这些规则进行操作。如果违反平台规则,可能会面临法律风险,同时也会损害自身的声誉和利益。
4.2 数据脱敏处理
对爬取到的数据进行脱敏处理是保护用户隐私的重要手段。在某博数据中,对于用户的真实姓名、身份证号(若有涉及)、手机号码等敏感信息,可以采用替换的方法进行脱敏。比如将真实姓名替换为 “[用户姓名]”,将手机号码替换为 “[手机号码]”。
对于某音数据,若爬取到用户的身份证号,可以采用部分隐藏的方式,将中间几位数字用星号代替,如 “110101********1234”。对于用户的家庭住址等敏感信息,如果在数据中存在,可进行模糊化处理,只保留城市名称,如将 “北京市海淀区中关村大街 1 号” 脱敏为 “北京市” 。
在实际操作中,可以使用 Python 的正则表达式库re来实现数据脱敏。以替换手机号码为例:
import rephone_number = "13800138000"
masked_phone = re.sub(r'\d{4}\d{4}\d{4}', '**** **** ****', phone_number)
print(masked_phone)
对于一些包含敏感信息的文本内容,如某博评论、某音视频描述等,可以使用自然语言处理技术,先识别出其中的敏感信息,再进行相应的脱敏处理。例如,使用预训练的命名实体识别模型(如基于 BERT 的命名实体识别模型),识别出文本中的人名、地名、组织机构名等敏感信息,然后进行脱敏。
五、总结与展望
社交媒体数据爬取是一个充满挑战与机遇的领域。通过对某博和某音等社交媒体平台的数据爬取,我们能够获取到丰富的用户信息、内容数据以及社交关系数据,这些数据为市场分析、舆情监测、用户行为研究等提供了重要的支持。在爬取过程中,掌握某博和某音的数据爬取方法,包括获取用户信息、内容、评论以及粉丝关系等,是实现数据收集的基础。
同时,我们必须重视并有效应对社交媒体平台严格的反爬虫机制。通过使用代理 IP、设置合理请求头、模拟用户行为、使用无头浏览器、随机化请求参数以及控制请求频率等策略,能够在一定程度上突破反爬虫限制,确保数据爬取的顺利进行。
在数据隐私问题上,遵守法律法规是不可逾越的底线,对爬取到的数据进行脱敏处理是保护用户隐私的必要手段。只有在合法合规且尊重用户隐私的前提下进行数据爬取和使用,才能实现数据的价值最大化。
展望未来,随着社交媒体平台的不断发展和技术的进步,社交媒体数据爬取将面临更多的挑战。一方面,平台的反爬虫机制会不断升级,可能会采用更先进的技术手段来检测和阻止爬虫行为,这就要求我们不断探索新的反反爬虫技术和策略。另一方面,数据隐私和安全问题将受到越来越严格的监管,我们需要更加深入地研究如何在满足数据需求的同时,更好地保护用户隐私和数据安全。
随着人工智能和大数据技术的不断融合,社交媒体数据爬取与分析也将迎来新的发展机遇。例如,利用深度学习技术实现更精准的验证码识别、更智能的反爬虫规避策略,以及对海量社交媒体数据进行更深入的挖掘和分析,为各领域的决策提供更有价值的参考。
相关文章:
【Python爬虫(60)】解锁社交媒体数据宝藏:Python爬虫实战攻略
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取ÿ…...
Comfy UI 快捷键
Comfy UI 页面的快捷键操作(记录下,以防忘记): 捷径命令Ctrl Enter将当前图表排队等待生成Ctrl Shift Enter将当前图表排成第一个生成图表Ctrl Z/Ctrl Y撤消/重做Ctrl S保存工作流程Ctrl O加载工作流Ctrl A选择所有节点A…...
【C++】Arrays
《C程序设计基础教程》——刘厚泉,李政伟,二零一三年九月版,学习笔记 文章目录 1、一维数组的定义与初始化1.1、一维数组的定义1.2、一维数组的初始化 2、一维数组的使用3、一维数组与函数4、二维数组4.1、二维数组的定义4.2、二维数组的初始…...
EX_25/2/24
写一个三角形类,拥有私有成员 a,b,c 三条边 写好构造函数初始化 abc 以及 abc 的set get 接口 再写一个等腰三角形类,继承自三角形类 1:写好构造函数,初始化三条边 2:要求无论如何,等腰三角形类对象&#x…...
批量导出数据库表到Excel
这篇文章将介绍如何批量的将多个甚至成千上万的数据库表导出为Excel文件。 准备数据 如下图是数据库里的表,我们需要将它们全部导出为excel文件,这里以SQL Server数据库为例 新增导出 打开的卢导表工具,新建数据库连接,这里以S…...
代码随想录D52-53 图论 Python
目录 101. 孤岛的总面积 102. 沉没孤岛 103. 水流问题 104. 建造最大岛屿 101. 孤岛的总面积 要点: 整体来说是一个图着色的问题。 这道题目的思路符合直觉,但代码实现会和直觉有差别。如果仅使用visit记录不使用着色,会遇到非常多的…...
机器学习(部分算法、模型)
一、KNN 算法 原理 K-近邻算法(K-Nearest Neighbors,简称KNN),根据K个邻居样本的类别来判断当前样本的类别; 如果一个样本在特征空间中的k个最相似(最邻近)样本中的大多数属于某个类别,则该类本也属于这个类别 比如: 有10000个样…...
axios几种请求类型的格式
Axios 是一个基于 Promise 的 HTTP 客户端,广泛用于浏览器和 Node.js 中发送 HTTP 请求。它支持多种请求格式,包括 GET、POST、PUT、DELETE 等。也叫RESTful 目录 一、axios几种请求类型的格式 1、get请求 2、post请求 3、put请求 4、delete请求 二…...
SpringBoot使用Jasypt对YML文件配置内容进行加密(例:数据库密码加密)
SpringBoot使用Jasypt对YML文件配置内容进行加密(例:数据库密码加密) 前言 在SpringBoot的项目开发中,大多数情况下 yml 配置文件中存储的密码均以明文形式展示,这种方式显然存在较大的安全隐患。一旦有开发人员离职&…...
【C语言】指针笔试题
前言:上期我们介绍了sizeof与strlen的辨析以及sizeof,strlen相关的一些笔试题,这期我们主要来讲指针运算相关的一些笔试题,以此来巩固我们之前所学的指针运算! 文章目录 一,指针笔试题1,题目一…...
力扣 下一个排列
交换位置,双指针,排序。 题目 下一个排列即在组成的排列中的下一个大的数,然后当这个排列为降序时即这个排列最大,因为大的数在前面,降序排列的下一个数即升序。所以,要是想找到当前排列的下一个排列&…...
Three.js 快速入门教程【八】常见材质类型
系列文章目录 Three.js 快速入门教程【一】开启你的 3D Web 开发之旅 Three.js 快速入门教程【二】透视投影相机 Three.js 快速入门教程【三】渲染器 Three.js 快速入门教程【四】三维坐标系 Three.js 快速入门教程【五】动画渲染循环 Three.js 快速入门教程【六】相机控件 Or…...
python~http的请求参数中携带map
背景 调试 http GET请求的 map 参数,链路携带参数一直有问题,最终采用如下方式携带map 解决 user{"demo":"true","info":"王者"}url encode之后的效果如下所示 user%7B%22demo%22:%22true%22,%22info%22:%22…...
爬虫第九篇-结束爬虫循环
最近在学习Python爬虫的过程中,遇到了一个很有趣的问题:如何优雅地结束爬虫循环?今天,我想和大家分享一下我的发现和心得。 一、爬虫循环结束的常见问题 在写爬虫时,我们经常会遇到这样的情况:当爬取到的…...
考研/保研复试英语问答题库(华工建院)
华南理工大学建筑学院保研/考研 英语复试题库,由华工保研er和学硕笔试第一同学一起整理,覆盖面广,助力考研/保研上岸!需要👇载可到文章末尾见小🍠。 以下是主要内容: Part0 复试英语的方法论 Pa…...
《Effective Objective-C》阅读笔记(中)
目录 接口与API设计 用前缀避免命名空间冲突 提供“全能初始化方法” 实现description方法 尽量使用不可变对象 使用清晰而协调的命名方式 方法命名 编辑类与协议命名 为私有方法名加前缀 理解OC错误模型 理解NSCopying协议 协议与分类 通过委托与数据源协议进行…...
前端如何解决跨域
解决前端跨域问题有多种方法 JSONP:利用 <script> 标签的跨域能力,通过动态创建 script 标签并指定回调函数来获取数据。但只能处理 GET 请求,安全性较低。 JSONP 的原理是利用了 <script> 标签的跨域能力。因为浏览器允许 <…...
【HDLbits--Comb组合逻辑】
HDLbits--Comb组合逻辑 1.5 组合逻辑1.5 Demo 在 Verilog 中,组合逻辑(Combinational Logic)是指输出仅依赖于当前输入的逻辑电路,没有记忆功能(即没有状态存储)。组合逻辑的特点是: 无时钟信号…...
如何在 Linux 上安装和配置 Zsh
文章目录 如何在 Linux 上安装和配置 Zsh1. 安装 Zsh1.1 在 Ubuntu/Debian 上安装1.2 在 CentOS/RHEL/Fedora 上安装1.3 在 Arch Linux 上安装1.4 验证 Zsh 安装 2. 设置 Zsh 为默认 Shell2.1 验证默认 shell 3. 配置 Zsh3.1 使用 Oh My Zsh3.1.1 安装 Oh My Zsh3.1.2 启用插件…...
Chromedriver与Chrome版本映射表
Chromedriver与Chrome版本映射表如下: Chrome 71-73版本对应Chromedriver 2.46Chrome 70-72版本对应Chromedriver 2.45Chrome 69-71版本对应Chromedriver 2.44Chrome 68-70版本对应Chromedriver 2.43Chrome 67-69版本对应Chromedriver 2.42…...
HarmonyOS学习第7天: 文本组件点亮界面的文字魔法棒
一、引言 在 HarmonyOS 那丰富多彩的系统界面中,从简洁直观的应用图标,到交互流畅的操作菜单,再到生动形象的图文展示,每一处细节都经过精心雕琢,为用户带来了独特而美妙的视觉与交互体验。而在这琳琅满目的界面元素中…...
06C语言——指针
一、指针入门 (1)、准备知识 0、图解: 1、内存地址 字节:字节是内存的容量单位,英文称为 byte,一个字节有8位,即 1byte(0000 0000 --- 1111 1111) 8bits(0 --- 1) 地址:系统为了便于区分每一个字节而对…...
Ubuntu DeepSeek磁盘空间不够解决办法
标签: Ubuntu; DeepSeek磁盘空间不够解决办法;Ubuntu 22, DeepSeek R1 671 B, solution for Insufficient Disk Space 问题:Ubuntu 22, DeepSeek R1 671B 磁盘空间不够解决办法 Ubuntu 22.04操作系统,台式…...
东信营销科技巨额补贴仍由盈转亏:毛利率大幅下滑,现金流告急
《港湾商业观察》施子夫 近期,东信营销科技有限公司(以下简称,东信营销科技)递表港交所,联席保荐机构为海通国际和中银国际。 东信营销科技的国内运营主体为深圳市东信时代信息技术有限公司。尽管期内收入规模有所提…...
Qt layout
文章目录 Qt layout**关键机制****验证示例****常见误区****最佳实践****总结**关键点总结:示例代码说明:结论: Qt layout 在 Qt 中,当调用 widget->setLayout(layout) 时,layout 的父对象会被自动设置为该 widget…...
本地部署轻量级web开发框架Flask并实现无公网ip远程访问开发界面
文章目录 1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 本篇文章主要讲解如何在本地安装Flask,以及如何将其web界面发布到公网进行远程访问。 Flask是目前十分流行的web框架,采用Python编程…...
基于YOLO11深度学习的苹果叶片病害检测识别系统【python源码+Pyqt5界面+数据集+训练代码】
《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...
Android MMKV集成指南
首先简单介绍一下MMKV当下Android Studio最版本及Gradle8.7 MMKV集成根据官方文档重新对mmkv重新包了一次(便于开发)总结首先简单介绍一下MMKV MMKV 是腾讯开源的一款专为移动端设计的高性能键值存储组件,旨在替代传统的 SharedPreferences 和 SQLite,尤其在频繁读写和数据…...
React七Formik
Formik是一个专为React构建的开源表单库。它提供了一个易于使用的API来处理表单状态管理,表单验证以及表单提交。Formik支持React中的所有表单元素和事件,可以很好地与React生态系统中的其他库集成。同时,Formik还提供了一些高级功能…...
5分钟使用Docker部署Paint Board快速打造专属在线画板应用
文章目录 前言1.关于Paint Board2.本地部署paint-board3.使用Paint Board4.cpolar内网穿透工具安装5.创建远程连接公网地址6.固定Paint Board公网地址 💡 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住…...
可狱可囚的爬虫系列课程 14:10 秒钟编写一个 requests 爬虫
一、前言 当重复性的工作频繁发生时,各种奇奇怪怪提高效率的想法就开始萌芽了。当重复代码的模块化封装已经不能满足要求的时候,更高效的方式就被揭开了神秘的面纱。本文基于这样的想法,来和大家探讨如何 10 秒钟编写一个 requests 爬虫程序。…...
【深度学习神经网络学习笔记(三)】向量化编程
向量化编程 向量化编程前言1、向量化编程2、向量化优势3、正向传播和反向传播 向量化编程 前言 向量化编程是一种利用专门的指令集或并行算法来提高数据处理效率的技术,尤其在科学计算、数据分析和机器学习领域中非常常见。它允许通过一次操作处理整个数组或矩阵的…...
PHP入门基础学习四(PHP基本语法)
运算符 运算符,专门用于告诉程序执行特定运算或逻辑操作的符号。根据运算符的作用,可以将PHP语言中常见的运算符分为9类 算数运算符: 是用来处理加减乘除运算的符号 也是最简单和最常用的运算符号 赋值运算符 1. 是一个二元运算符&#x…...
【十二】Golang 映射
💢欢迎来到张胤尘的开源技术站 💥开源如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 映射映射的定义映射初始化make 函数使用字面量 源…...
简单理解Oracle中的latch
可以用一个小卖部抢购的例子来理解 Oracle 数据库中的 Latch: 1、 什么是 Latch? 打个比方,假设数据库的某个内存区域(比如缓存的数据块)是小卖部货架上的最后一包辣条,Latch 就像是货架前的一个狭窄通道&a…...
hbase集群部署
1.hbase集群的搭建(以及内部逻辑) 虽然Hmaster有多个,但是属于热备,起作用的就active上的这个。 部署流程: 因为我配置的hadoop是一个非HA的,所以修改为以下 如果是HA的hadoop一定要做以下这一步。 在启动…...
塔能物联运维保障智慧地下停车场安全与高效
一、智慧地下停车场安全在城市升级改造中的关键地位 随着城市的不断发展和升级改造,智慧地下停车场的重要性日益凸显。在现代城市中,土地资源愈发珍贵,地下停车场成为解决停车难题的关键设施。然而,停车场的安全问题是其正常运行和…...
面试八股文--数据库基础知识总结(2) MySQL
本文介绍关于MySQL的相关面试知识 一、关系型数据库 1、定义 关系型数据库(Relational Database)是一种基于关系模型的数据库管理系统(DBMS),它将数据存储在表格(表)中,并通过表格…...
深入理解指针2
深入理解指针2 数组名的理解 数组名就是首元素的地址 int arr[]{1,3,2}; printf("%p\n",arr); printf("%p\n",&arr[0]);但是有两种情况除外, 1.sizeof(数组名),sizeof操作符统计的是整个数组的大小,并不是第一个元素…...
QT各种版本下载安装
参考链接: 【Qt】超详细!Qt4.8.6和VS2010的配置及使用 由于QT官网一般现在进不去,所以下载一些QT版本只能通过镜像或者以前下载存储的安装包来进行,现在推荐两种方法 从参考链接中搬过来: 方案一:国内镜…...
java进阶学习脑图
今天开始分享我的第一篇博客,先放上我自己花费一个月完成的java进阶学习脑图吧! 谁都想像R大一样对JVM可以知无不言,言无不尽; 谁都想像Doug Lea一样可以参与JUC这种核心模块的开发; 但是,不能只停留在想…...
Spring 原始注解详解与实战指南
📝 1. 前言 在 Spring 框架的发展过程中,注解的引入大大简化了配置,提升了开发效率 本文将详细介绍 Spring 最初引入的核心注解,包括 Component、Controller、Service、Repository、Autowired、Qualifier 和 Value 等,…...
uniapp封装请求
在uniapp中封装HTTP请求,通常我们会使用uni.request方法。uni.request是uni-app提供的一个网络请求API,可以用来发送各种类型的HTTP请求(GET、POST、PUT、DELETE等)。下面是如何在uniapp中封装一个通用的HTTP请求方法,…...
YOLOv10 解析与地平线 征程 6 模型量化
一,YOLOv10 解析 1.简介 近些年来,研究人员对 YOLO 的架构设计、优化目标、数据增强策略等进行了探索,取得了显著进展。然而,后处理对非极大值抑制(NMS)的依赖阻碍了 YOLO 的端到端部署,并对推…...
基本网络安全的实现
基本网络安全的实现 一 :AAA AAA 是Authentication,Authorization and Accounting(认证、授权和计费)的简 称,它提供了一个用来对认证、授权和计费这三种安全功能进行配置的一致性框架, 它是对网络安全…...
ROS2 强化学习:案例与代码实战
一、引言 在机器人技术不断发展的今天,强化学习(RL)作为一种强大的机器学习范式,为机器人的智能决策和自主控制提供了新的途径。ROS2(Robot Operating System 2)作为新一代机器人操作系统,具有…...
Java数据结构第十四期:走进二叉树的奇妙世界(三)
专栏:数据结构(Java版) 个人主页:手握风云 目录 一、二叉树OJ练习题 1.1. 相同的树 1.2. 另一棵树的子树 1.3. 翻转二叉树 1.4. 平衡二叉树 1.5. 对称二叉树 一、二叉树OJ练习题 1.1. 相同的树 判断两棵树是否相同,我们是否只能遍历一…...
GO 进行编译时插桩,实现零码注入
Go 编译时插桩 Go 语言的编译时插桩是一种在编译阶段自动注入监控代码的技术,目的是在不修改业务代码的情况下,实现对应用程序的监控和追踪。 基本原理 Go 编译时插桩的核心思想是通过在编译过程中对源代码进行分析和修改,将监控代码注入到…...
《炎龙骑士团 1 邪神之封印》游戏信息
发行公司:1994 年由汉堂国际资讯公司发行。 游戏类型:回合制角色扮演游戏 故事背景 远古之战:在远古时代,圣族与魔族爆发大战,魔族领导者大邪神力量强大,圣族处于下风。圣族派出十二战士突袭,虽…...
本地大模型编程实战(23)用智能体(Agent)实现基于SQL数据构建问答系统(2)
本文将用 智能体(Agent) 实现对 SQLite 数据库的查询:用户用自然语言提出问题,智能体也用自然语言根据数据库的查询结果回答问题。 本次将分别在英文、中文环境下,使用 qwen2.5 、 MFDoom/deepseek-r1-tool-calling:7b 以及 llama3.1 做实验。…...