[生存志] 第87节 张仪犀首纵横大战

本文讲述了战国时期纵横家张仪的外交策略与军事行动。张仪通过一系列的计谋,如欺诈魏国将领、游说各国君主,帮助秦国逐步扩张领土,并在与楚、齐等国的交锋中取得优势。
        张仪犀首纵横大战
        
        公元前341年,秦国联合齐、赵两国攻打魏国。同年九月,秦孝公派商鞅进攻魏国河东,魏派“公子卬(Ang2)”迎战。两军对峙时,商鞅派使者送信给公子卬,说:“我当初与公子相处的很快乐,如今你我成了敌对两国的将领,不忍心相互攻击,我可以与公子当面相见,订立盟约,痛痛快快地喝几杯然后各自撤兵,让秦魏两国相安无事。”公子卬赴会时被商鞅埋伏的甲士俘虏,商鞅趁机攻击魏军,魏军大败。对敌国高层将领如此这般欺诈,商鞅对“兵不厌诈”这条法则的升级做了划时代意义的贡献,他做事不择手段的个性也暴露无疑。魏惠王被迫割让河西部分土地求和,商鞅因战功获封“商地”十五邑,号为商君。公元前338年,秦国又在山西运城河津击败魏军,俘虏了魏军主帅“魏错”。
        
        秦孝公志得意满,但他的寿命也已经走到尽头。公元前338年,43岁的秦孝公去世,不久后,在秦国威风了21年,时年57岁的商鞅被杀死在陕西渭南华县,尸体带回咸阳车裂示众,全家被秦惠文王诛灭。
        
        秦惠文王继位时刚好18岁,时年62岁的魏惠王迎来了五年的和平岁月,他于公元前334年66岁时,在相国“惠施”的陪同下,跟时年44岁的齐威王在山东枣庄滕州举行了“徐州相王”活动。公元前333年秦国大良造“公孙衍”率领秦军攻魏,此后直至公元前328年,“公孙衍”帮助秦惠文王夺取了魏国西河全境,斩杀了魏将“龙贾”所部八万魏军,使得魏惠王感叹“东败于齐,西丧秦地七百余里,南辱于楚”,七百余里相当于五千平方公里,约为现今陕西渭南五分之二的面积。正当“公孙衍”在秦国风生水起时,“张仪”在“苏秦”暗中资助下来到了秦国,抢走了他的风头和饭碗。公孙衍不得不离开秦国,到魏国做了将军,从此他与张仪成了不共戴天的死敌。
        
        秦惠文王于公元前328年任用张仪为“相”,又于公元前324年自立为王。公元前323年,楚国令尹“昭阳”攻打魏国获胜,打算移军攻打齐国,秦国许诺帮助魏国抵御楚国,作为交换,秦军借道韩、魏攻打齐国,此事记载在《战国策•齐策一•秦假道韩魏以攻齐》中。齐威王时年55岁,他任命“孟子”的学生“匡章”为大将,在开展于山东济宁兖州的“桑丘之战”中大败秦军。秦国得知前线败讯,连忙派遣“陈轸”作为使者,以“西藩之臣”的身份前去齐国向齐威王谢罪。同时陈轸也替齐王游说楚将“昭阳”,使其退兵。不久以后,齐楚秦三国会盟于位于江苏徐州沛县的宋国“啮桑”。此后秦国改变战略,与齐国继续“连横”,二十余年间齐、秦两国再无交兵。同一年,“公孙衍”张罗了魏国、韩国、赵国、燕国和中山国的“五国相王”活动,但在齐楚秦三国反对下,“五国相王”以失败告终。
        
        公元前322年,为了秦国的利益,张仪辞去“秦相”一职,改去魏国担任国相,他把原魏国国相“惠施”驱逐出魏国,并打算使魏国臣事秦国,好让其它诸侯国效法。由于魏惠王不愿意臣事秦国,于是秦国动用武力骚扰魏国边境,以此来进行威胁。公元前319年,魏惠王去世,儿子魏襄王继位,他把张仪赶回了秦国,改任“公孙衍”为魏相。第二年,公孙衍说服诸侯,组织起魏、赵、韩、燕、楚五个国家的兵马,联合出兵攻打秦国,秦国进行还击,打败了韩国“申差”的部队,杀死了八万韩军,诸侯们震惊慌恐,《史记卷五.秦本纪第五》记载,『七年,乐池相秦。韩、赵、魏、燕、齐帅匈奴共攻秦。秦使庶长疾与战修鱼,虏其将申差,败赵公子渴、韩太子奂,斩首八万二千』。公元前317年,张仪再次游说魏襄王退出合纵盟约,臣事秦国,这一次,魏国宣布退出南北合纵,请张仪担任中间人与秦国和解,张仪就此回到秦国,重新出任国相,并于公元前316年吞并巴蜀,设立巴郡、蜀郡和汉中郡。
        
        公孙衍在公元前318年组织五国诸侯合纵攻秦失败后,虽然后来又出任过韩国国相,但再也没能掀起大的浪花,张仪则继续璀粲耀眼,他在公元前313年把时年42岁的“楚怀王”玩弄股掌之间。《史记卷四十.楚世家第十记载》,『十七年春,与秦战丹阳,秦大败我军,斩甲士八万,虏我大将军屈匄(Gai4)、裨将军逢侯丑等七十馀人,遂取汉中之郡。楚怀王大怒,乃悉国兵复袭秦,战於蓝田,大败楚军。韩、魏闻楚之困,乃南袭楚,至於邓。楚闻,乃引兵归』。张仪发扬光大了商鞅的“兵不厌诈”手段,升华到了“政不厌诈”的境界,给“楚怀王”这个愚蠢自负的君主上了非常生动的一课,让楚国在河南南阳西峡、陕西西安蓝田连番大败,伤亡惨重。在公元前311年,他又连环游说楚怀王、韩宣襄王、齐宣王、赵武灵王、燕昭王,让楚韩齐赵燕五国和魏国一样,都向秦国称臣,五位君主都答应了他。张仪兴冲冲赶回咸阳邀功,可惜秦惠文王没等他回去就死掉了,享年45岁。新上任的秦武王听从秦国大臣的建议,于公元前310年把张仪送到了魏国,张仪又出任了一年魏相,然后于公元前309年去世。
        

        张仪死于公元前309年,是确定无疑的事情,但他的师兄“苏秦”的生卒年份却比较飘忽不定。公元前334年,苏秦游说燕后文公成功,燕文公资助他车马金帛,前去游说赵国,苏秦从此开始发迹。在此之前,他试图游说周显王、秦惠文王,都遭遇了失败。时来运转后,苏秦很容易地取得了“赵肃侯”的支持,随后他游说了韩宣王、魏惠王、齐威王、楚威王,并于公元前328年资助张仪在秦国站稳了脚跟,而此时的燕国已经换了新君“燕易王”。公元前320年30岁的“齐宣王”接过了老爹“齐威王”的权柄,六年后的公元前314年,“燕易王”禅让王位给宰相“子之”,燕国大乱,“燕易王”、“子之”都死于乱军之中。《史记卷六十九.苏秦列传第九》记载,『齐宣王因燕丧伐燕,取十城』。燕昭王于公元前312年在国人拥立下继位,时年23岁。秦惠文王比燕昭王年长21岁,他曾经嫁了一位自己的女儿给燕易王,这位秦女与苏秦产生了比较亲密的感情。在《史记》的《苏秦列传》与《张仪列传》中,以及《战国策》中,关于苏秦的记录是无比的混乱,连带着齐国与燕国的记录也混乱起来。他游说过“齐闵王”和“魏襄王”,最后死于齐闵王执政的公元前301年至公元前284年之间。 


本节到此结束,欲知后事如何,请看下回分解。

        
import requests from bs4 import BeautifulSoup import re import jieba import matplotlib.pyplot as plt import networkx as nx import csv import matplotlib.colors as mcolors import os # 设置中文字体 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False def fetch_html(url): """获取指定URL的HTML内容""" 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' } response = requests.get(url, headers=headers) if response.status_code == 200: return response.content.decode('utf-8') else: raise Exception(f"Failed to fetch page, status code: {response.status_code}") def extract_plot(url): """从豆瓣剧情页面提取剧情内容""" html_content = fetch_html(url) soup = BeautifulSoup(html_content, 'html.parser') # 获取剧情简介 plot_text = "" plot_div = soup.find('div', id="link-report") if plot_div: plot_text = plot_div.get_text(strip=True).replace("\u3000", "").replace("\\n", "\n") # 如果剧情太短,尝试从评论中获取 if len(plot_text) < 500: reviews = soup.find_all('div', class_='review-short') for review in reviews[:5]: plot_text += review.get_text(strip=True).replace("\u3000", "") + "\n\n" return plot_text def extract_characters(url): """从豆瓣演职员页面提取角色列表""" html_content = fetch_html(url) soup = BeautifulSoup(html_content, 'html.parser') # 提取角色列表 characters = [] actor_list = soup.find_all('div', class_='list-wrapper') for actor_section in actor_list: for li in actor_section.find_all('li'): # 提取角色名 role_span = li.find('span', class_='role') if role_span: role_text = role_span.get_text(strip=True) # 清洗角色名称 role_text = re.sub(r'[饰演].*|[饰演].*', '', role_text) role_text = re.sub(r'[\[\(].*?[\]\)]', '', role_text) if len(role_text) > 1 and role_text not in characters: characters.append(role_text) return characters def preprocess_plot(plot_text): """预处理剧情文本""" # 替换剧集中提到的剧名,避免被识别为角色 plot_text = plot_text.replace("芈月", "主角").replace("芈月传", "本剧") return plot_text # 豆瓣电影《芈月传》的相关URL plot_url = "https://movie.douban.com/subject/25742289/" # 剧情简介页面 character_url = "https://movie.douban.com/subject/25742289/celebrities" # 演职员页面 # 1. 获取剧情内容 print("获取剧情内容...") plot_text = extract_plot(plot_url) if not plot_text: # 从备份文件中获取(如果网络请求失败) if os.path.exists("芈月传剧情备份.txt"): with open("芈月传剧情备份.txt", "r", encoding="utf-8") as f: plot_text = f.read() else: # 保存备份 with open("芈月传剧情备份.txt", "w", encoding="utf-8") as f: f.write(plot_text) # 预处理剧情文本 plot_text = preprocess_plot(plot_text) with open('芈月传剧情.txt', 'w', encoding='utf-8') as f: f.write(plot_text) # 2. 获取角色列表 print("获取角色列表...") characters = extract_characters(character_url) if not characters: # 使用预设角色列表(如果网络请求失败) characters = ['芈月', '芈姝', '嬴驷', '黄歇', '翟骊', '魏琰', '嬴稷', '芈槐', '芈茵', '芈戎', '孟嬴', '香儿', '葵姑', '威后', '莒姬', '葵姑', '穆监', '绿萝', '赢华', '樗里子', '芈姝母', '芈月母', '张仪', '苏秦', '庸芮', '魏冉', '芈戎'] # 保存角色列表 with open('芈月传角色名单.txt', 'w', encoding='utf-8') as f: f.write('\n'.join(characters)) print(f"角色列表: {', '.join(characters)}") print(f"剧情文本长度: {len(plot_text)} 字符") # 3. 为分词添加角色名 for name in characters: jieba.add_word(name) # 对于长名字添加分词组合 if len(name) == 3: jieba.add_word(name[:2]) jieba.add_word(name[1:]) elif len(name) >= 4: jieba.add_word(name[:2]) jieba.add_word(name[2:]) jieba.add_word(name[1:3]) # 4. 人物出场次数统计 print("统计人物出场次数...") with open('芈月传剧情.txt', 'r', encoding='utf-8') as f: plot_summary = f.read() # 分割句子 sentences = re.split(r'[。!?;\n]', plot_summary) sentences = [s for s in sentences if len(s.strip()) > 5] # 统计各角色出场次数 name_counts = {name: 0 for name in characters} for sentence in sentences: words = jieba.cut(sentence) for word in words: if word in name_counts: name_counts[word] += 1 # 过滤没有出场或出场次数过低的角色 active_characters = [name for name, count in name_counts.items() if count > 0] print(f"有效角色数量: {len(active_characters)}") # 按出场次数排序 sorted_name_counts = sorted(name_counts.items(), key=lambda item: item[1], reverse=True) top_characters = [item[0] for item in sorted_name_counts[:min(15, len(sorted_name_counts))] if item[1] > 0] top_counts = [item[1] for item in sorted_name_counts[:min(15, len(sorted_name_counts))] if item[1] > 0] # 绘制出场次数统计图 plt.figure(figsize=(14, 8)) plt.bar(top_characters, top_counts, color='#1f77b4', alpha=0.8) plt.xlabel('角色名称', fontsize=12, fontweight='bold') plt.ylabel('出场次数', fontsize=12, fontweight='bold') plt.title('《芈月传》人物出场次数统计TOP15', fontsize=16, fontweight='bold') plt.xticks(rotation=25) plt.grid(axis='y', alpha=0.5) plt.tight_layout() plt.savefig('芈月传人物出场次数统计.png', dpi=150) plt.close() # 5. 构建人物关系网络 print("构建人物关系网络...") G = nx.Graph() # 添加点(只添加活跃角色) for name in active_characters: G.add_node(name, size=name_counts[name]) # 预设关系增强(基于剧情分析) enhanced_relationships = { ('芈月', '芈姝'): -5, # 敌对关系 ('芈月', '黄歇'): 8, # 爱人 ('芈月', '翟骊'): 7, # 爱人 ('芈月', '嬴驷'): 6, # 君臣/夫妻 ('芈月', '嬴稷'): 9, # 母子 ('芈姝', '嬴驷'): 6, # 夫妻 ('芈姝', '魏琰'): -3, # 亦敌亦友 ('黄歇', '翟骊'): -4, # 情敌 ('嬴驷', '魏琰'): 4, # 君臣 ('芈月', '芈茵'): -5, # 敌对 ('芈月', '威后'): -6, # 敌对 ('芈月', '张仪'): 7, # 盟友 } # 统计句子中共现情况 sentence_cooccurrence = {} for sentence in sentences: # 找出当前句子中出现的角色 current_chars = set() words = jieba.cut(sentence) for word in words: if word in active_characters: current_chars.add(word) # 为当前句子中出现的人物建立关系 char_list = list(current_chars) for i in range(len(char_list)): for j in range(i+1, len(char_list)): char1, char2 = sorted([char_list[i], char_list[j]]) pair = (char1, char2) # 累加关系权重 sentence_cooccurrence[pair] = sentence_cooccurrence.get(pair, 0) + 1 # 将关系添加到图中 for pair, count in sentence_cooccurrence.items(): char1, char2 = pair weight = count # 检查是否在增强字典中 if pair in enhanced_relationships: sign = 1 if enhanced_relationships[pair] > 0 else -1 weight = max(2, count) * (abs(enhanced_relationships[pair]) / 5) weight *= sign # 检查反向关系对 elif (char2, char1) in enhanced_relationships: sign = 1 if enhanced_relationships[(char2, char1)] > 0 else -1 weight = max(2, count) * (abs(enhanced_relationships[(char2, char1)]) / 5) weight *= sign else: # 默认处理:少于2次共现关系不强 if count <= 1: continue # 添加或更新关系 if G.has_edge(char1, char2): current_weight = G[char1][char2].get('weight', 0) G[char1][char2]['weight'] = current_weight + weight else: G.add_edge(char1, char2, weight=weight) # 6. 导出CSV文件 with open('芈月传人物关系_点.csv', 'w', newline='', encoding='utf-8-sig') as f: writer = csv.writer(f) writer.writerow(['Id', 'Label', 'Size']) for node, data in G.nodes(data=True): writer.writerow([node, node, data.get('size', 1)]) with open('芈月传人物关系_边.csv', 'w', newline='', encoding='utf-8-sig') as f: writer = csv.writer(f) writer.writerow(['Source', 'Target', 'Weight', 'Type']) for u, v, data in G.edges(data=True): edge_type = 'Positive' if data['weight'] > 0 else 'Negative' writer.writerow([u, v, abs(data['weight']), edge_type]) # 7. 可视化人物关系图 if G.number_of_edges() > 0: plt.figure(figsize=(20, 16)) # 点大小基于出场次数 node_sizes = [data.get('size', 1) * 100 for _, data in G.nodes(data=True)] # 边的宽度和颜色基于关系强度 edge_widths = [] edge_colors = [] for u, v, data in G.edges(data=True): weight = abs(data['weight']) if data['weight'] > 0: # 正向关系 - 红色 edge_colors.append('red') else: # 负向关系 - 蓝色 edge_colors.append('blue') edge_widths.append(min(weight, 5)) # 使用布局算法 pos = nx.spring_layout(G, k=0.3, iterations=50, seed=42) # 绘制图形 nx.draw_networkx_nodes(G, pos, node_size=node_sizes, node_color='#ffcc99', alpha=0.9) nx.draw_networkx_edges(G, pos, edge_color=edge_colors, width=edge_widths, alpha=0.7) nx.draw_networkx_labels(G, pos, font_size=12, font_family='SimHei') # 添加图例 plt.scatter([], [], c='#ffcc99', s=100, label='人物点') plt.plot([], [], c='red', linewidth=3, label='正向关系') plt.plot([], [], c='blue', linewidth=3, label='负向关系') plt.legend(loc='best', fontsize=12) plt.title('《芈月传》人物关系网络', fontsize=20) plt.axis('off') plt.tight_layout() plt.savefig('芈月传人物关系图.png', dpi=150) plt.close() print("分析完成!已保存关系图和统计数据文件。") 以上述代码为模版,爬取https://www.tvmao.com/drama/KSExaik=/episode 电视猫中的数据,做人物关系图
06-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值