您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 如何用Python爬取了三大相亲软件评论区
## 引言
在当今数字化时代,相亲软件已成为现代人寻找伴侣的重要渠道。据最新统计,国内三大主流相亲软件(探探、Soul、珍爱网)月活跃用户合计超过1亿。这些平台的评论区蕴藏着大量用户行为数据和情感倾向,对市场调研、产品优化和学术研究都具有重要价值。
本文将详细介绍如何使用Python技术栈(Requests/Scrapy+BeautifulSoup/Selenium)完整爬取三大相亲软件的评论区数据,涵盖反爬策略破解、数据清洗存储等全流程实战经验。(注:本文所有技术方案仅用于学习交流,请遵守各平台数据使用政策)
## 一、环境准备与技术选型
### 1.1 基础工具包
```python
# 核心依赖库
import requests # 2.28.1
from bs4 import BeautifulSoup # 4.11.1
from selenium import webdriver # 4.4.3
import pandas as pd # 1.5.0
import time
import random
import json
技术方案 | 适用场景 | 优点 | 缺点 |
---|---|---|---|
Requests | 静态页面 | 速度快、资源占用少 | 无法执行JS |
Selenium | 动态渲染页面 | 模拟真实浏览器 | 性能开销大 |
Scrapy | 大规模爬取 | 异步高效 | 学习曲线陡峭 |
探探:采用Restful API设计,数据返回格式为JSON
api.tantan.com/v1/comments?post_id=xxx
X-Auth-Token
鉴权Soul:使用WebSocket实时通信
ws_token
建立连接珍爱网:传统表单提交方式
def get_tantan_comments(post_id, max_retry=3):
headers = {
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 15_4 like Mac OS X)",
"X-Auth-Token": "your_token_here"
}
params = {
"post_id": post_id,
"limit": 20,
"offset": 0
}
for _ in range(max_retry):
try:
resp = requests.get(
"https://api.tantan.com/v1/comments",
headers=headers,
params=params,
timeout=5
)
if resp.status_code == 429:
time.sleep(random.uniform(1, 3))
continue
data = resp.json()
return data.get("comments", [])
except Exception as e:
print(f"Error: {str(e)}")
time.sleep(2)
return []
def get_soul_comments(post_url):
options = webdriver.ChromeOptions()
options.add_argument("--headless")
options.add_argument("--disable-blink-features=AutomationControlled")
driver = webdriver.Chrome(options=options)
driver.execute_cdp_cmd(
"Network.setUserAgentOverride",
{"userAgent": "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36..."}
)
try:
driver.get(post_url)
time.sleep(5) # 等待动态加载
# 模拟人类滚动行为
for _ in range(3):
driver.execute_script("window.scrollBy(0, 500)")
time.sleep(random.uniform(0.5, 1.5))
soup = BeautifulSoup(driver.page_source, 'lxml')
comments = []
for item in soup.select(".comment-item"):
user = item.select_one(".user-name").text.strip()
content = item.select_one(".comment-text").text.strip()
comments.append({"user": user, "content": content})
return comments
finally:
driver.quit()
def bypass_zhenai_captcha():
# 使用第三方打码平台
captcha_api = "http://api.captcha.com/solve"
response = requests.post(captcha_api, json={
"image": base64_image,
"type": "chinese_char"
})
return response.json().get("code")
def get_zhenai_comments():
session = requests.Session()
# 先获取初始Token
home_page = session.get("https://www.zhenai.com")
soup = BeautifulSoup(home_page.text, 'html.parser')
csrf_token = soup.find("meta", {"name": "csrf-token"})["content"]
# 处理验证码
captcha_code = bypass_zhenai_captcha()
# 提交登录表单
login_data = {
"username": "your_account",
"password": "your_password",
"captcha": captcha_code,
"_csrf": csrf_token
}
session.post("https://www.zhenai.com/login", data=login_data)
# 获取评论数据
comment_page = session.get("https://www.zhenai.com/comments")
data = json.loads(
comment_page.text.split("window.__INITIAL_STATE__ = ")[1].split(";")[0]
)
return data["commentList"]
def save_data(comments, platform):
# CSV存储
pd.DataFrame(comments).to_csv(
f"{platform}_comments.csv",
index=False,
encoding='utf_8_sig'
)
# MongoDB存储
if MONGO_ENABLED:
from pymongo import MongoClient
client = MongoClient("mongodb://localhost:27017")
db = client["dating_apps"]
db[platform].insert_many(comments)
# 备份原始JSON
with open(f"{platform}_{int(time.time())}.json", "w") as f:
json.dump(comments, f, ensure_ascii=False)
def clean_text(text):
# 去除特殊字符
text = re.sub(r"[^\w\s\u4e00-\u9fa5]", "", text)
# 归一化空白字符
text = re.sub(r"\s+", " ", text)
# 处理表情符号
text = re.sub(r"\[.*?\]", "[EMOJI]", text)
return text.strip()
def process_comments(raw_data):
return [
{
"user_id": item["userId"],
"content": clean_text(item["content"]),
"timestamp": pd.to_datetime(item["time"], unit="ms"),
"sentiment": analyze_sentiment(item["content"]) # 使用NLP库分析
}
for item in raw_data
]
// 修改浏览器指纹特征
Object.defineProperty(navigator, 'webdriver', {
get: () => false
});
window.navigator.chrome = {
runtime: {},
// 其他属性
};
headers = {
"Accept": "application/json, text/javascript",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "keep-alive",
"Referer": "https://www.zhenai.com/v2/index.html",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "same-origin",
"X-Requested-With": "XMLHttpRequest"
}
class ProxyPool:
def __init__(self):
self.proxies = [
"http://user:pass@ip1:port",
"socks5://ip2:port",
# 其他代理
]
self.current = 0
def get_proxy(self):
proxy = self.proxies[self.current]
self.current = (self.current + 1) % len(self.proxies)
return {"http": proxy, "https": proxy}
合规边界:
数据使用原则:
推荐实践:
if response.status_code == 403:
print("触发反爬机制,建议暂停采集")
time.sleep(3600) # 休眠1小时
通过本文介绍的技术方案,我们成功实现了对三大相亲平台评论数据的采集。完整项目包含以下模块: - 多平台适配的爬虫调度器 - 智能反反爬中间件 - 数据清洗管道 - 可视化分析面板
需要特别强调的是,技术开发者应当遵守《网络安全法》和《个人信息保护法》相关规定。本文代码示例已做脱敏处理,实际应用中请务必获得平台授权。
完整项目代码已开源在GitHub(示例仓库地址),欢迎提交PR完善功能。对于大规模商业用途,建议使用各平台官方API接口。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。