尧图精选

Crawl4AI LinkedIn 数据发现实战:从公司与人员抓取到 LLM 组织架构图的三阶段流水线

🕒 发布时间:2026/9/6 17:39:11 📁 来源:尧图网络
Crawl4AI LinkedIn 数据发现实战从公司与人员抓取到 LLM 组织架构图的三阶段流水线【免费下载链接】crawl4ai Crawl4AI: Open-source LLM Friendly Web Crawler Scraper. Dont be shy, join here: https://discord.gg/jP8KfhDhyN项目地址: https://gitcode.com/GitHub_Trending/craw/crawl4ai本篇基于 Crawl4AI 官方仓库中的应用示例 Prospect-Wizard 指南完整拆解一套「LinkedIn 抓取 ➜ LLM 推理 ➜ 图谱可视化」的三阶段 B2B 数据发现流水线你会掌握如何用BrowserProfiler持久化浏览器 profile 绕过登录态问题、如何用JsonCssExtractionStrategy让 LLM 一次性自动生成并缓存 CSS 抽取 schema以及如何在第二阶段用 sentence-transformers 嵌入 LLM 推断出公司相似图谱与组织架构图最终输出可交互的 HTML 图谱视图。一、示例定位与目录结构该示例位于仓库的 docs/apps/linkdin/ 目录是一套完整可运行的演示应用Prospect-Wizard目标是输入一个行业关键词如 “health insurance management”和地区自动完成公司发现、员工名录抓取、决策人打分和关系图渲染。同一目录下还附带了 Part 1 和 Part 2 两个 Jupyter Notebook分别覆盖数据发现与洞察构建的过程记录可用于无本地环境的对照学习。仓库中的实际目录结构如下比原 README 中的示意树更完整docs/apps/linkdin/ ├─ c4ai_discover.py # Stage 1 – 抓取公司 人员 ├─ c4ai_insights.py # Stage 2 – 嵌入、组织架构图、决策人打分 ├─ templates/ │ ├─ graph_view_template.html # Stage 3 – 图谱查看器静态 HTML │ └─ ai.js # 查看器内置的 LLM 流式聊天封装 ├─ schemas/ │ ├─ company_card.json # 公司卡 JsonCssExtractionStrategy schema已生成并缓存 │ └─ people_card.json # 人员卡 schema已生成并缓存 ├─ snippets/ │ ├─ company.html # 公司搜索结果卡片样例 HTML │ └─ people.html # 人员卡片样例 HTML ├─ samples/ │ ├─ companies.jsonl # Stage 1 样例输出 │ └─ people.jsonl ├─ Crawl4ai_Linkedin_Data_Discovery_Part_1.ipynb ├─ Crawl4ai_Linkedin_Data_Discovery_Part_2.ipynb └─ README.md三阶段之间的数据流是单向的Stage 1 产出companies.jsonl与people.jsonlStage 2 消费这两个文件产出company_graph.json、每公司一份org_chart_handle.json、decision_makers.csv并把可视化模板拷贝到输出目录Stage 3 纯前端只负责拉取这些数据文件渲染交互界面。二、Stage 0安装依赖与创建 LinkedIn 浏览器 Profile2.1 安装依赖pip install crawl4ai litellm sentence-transformers pandas rich其中litellm用于 Stage 2 的多供应商 LLM 调用源码中为from litellm import completion见 c4ai_insights.pysentence-transformers用于公司描述向量化pandas用于导出决策人 CSVrich提供终端进度条与日志美化。2.2 创建/预热 LinkedIn 浏览器 Profilecrwl profiles交互式界面中选择New profile按回车输入 profile 名称例如profile_linkedin_uc会弹出一个 Chromium 窗口——手动登录 LinkedIn、通过可能出现的验证然后关闭窗口。记住 profile 名称后续所有 Stage 1 调用都要通过--profile-name your_name传入。这套机制对应 Crawl4AI 的 BrowserProfiler 能力crwl profiles命令入口定义在 CLI 中profile 数据默认存放在用户主目录下的.crawl4ai/profiles/从 c4ai_discover.py 的默认值 可以确认默认路径为~/.crawl4ai/profiles/profile_linkedin_uc。Profile 的价值在于把登录 Cookie 持久化到磁盘上的user_data_dir后续运行直接复用会话避免每次重新登录触发风控。三、Stage 1Discovery——抓取公司与人员3.1 运行命令python c4ai_discover.py full \ --query health insurance management \ --geo 102713980 \ # Malaysia geoUrn --title-filters \ # 或 Product,Engineering --max-companies 10 \ # 示例里调小便于演示 --max-people 20 \ --profile-name profile_linkedin_uc \ --outdir ./data \ --concurrency 2 \ --log-level debug输出写入./data/companies.jsonl—— 每行一个公司 JSONpeople.jsonl—— 每行一个员工 JSON脚本支持三个子命令full公司 人员、companies仅公司搜索、people仅基于已有companies.jsonl抓取人员页。若people子命令找不到companies.jsonl会报错提示先运行companies/full见 async_main 中的回退逻辑。3.2 CLI 参数全表依据build_arg_parser()原 README 未列出 Stage 1 的完整参数表这里结合 c4ai_discover.py 的参数定义 补齐参数默认值说明--query无必需时手动提供搜索关键词--geo无LinkedIn geoUrn地区编码整数--title-filtersProduct,Engineering逗号分隔的职位关键词用于过滤人员页--max-companies1000公司数量上限演示中调小--max-people500每公司抓取的人数上限--profile-name~/.crawl4ai/profiles/profile_linkedin_uc浏览器 profile--outdir./output输出目录相对脚本所在目录解析--concurrency4并发数--log-levelinfo可选debug/info/warn/error--debugoff使用内置演示默认值等价于C4AI_DEMO_DEBUG1geoUrn 速查表继承自原 README地区geoUrn新加坡 Singapore103644278马来西亚 Malaysia102713980美国 United States103644922英国 United Kingdom102221843澳大利亚 Australia101452733获取方法在浏览器中打开 LinkedIn 公司搜索页并添加geoUrnXXX查询参数geoUrn后面的数字即为你需要的值。3.3 底层实现浏览器会话与等待策略c4ai_discover.py 的async_main展示了典型的 Crawl4AI 会话复用写法profiler BrowserProfiler() path profiler.get_profile_path(opts.profile_name) bc BrowserConfig( headlessFalse, # 需要真实窗口以应对验证码 user_data_dirpath, # 复用已登录 profile use_managed_browserTrue, user_agent_moderandom, # 随机 UA user_agent_generator_config{platforms: mobile, os: Android}, ) crawler AsyncWebCrawler(configbc) await crawler.start()两个抓取协程分别使用不同的session_idcompany_search与people_search在同一浏览器内维护独立会话上下文。关键运行配置包括公司搜索页wait_for.search-marvel-srp等待搜索结果容器渲染、magicTrue启用魔法模式、delay_before_return_html1、CacheMode.BYPASS绕过缓存并按pageN翻页直到攒够--max-companies条见 crawl_company_search人员页wait_for.org-people-profile-card__card-spacing且wait_for_images5000等待头像图片加载保证avatar_url可取URL 形如people_url?keywordstitle_kw见 crawl_people_page每家公司的人员抓取之间插入asyncio.sleep(random.uniform(0.5, 1))的随机延时源码降低触发风控的概率。公司搜索 URL 由脚本拼接https://www.linkedin.com/search/results/companies/?keywordsquerycompanyHqGeogeoUrnasync_main。3.4 抽取 SchemaLLM 一次生成 本地缓存这是本示例最值得借鉴的设计文件头部 docstring 与_load_or_build_schema有完整说明首次运行时用JsonCssExtractionStrategy.generate_schema()让 LLM默认openai/gpt-4o可通过环境变量C4AI_SCHEMA_PROVIDER覆盖API key 读取OPENAI_API_KEY基于打包的样例 HTML 片段snippets/company.html、snippets/people.html和一段精确的字段规格提示词_COMPANY_SCHEMA_QUERY、_PEOPLE_SCHEMA_QUERY生成 CSS 选择器 schema生成结果持久化到schemas/目录之后所有运行直接读缓存不再消耗 LLM 调用提示词中特意强调「不要使用 base64 风格的混淆类名定位元素」以及「a标签有多个时选择器必须唯一」这是对抗 LinkedIn 动态类名漂移的实战经验。仓库中已经提交了两个生成好的 schema可以直接阅读学习 CSS 选择器如何映射 JSON 字段schemas/company_card.jsonbaseSelector锁定div[data-chameleon-result-urn][data-view-namesearch-entity-result-universal-template]字段类型支持attribute如取href、src、text与regex如用(\d[KM]?) followers从「1.2K followers」提取粉丝数schemas/people_card.jsonbaseSelector为li.org-people-profile-card__profile-card-spacing抽取profile_url、name、headline、followersregex、connection_degree如「3rd」、avatar_url。3.5 输出数据格式companies.jsonl每行字段handle、name、descriptor行业 • 地点、about简介片段、followers整数已把 “1K” 归一化为 1000见_openai_friendly_number、people_url由 handle 拼接people/后缀、captured_atUTC 时间戳。样例数据见 samples/companies.jsonl。people.jsonl每行字段profile_url、name、headline、followers、connection_degree、avatar_url外加company_handle与captured_at用于回关联到公司。样例见 samples/people.jsonl。调试模式设置C4AI_DEMO_DEBUG1或加--debug可切换到内置的小规模默认参数查询词 “health insurance management”、马来西亚 geo、10 家公司、5 人/公司、输出到./debug_out见detect_debug_defaults便于快速联调打包的 HTML 片段则专门服务于第 3.4 节的一次性 schema 生成。四、Stage 2Insights——嵌入、组织架构图与决策人打分4.1 运行命令python c4ai_insights.py \ --in ./data \ --out ./data \ --embed-model all-MiniLM-L6-v2 \ --llm-provider gemini/gemini-2.0-flash \ --llm-api-key \ --top-k 10 \ --max-llm-tokens 8024 \ --llm-temperature 1.0 \ --workers 4完成后在 Stage 1 文件旁新增company_graph.json—— 公司间相似度图谱nodes edgesorg_chart_handle.json—— 每家公司一份的 LLM 推断组织架构图decision_makers.csv—— 打分筛选出的「该向谁 pitch」名单注意从当前源码结构看仓库中 c4ai_insights.py 的main()目前硬编码了opts dbg if True else build_arg_parser().parse_args()即实际会走dev_defaults()的开发默认值输入目录./samples、输出./samples/insights、openai/gpt-4.1命令行参数解析被暂时旁路。因此本地运行前建议核对这一行若想使用上面的命令行参数需要让该行回到build_arg_parser().parse_args()。下文参数表以build_arg_parser()的真实定义为权威。4.2 参数全表依据build_arg_parser()原 README 的参数表与当前代码略有出入如把--embed-model写成--embed_model、把 LLM 参数写成--openai_model以源码为准的完整参数如下参数默认值用途--in.Stage 1 输出目录--out.结果输出目录--embed-modelall-MiniLM-L6-v2Sentence-Transformer 嵌入模型--top-k10图谱中每家公司保留的最近邻数--llm-provideropenai/gpt-4.1litellm 格式provider/model如gemini/gemini-2.0-flash--llm-api-key环境变量LLM API key--llm-base-url无自定义 LLM API 端点--max-llm-tokens8024每次 LLM 调用的 token 预算--llm-temperature1.0采样温度--stuboff跳过真实 LLM生成极小的假组织架构图离线调试用--workers4LLM 并行推理的 worker 数4.3 公司相似度图谱嵌入 加权边embed_descriptions 用SentenceTransformer对每家公司about/descriptor文本编码并带磁盘缓存以sha1(text)为指纹存到out/embeds_cache.json文本不变就不重复推理模型名变化则整体失效。build_company_graph 计算所有嵌入对的余弦相似度每个节点取 top-k 邻居生成边且边权不是单纯相似度而是叠加了两个业务先验行业相同descriptor中 “•” 前的行业段一致0.10geoUrn 相同0.05粉丝规模接近度0.05 × min/max(followers)两家体量越接近越可能是同赛道竞争者每条边还附带drivers明细embed_sim/industry_match/geo_overlap让前端可以解释「为什么这两家公司被连在一起」。4.4 组织架构图LLM 推理 并发控制infer_org_chart_llm 把公司 JSON 和该公司全部员工 JSON 塞进一段「你是 B2B 组织架构图推理专家」的系统提示中要求 LLM构建汇报树manager → direct reports为每个人输出 0–1 的decision_score采购新软件的决策影响力以response_format{type:json_object}强制输出结构化 JSONnodes含yoe_total、seniority_score等与edgessource/target/confidence。并发方面run() 用asyncio.Semaphore(workers)限制并行 LLM 调用数并用rich的Progress显示进度每家公司完成后立即落盘org_chart_handle.json重跑时已存在的文件会被跳过增量处理逻辑失败可断点续跑。4.5 决策人 CSV 与 HTML 产物export_decision_makers 扫描所有org_chart_*.json把decision_score ≥ 0.5的人展平为company / person / title / decision_score / profile_url五列 CSV——这就是销售跟进清单。render_html 最后把templates/graph_view_template.html与templates/ai.js拷贝到输出目录生成graph_view.html。五、Stage 3可视化——交互式图谱Stage 2 完成后直接打开输出目录中的graph_view.html或原模板 templates/graph_view_template.htmlopen graph_view_template.html # 或用 Live Server / python -m http.server从模板源码可以确认页面行为启动时优先读localStorage中缓存的图数据否则fetch(./company_graph.json)模板 L253-L309因此必须把data/文件夹放在 HTML 同目录点击节点时按需fetch(org_chart_handle.json)加载右侧组织架构图模板 L565聊天抽屉会懒加载people.jsonl作为上下文配合 ai.js 中封装的 OpenAI 流式 SSE 客户端可以直接向图谱追问API key 保存在浏览器localStorage的openai_api_key界面布局左侧面板是公司clans列表右侧是所选公司的组织架构图基于 vis-network 渲染。六、常见故障速查Common snags继承自原 README 的排障表并结合源码给出定位线索症状处理无限验证码使用住宅代理--proxy http://user:passip:port或换一个预热好的 profile429 Too Many Requests调低--concurrency、轮换 profile、加大页间延时脚本内已有 0.5–1s 随机 sleep可继续加大图谱空白检查company_graph.json/org_chart_*.json路径是否与 HTML 同级清除浏览器localStorage模板会把旧图数据缓存在companyGraphData键下七、TL;DR 四步走crwl profiles—— 创建并登录一个持久化 LinkedIn profilepython c4ai_discover.py full --query ... --geo geoUrn --profile-name ...—— 产出companies.jsonlpeople.jsonlpython c4ai_insights.py --in ./data --out ./data—— 产出公司图谱、组织架构图与decision_makers.csv打开graph_view.html—— 交互式浏览公司关系与组织架构图并用聊天抽屉追问。这套「profile 复用 LLM 自动生成抽取 schema 嵌入图谱 LLM 结构化推理」的组合是把 Crawl4AI 的BrowserProfiler、JsonCssExtractionStrategy、AsyncWebCrawler三大能力串联起来的典型应用范式其思路尤其是 schema 一次生成、多次复用的模式可以平移到其他反爬较强、类名易漂移的站点抓取场景。【免费下载链接】crawl4ai Crawl4AI: Open-source LLM Friendly Web Crawler Scraper. Dont be shy, join here: https://discord.gg/jP8KfhDhyN项目地址: https://gitcode.com/GitHub_Trending/craw/crawl4ai创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →