This commit is contained in:
27942
2026-03-06 01:33:11 +08:00
parent 710ba7ec31
commit e5becbae86
3 changed files with 774 additions and 675 deletions

1316
1.html

File diff suppressed because one or more lines are too long

83
1.py
View File

@@ -9,6 +9,7 @@ from __future__ import annotations
import random
import sys
import time
from pathlib import Path
# 保证从项目根目录运行时可导入 worker 包
@@ -17,11 +18,11 @@ if str(_ROOT) not in sys.path:
sys.path.insert(0, str(_ROOT))
# ---------- 选择控制对象 ----------
USE_LOCAL_CHROME = True # True=本地谷歌 ChromeFalse=比特浏览器
USE_LOCAL_CHROME = True # True=本地谷歌 ChromeFalse=比特浏览器
# 本地谷歌 Chrome 配置(仅当 USE_LOCAL_CHROME=True 时生效)
CHROME_DEBUG_PORT = 9222 # 调试端口;若为 None 则由脚本自动启动 Chrome
CHROME_PATH = None # 例如 r"C:\Program Files\Google\Chrome\Application\chrome.exe"None 用系统默认
CHROME_PATH = None # 例如 r"C:\Program Files\Google\Chrome\Application\chrome.exe"None 用系统默认
# 比特浏览器配置(仅当 USE_LOCAL_CHROME=False 时生效)
BIT_API_BASE = "http://127.0.0.1:54345"
@@ -65,7 +66,7 @@ def _connect_bit_browser():
return ChromiumPage(addr_or_opts=co)
def main():
def main(filters):
from DrissionPage.errors import NoRectError
if USE_LOCAL_CHROME:
@@ -73,25 +74,33 @@ def main():
else:
page = _connect_bit_browser()
# 先启动监听再执行动作,否则拿不到数据包(见 DP 文档)
page.listen.start('wapi/zpjob/rec/geek/list')
# 示例:打开一个页面(可选)
page.get("https://www.zhipin.com/web/chat/recommend")
res = page.listen.wait()
if filters:
main2(page, filters)
# 有筛选时page.get 会触发第 1 个 geek/list点「确定」触发第 2 个;取最后一个才是筛选后的结果
packets = page.listen.wait(count=2, timeout=30)
res = packets[-1] if packets else None
else:
page.get("https://www.zhipin.com/web/chat/recommend")
res = page.listen.wait(timeout=30)
if not res:
raise RuntimeError("未捕获到目标请求 wapi/zpjob/rec/geek/list")
for i in res.response.body["zpData"]["geekList"]:
print(i)
geekName = i["geekCard"]["geekName"] # 姓名
geekName = i["geekCard"]["geekName"] # 姓名
geekDegree = i["geekCard"]["geekDegree"] # 学历
expectPositionName = i["geekCard"]["expectPositionName"] #期待职位
expectPositionName = i["geekCard"]["expectPositionName"] # 期待职位
expectLocationName = i["geekCard"]["expectLocationName"] # 地区
applyStatusDesc = i["geekCard"]["applyStatusDesc"] # 当前状态离职0随时到岗之类的
ageDesc = i["geekCard"]["ageDesc"] # 年龄
lowSalary = i["geekCard"]["lowSalary"] # 最低要求工资
highSalary = i["geekCard"]["highSalary"] # 最高要求工资
"""三个动作1. 找到姓名 2. 滚动到那里 3. 点击打招呼"""
try:
container = page.get_frame("recommendFrame")
@@ -99,7 +108,7 @@ def main():
container = page
# 1. 找到这个姓名
name_ele = container.ele(f'x://span[contains(text(),"{geekName}")]', timeout=10)
name_ele = container.ele(f'x://span[contains(text(),"{geekName}")]', timeout=5)
if not name_ele:
name_ele = container.ele(f'x://span[text()="{geekName}"]', timeout=2)
if not name_ele:
@@ -115,17 +124,65 @@ def main():
for _ in range(8):
if not parent:
break
greet_btn = parent.ele('x://span[text()="打招呼"]', timeout=0.5) or parent.ele('x://*[contains(text(),"打招呼")]', timeout=0.5)
greet_btn = parent.ele('x://span[text()="打招呼"]', timeout=0.5) or parent.ele(
'x://*[contains(text(),"打招呼")]', timeout=0.5)
if greet_btn:
break
parent = parent.parent()
if not greet_btn:
greet_btn = container.ele('x://span[text()="打招呼"]', timeout=2) or container.ele('x://*[contains(text(),"打招呼")]', timeout=1)
greet_btn = container.ele('x://span[text()="打招呼"]', timeout=2) or container.ele(
'x://*[contains(text(),"打招呼")]', timeout=1)
if not greet_btn:
raise Exception("未找到「打招呼」按钮")
greet_btn.click(by_js=True)
def main1():
if USE_LOCAL_CHROME:
page = _connect_local_chrome()
else:
page = _connect_bit_browser()
page.listen.start('wapi/zpblock/recommend/filters')
# 示例:打开一个页面(可选)
page.get("https://www.zhipin.com/web/chat/recommend")
res = page.listen.wait()
filters = {}
for i in res.response.body["zpData"]["vipFilter"]["filters"]:
print(i)
if i["name"] == "年龄":
print(i["start"])
print(i["end"])
filters[i["name"]] = range(int(i["start"]), int(i["end"]) + 1)
else:
datas = []
for i1 in i["options"]:
print(i1["name"])
datas.append(i1["name"])
filters[i["name"]] = datas
print(filters)
def main2(page, filters):
"""在同一 page 上打开推荐页、点筛选、选条件、点确定;点击确定后会触发 wapi/zpjob/rec/geek/list由 main() 的 listen 捕获。"""
page.get("https://www.zhipin.com/web/chat/recommend")
page.ele("x://*[contains(text(),'筛选')]").click()
time.sleep(3)
for i in filters:
page.ele(f"x://*[contains(text(),'{i}')]").click()
time.sleep(random.random() * 2)
page.ele("x://*[contains(text(),'确定')]").click()
if __name__ == "__main__":
main()
main(filters=["初中及以下", '离职-随时到岗'])
# main1()
# main2()

View File

@@ -24,6 +24,47 @@ BROWSER_NAME = "测试2" # 例如 "第一个" 或 "主账号"
BROWSER_ID = None # 若已知窗口 ID可直接填
def do_recommend_filter(page):
"""
在推荐牛人页面:点开右上角筛选 -> 弹窗内完成筛选操作 -> 点击确认。
筛选 UI 在 iframe recommendFrame 内(推荐牛人 / recommend-v2
"""
time.sleep(1.5) # 等待 iframe 加载
# 获取推荐牛人 iframename=recommendFrame
frame = page.get_frame("@name=recommendFrame")
if not frame:
frame = page.get_frame(1) # fallback第一个 iframe
if not frame:
print("未找到推荐牛人 iframe跳过筛选")
return
# 1. 点击右上角「筛选」,打开弹窗
filter_btn = frame.ele("x://span[text()='筛选']", timeout=3) or frame.ele(
"x://*[contains(text(),'筛选')]", timeout=2
)
if not filter_btn:
print("未找到「筛选」按钮,跳过筛选")
return
filter_btn.click(by_js=True)
time.sleep(0.8)
# 2. 弹窗内完成筛选(按需在此增加具体筛选项点击,例如学历、经验、期望职位等)
# 若无需改任何条件,可保持默认,直接点确认即可。
# 3. 点击弹窗中的「确认」
confirm = (
frame.ele("x://span[text()='确认']", timeout=3)
or frame.ele("x://span[text()='确定']", timeout=2)
or frame.ele("x://*[contains(text(),'确认')]", timeout=2)
)
if not confirm:
print("未找到「确认」按钮")
return
confirm.click(by_js=True)
time.sleep(0.5)
print("推荐牛人筛选已确认")
def main():
from DrissionPage import ChromiumPage, ChromiumOptions
from DrissionPage.errors import NoRectError
@@ -46,10 +87,13 @@ def main():
page.listen.start('wapi/zprelation/friend/getBossFriendListV2')
# 示例:打开一个页面(可选)
# 打开推荐牛人/聊天页
page.get("https://www.zhipin.com/web/chat/index")
res = page.listen.wait()
# 执行推荐牛人筛选:点开右上角筛选 -> 弹窗内完成筛选 -> 点击确认
do_recommend_filter(page)
for i in res.response.body["zpData"]["friendList"]:
print(i)