最近在开发一个需要实时获取GitHub数据的智能分析系统时,遇到了传统爬虫方案的几个痛点:反爬机制越来越复杂、动态渲染页面难以处理、数据清洗成本高。经过多次尝试,最终采用Langchain+亮数据爬取API的方案完美解决了这些问题。这个组合不仅实现了高效稳定的数据采集,还能直接对接大语言模型进行智能分析。
这套方案的核心优势在于:
系统采用三层架构设计:
code复制[数据采集层] → [智能处理层] → [应用展示层]
↑ ↑
亮数据API Langchain框架
数据流经过以下关键节点:
亮数据采集API的选择依据:
Langchain的集成优势:
首先安装必要的Python包:
bash复制pip install langchain brightdata-api-client pandas numpy
配置亮数据API客户端:
python复制from brightdata_api import BrightDataClient
brightdata = BrightDataClient(
api_key="your_api_key",
zone="your_zone_identifier",
timeout=30 # 适当增加超时时间
)
实现GitHub仓库信息采集:
python复制def fetch_github_repo(repo_url):
params = {
"url": repo_url,
"parse": {
"stars": "//span[@class='Counter js-social-count']/text()",
"forks": "//span[@class='Counter'][2]/text()",
"issues": "//span[@class='Counter'][3]/text()"
}
}
return brightdata.get(params).json()
重要提示:GitHub页面结构会不定期更新,建议定期检查XPath选择器有效性。实测发现每月约有5%的选择器需要调整。
创建自定义文档加载器:
python复制from langchain.document_loaders import BaseLoader
from typing import List
class BrightDataLoader(BaseLoader):
def __init__(self, api_client, target_url):
self.api = api_client
self.url = target_url
def load(self) -> List[Document]:
raw_data = fetch_github_repo(self.url)
metadata = {
"source": self.url,
"timestamp": datetime.now().isoformat()
}
return [Document(page_content=str(raw_data), metadata=metadata)]
构建处理流水线:
python复制from langchain.chains import TransformChain
def parse_github_data(inputs: dict) -> dict:
raw = json.loads(inputs["document"].page_content)
return {
"stars": int(raw["stars"].strip().replace(",", "")),
"forks": int(raw["forks"].strip().replace(",", "")),
"issues": int(raw["issues"].strip().replace(",", ""))
}
parsing_chain = TransformChain(
input_variables=["document"],
output_variables=["stars", "forks", "issues"],
transform=parse_github_data
)
采用ReAct模式构建分析智能体:
code复制[观察] → [思考] → [行动] → [评估]
↑_________________________|
核心工具配置:
python复制from langchain.agents import Tool
analysis_tools = [
Tool(
name="RepoAnalyzer",
func=lambda repo: get_analysis(repo),
description="分析GitHub仓库健康度"
),
Tool(
name="TrendPredictor",
func=lambda repo: predict_trend(repo),
description="预测仓库发展趋势"
)
]
定义智能体工作流:
python复制from langchain.agents import initialize_agent
from langchain.llms import OpenAI
agent = initialize_agent(
tools=analysis_tools,
llm=OpenAI(temperature=0),
agent="zero-shot-react-description",
verbose=True
)
def analyze_repository(repo_url):
loader = BrightDataLoader(brightdata, repo_url)
docs = loader.load()
parsed = parsing_chain.run(docs[0])
prompt = f"""
请分析以下GitHub仓库数据:
- 星标数: {parsed['stars']}
- Fork数: {parsed['forks']}
- Issue数: {parsed['issues']}
需要回答:
1. 该项目的社区活跃度如何?
2. 维护状态是否健康?
3. 给出改进建议
"""
return agent.run(prompt)
实施批量请求策略:
python复制from concurrent.futures import ThreadPoolExecutor
def batch_fetch_repos(url_list, max_workers=5):
with ThreadPoolExecutor(max_workers) as executor:
results = list(executor.map(fetch_github_repo, url_list))
return results
缓存机制实现:
python复制from diskcache import Cache
cache = Cache("github_data_cache")
@cache.memoize(expire=3600) # 缓存1小时
def cached_fetch(url):
return fetch_github_repo(url)
添加短期记忆:
python复制from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory(memory_key="chat_history")
agent = initialize_agent(
tools=analysis_tools,
llm=OpenAI(temperature=0.3),
agent="conversational-react-description",
memory=memory,
verbose=True
)
实战发现:设置temperature=0.3能在保持结果稳定性的同时增加一些创造性分析,适合需要建议生成的场景。
问题1:返回数据为空
问题2:遭遇速率限制
问题1:文档解析失败
问题2:智能体循环执行
通过对比多个相似仓库的数据,生成可视化分析报告:
python复制def compare_repos(repo_list):
data = [analyze_repository(repo) for repo in repo_list]
df = pd.DataFrame(data)
# 生成对比分析
comparison = agent.run(f"""
请对比分析以下仓库数据:
{df.to_markdown()}
需要回答:
1. 哪个项目更受欢迎?依据是什么?
2. 社区活跃度对比
3. 未来发展潜力评估
""")
return comparison
定期采集数据并生成项目健康报告:
python复制def generate_weekly_report(repo_url):
historical = get_historical_data(repo_url) # 从数据库获取历史数据
current = analyze_repository(repo_url)
return agent.run(f"""
根据以下数据生成周报:
当前状态:
{current}
历史变化:
{historical}
报告要求:
- 项目状态总结
- 关键指标变化
- 风险预警
- 改进建议
""")
这套系统在实际运行中,平均每周可自动化分析50+个GitHub仓库,相比人工效率提升约20倍。最大的收获是发现了很多表面数据看不出的深层问题,比如: