├── data ├── __init__.py ├── goods_type.py ├── common.js └── server.json ├── spider ├── __init__.py ├── stone_spider.py └── equip_spider.py ├── utils ├── __init__.py ├── handle_data.py ├── server_util.py ├── wx_util.py ├── db_util.py └── http_util.py ├── README.md └── .gitignore /data/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /spider/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /utils/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 一个梦幻西游藏宝阁爬虫小项目 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .pyc 3 | .iml 4 | .xml -------------------------------------------------------------------------------- /utils/handle_data.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | with open('/Users/lsy/person/workspace/my_work/mhxycbg/spider/server.json', 'r', encoding='UTF-8') as file: 4 | result = file.read() 5 | server_json = json.loads(result) 6 | server_str = {} 7 | for id in server_json: 8 | for s in server_json[id][1]: 9 | server_str[s[0]] = server_json[id][0][0] + '-' + s[1] 10 | print(server_str) -------------------------------------------------------------------------------- /data/goods_type.py: -------------------------------------------------------------------------------- 1 | class goods_type(object): 2 | # 装备类型 3 | dict_kind = { 4 | 6: "剑", 4: "枪矛", 10: "扇", 14: "刀", 5: "斧钺", 11: "魔棒", 8: "飘带", 5 | 9: "爪刺", 73: "巨剑", 74: "伞", 15: "锤", 7: "双短剑", 72: "灯笼", 13: "环圈", 6 | 53: "弓箭", 12: "鞭", 54: "法杖", 52: "宝珠", 20: "腰带", 17: "头盔", 21: "饰物", 7 | 18: "铠甲", 59: "女衣", 58: "发钗" 8 | } 9 | 10 | # 材料类型 11 | dict_s_type = { 12 | 13 | } -------------------------------------------------------------------------------- /utils/server_util.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | class server_util(object): 4 | # 服务器列表 5 | dict_server = {} 6 | 7 | def init(self): 8 | # 加载服务器列表 9 | with open('/Users/lsy/person/workspace/my_work/mhxycbg/data/server.json', 'r', encoding='UTF-8') as file: 10 | result = file.read() 11 | server_json = json.loads(result) 12 | for id in server_json: 13 | for s in server_json[id][1]: 14 | self.dict_server[s[0]] = server_json[id][0][0] + '-' + s[1] 15 | 16 | def get_server_list(self): 17 | if len(self.dict_server) == 0: 18 | self.init() 19 | return self.dict_server -------------------------------------------------------------------------------- /utils/wx_util.py: -------------------------------------------------------------------------------- 1 | import itchat 2 | 3 | class wx_util(object): 4 | # enableCmdQR=True,允许在cmd命令行显示二维码 5 | # hotReload=True,允许短期内可以不需要重复登陆 6 | itchat.auto_login(hotReload=True) 7 | 8 | def send_msg(self): 9 | to_name = itchat.search_friends(name="鲍聪浩") 10 | print(to_name) 11 | # 发送文本消息 12 | for i in range(10): 13 | itchat.send('测试中。。。',toUserName=to_name[0]['UserName']) 14 | # 15 | # # 发送表情包 16 | # file_img = 'biaoqingbao.jpg' 17 | # itchat.send_image(file_img,toUserName=to_name[0]['UserName']) 18 | 19 | # search_chatrooms 获取通讯录中群聊列表 update=True 会获取实时有信息的群 20 | # myroom = itchat.get_chatrooms(update=True) 21 | # print(myroom) 22 | # to_room = itchat.search_chatrooms(name='群聊名称') 23 | # # print(to_room) 24 | # for i in range(10): 25 | # itchat.send('需要发送的文字信息',toUserName=to_room[0]['UserName']) 26 | 27 | 28 | 29 | s = wx_util() 30 | s.send_msg() -------------------------------------------------------------------------------- /utils/db_util.py: -------------------------------------------------------------------------------- 1 | import pymysql 2 | from DBUtils.PooledDB import PooledDB 3 | 4 | class db_util(object): 5 | 6 | # 建立数据库连接 7 | pool = PooledDB( 8 | creator=pymysql, # 使用链接数据库的模块 9 | maxconnections=100, # 连接池允许的最大连接数,0和None表示不限制连接数 10 | mincached=2, # 初始化时,链接池中至少创建的空闲的链接,0表示不创建 11 | maxcached=5, # 链接池中最多闲置的链接,0和None不限制 12 | maxshared=1, # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。 13 | blocking=True, # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错 14 | maxusage=None, # 一个链接最多被重复使用的次数,None表示无限制 15 | setsession=[], # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."] 16 | ping=0, 17 | # ping MySQL服务端,检查是否服务可用。 18 | # 如:0 = None = never, 19 | # 1 = default = whenever it is requested, 20 | # 2 = when a cursor is created, 21 | # 4 = when a query is executed, 22 | # 7 = always 23 | host='127.0.0.1', 24 | port=3306, 25 | user='root', 26 | password='', 27 | database='mhxy', 28 | charset='utf8' 29 | ) 30 | 31 | def execute_sql(self, sql): 32 | conn = self.pool.connection() 33 | cur = conn.cursor(pymysql.cursors.DictCursor) 34 | cur.execute(sql) 35 | conn.commit() 36 | cur.close() 37 | conn.close() 38 | -------------------------------------------------------------------------------- /spider/stone_spider.py: -------------------------------------------------------------------------------- 1 | import sys 2 | sys.path.append('/Users/lsy/person/workspace/my_work/mhxycbg') 3 | 4 | import json 5 | import execjs 6 | import threading 7 | import time 8 | 9 | from data.goods_type import goods_type 10 | from utils.server_util import server_util 11 | from utils.http_util import http_util 12 | from utils.db_util import db_util 13 | 14 | class stone_spider(object): 15 | # 初始化外部类 16 | server_util_c = server_util() 17 | goods_type_c = goods_type() 18 | http_util_c = http_util() 19 | db_util_c = db_util() 20 | 21 | # 宝石类型 22 | dict_stone = { 23 | 4002: "太阳石", 4003: "月亮石", 4004: "光芒石", 4005: "神秘石", 24 | 4010: "黑宝石", 4011: "红玛瑙", 4012: "舍利子", 4244: "星辉石", 25 | 4249: "翡翠石" 26 | } 27 | 28 | def get_info(self, server_id, stone_type, level): 29 | params = { 30 | 'act': 'recommd_by_role', 31 | 'server_id': server_id, 32 | 'page': 1, 33 | 's_type': stone_type, 34 | 'equip_level': level, 35 | 'search_type': 'search_stone', 36 | 'query_order': 'price ASC', 37 | 'count': 1 38 | } 39 | res_data = self.http_util_c.get_cbg_info_proxy(params, 5) 40 | if len(res_data) > 0: 41 | return res_data[0]['price'] 42 | 43 | s = stone_spider() 44 | min_price = s.get_info(79, 4244, 7) 45 | print(min_price) -------------------------------------------------------------------------------- /data/common.js: -------------------------------------------------------------------------------- 1 | const jsdom = require('jsdom'); 2 | const { JSDOM } = jsdom; 3 | const dom = new JSDOM(`

Hello world

`); 4 | window = dom.window; 5 | document = window.document; 6 | XMLHttpRequest = window.XMLHttpRequest; 7 | 8 | var a1 = ['substring', 'atob', 'charCodeAt', 'push', 'test']; 9 | (function (a2, a3) { 10 | var a5 = function (a4) { 11 | while (--a4) { 12 | a2['push'](a2['shift']()); 13 | } 14 | }; 15 | a5(++a3); 16 | }(a1, 0x153)); 17 | var a6 = function (a7, a8) { 18 | a7 = a7 - 0x0; 19 | var a9 = a1[a7]; 20 | return a9; 21 | }; 22 | function decode_desc(a11) { 23 | if (a11 = a11['replace'](/^\s+|\s+$/g, ''), !/^@[\s\S]*@$/ [a6('0x0')](a11)) return a11; 24 | var a18 = (/\b_k=([^;]*)/ ['exec'](document['cookie']) || [])[0x1] || ''; 25 | if (a11 = a11['replace'](/^@|@$/g, ''), /^[^@]+@[\s\S]+/ ['test'](a11)) { 26 | var a19 = a11['indexOf']('@'); 27 | a18 = a11[a6('0x1')](0x0, a19), a11 = a11['substring'](a19 + 0x1); 28 | } 29 | var a12 = function s(a11) { 30 | try { 31 | return window['eval']('(' + a11 + ')'); 32 | } catch (_0x40b9c3) { 33 | return null; 34 | } 35 | }(a11 = window[a6('0x2')](a11)); 36 | a12 && 'object' == typeof a12 && a12['d'] && (a12 = a12['d']); 37 | for (var a13 = [], a14 = 0x0, a16 = 0x0; a16 < a12['length']; a16++) { 38 | var a15 = a12['charCodeAt'](a16), 39 | a17 = a18[a6('0x3')](a14 % a18['length']); 40 | a14 += 0x1, a15 = 0x1 * a15 ^ a17, a13[a6('0x4')](a15['toString'](0x2)); 41 | } 42 | return function d(a11) { 43 | for (var a18 = [], a19 = 0x0; a19 < a11['length']; a19++) a18['push'](window['String']['fromCharCode'](window['parseInt'](a11[a19], 0x2))); 44 | return a18['join'](''); 45 | }(a13); 46 | } 47 | -------------------------------------------------------------------------------- /utils/http_util.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import os 3 | import json 4 | 5 | class http_util(object): 6 | def http_get(self, header, params, url): 7 | return requests.get(url, headers=header, params=params, timeout = 10) 8 | 9 | def http_proxy_get(self, header, params, url): 10 | self.set_proxy() 11 | return requests.get(url, headers=header, params=params, timeout = 10) 12 | 13 | def set_proxy(self): 14 | if "http_proxy" in os.environ: 15 | del os.environ["http_proxy"] 16 | if "https_proxy" in os.environ: 17 | del os.environ["https_proxy"] 18 | url = 'http://http.tiqu.letecs.com/getip3?num=1&type=1&pro=&city=0&yys=0&port=11&pack=141532&ts=0&ys=0&cs=0&lb=1&sb=0&pb=4&mr=2®ions=&gm=4' 19 | proxy_url = self.http_get(None, None, url).text 20 | print(str("http://" + proxy_url)) 21 | os.environ["http_proxy"] = str("http://" + proxy_url) 22 | os.environ["https_proxy"] = str("https://" + proxy_url) 23 | 24 | def get_cbg_info_proxy(self, params, retry): 25 | url = "https://xyq.cbg.163.com/cgi-bin/recommend.py" 26 | header = { 27 | 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36' 28 | } 29 | res = self.http_get(header, params, url) 30 | if res.text == '出错了: 没有找到相关的action': 31 | return [] 32 | res_json = json.loads(res.text) 33 | num = 0 34 | while "equips" not in res_json: 35 | if num > retry: 36 | return [] 37 | self.set_proxy() 38 | res = self.http_get(header, params, url) 39 | res_json = json.loads(res.text) 40 | num += 1 41 | return res_json["equips"] 42 | 43 | s = http_util() 44 | # s.set_proxy() 45 | params = { 46 | 'act': 'recommd_by_role', 47 | 'server_id': 79, 48 | 'page': 1, 49 | 's_type': 4244, 50 | 'equip_level': 7, 51 | 'search_type': 'search_stone', 52 | 'query_order': 'price ASC', 53 | 'count': 1 54 | } 55 | s.get_cbg_info_proxy(params, 5) -------------------------------------------------------------------------------- /spider/equip_spider.py: -------------------------------------------------------------------------------- 1 | import sys 2 | sys.path.append('/Users/lsy/person/workspace/my_work/mhxycbg') 3 | 4 | import json 5 | import execjs 6 | import threading 7 | import time 8 | 9 | from data.goods_type import goods_type 10 | from utils.server_util import server_util 11 | from utils.http_util import http_util 12 | from utils.db_util import db_util 13 | 14 | class equip_spider(object): 15 | # 初始化外部类 16 | server_util_c = server_util() 17 | goods_type_c = goods_type() 18 | http_util_c = http_util() 19 | db_util_c = db_util() 20 | 21 | # 加载js 22 | with open('/Users/lsy/person/workspace/my_work/mhxycbg/data/common.js', 'r', encoding='UTF-8') as file: 23 | result = file.read() 24 | common_js_code = execjs.compile(result, cwd=r'/usr/local/lib/node_modules') 25 | 26 | attribute_names = ["魔力", "体质", "力量", "耐力", "敏捷"] 27 | dict_server = server_util_c.get_server_list() 28 | dict_kind = goods_type_c.dict_kind 29 | 30 | server_ids = dict_server.keys() 31 | kind_ids = dict_kind.keys() 32 | 33 | def get_info(self, server_id, kind_id, price, level_start, level_end): 34 | sql_module = "replace into `cbg_equip` (`name`, `type`, `equip_id`, `init_shanghai`, `init_zongshang`, `init_mofa`, `init_fangyu`, `init_linli`, `init_minjie`, `init_qixue`, `addon_moli`, `addon_naili`, `addon_liliang`, `addon_tizhi`, `addon_minjie`, `tj`, `tx`, `tz`, `level`, `price`, `server_id`, `tag_json`, `e_id`, `server_name`, `type_name`, `url`) VALUES ('{0}', {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}, {10}, {11}, {12}, {13}, {14}, '{15}', '{16}', '{17}', {18}, {19}, {20}, '{21}', '{22}', '{23}', '{24}', '{25}');" 35 | for page in range(0, 100): 36 | print(self.dict_server[server_id] + " " + self.dict_kind[kind_id] + " " + str(page)) 37 | params = { 38 | 'act': 'recommd_by_role', 39 | 'server_id': server_id, 40 | 'page': page + 1, 41 | 'kindid':kind_id, 42 | 'count':100 43 | } 44 | res_data = self.http_util_c.get_cbg_info_proxy(params, 5) 45 | if len(res_data) == 0: 46 | print("数据为空") 47 | break 48 | for data in res_data: 49 | if float(data["price"]) > price: 50 | continue 51 | if int(data["level"]) < level_start or int(data["level"]) > level_end: 52 | continue 53 | 54 | attr_info = [0, 0, 0, 0, 0] 55 | tj = '' 56 | tx = '' 57 | tz = '' 58 | if data["other_info"] is not None or data["other_info"] != '': 59 | other_info = self.common_js_code.call("decode_desc", data["other_info"]) 60 | other_info_json = json.loads(other_info) 61 | add_melt_attrs = other_info_json["add_melt_attrs"] 62 | 63 | for attr in add_melt_attrs: 64 | attr_split = attr.split(' ') 65 | if attr_split[0] in self.attribute_names: 66 | attr_info[self.attribute_names.index(attr_split[0])] = attr_split[1] 67 | desc = other_info_json["desc"] 68 | desc_tj = desc.split('#c4DBAF4') 69 | if len(desc_tj) > 1: 70 | desc_tj_tx_str = ''.join(''.join(''.join(desc_tj[1:]).split('制造者')[:1]).split('开运孔数')[:1]).replace('#', '').replace('Y', '').replace('r', '').replace('W', '').replace('G', '') 71 | tj_tx_str_split = desc_tj_tx_str.split('特效:') 72 | if len(tj_tx_str_split) == 1: 73 | tj_tz_split = tj_tx_str_split[0].split('套装效果:') 74 | if len(tj_tz_split) == 2: 75 | tz = tj_tz_split[1] 76 | tj = tj_tz_split[0].replace('特技:', '') 77 | else: 78 | if tj_tx_str_split[0] != '': 79 | tj = tj_tx_str_split[0].replace('特技:', '') 80 | tx_tz_split = tj_tx_str_split[1].split('套装效果:') 81 | if len(tx_tz_split) == 2: 82 | tz = tx_tz_split[1] 83 | tx = tx_tz_split[0].replace('特效:', '') 84 | url = "http://xyq.cbg.163.com/equip?s="+ str(server_id) +"&eid="+ data["eid"] +"&view_loc=equip_list|" + data["tag_key"] 85 | sql = sql_module.format(data["equip_name"], kind_id, data["equipid"], data["init_damage_raw"], data["init_damage"], data["mofa"], data["init_defense"], data["lingli"], data["minjie"], data["init_hp"], attr_info[0], attr_info[3], attr_info[2], attr_info[1], attr_info[4], tj, tx, tz, data["level"], data["price"], server_id, data["tag_key"], data["eid"], self.dict_server[server_id], self.dict_kind[kind_id], url) 86 | self.db_util_c.execute_sql(sql) 87 | 88 | def start(self, kind_ids, price, level_start, level_end): 89 | thread_list = [] 90 | for s in self.dict_server: 91 | for kind_id in kind_ids: 92 | c_thread = cbg_thread(self.dict_server[s], s, kind_id, price, level_start, level_end) 93 | c_thread.start() 94 | thread_list.append(c_thread) 95 | time.sleep(5) 96 | if len(thread_list) >= 2: 97 | while thread_list: 98 | thread_list.pop().join() 99 | 100 | 101 | class cbg_thread(threading.Thread): 102 | def __init__(self, thread_name, server_id, kind_id, price, level_start, level_end): 103 | threading.Thread.__init__(self) 104 | self.thread_name = thread_name 105 | self.server_id = server_id 106 | self.kind_id = kind_id 107 | self.price = price 108 | self.level_start = level_start 109 | self.level_end = level_end 110 | def run(self): 111 | print ("开始线程: " + self.thread_name) 112 | s = equip_spider() 113 | s.get_info(self.server_id, self.kind_id, self.price, self.level_start, self.level_end) 114 | print ("结束线程: " + self.thread_name) 115 | 116 | s = equip_spider() 117 | # s.start([6], 10000000000000000000.0, 0, 160) 118 | s.start([6, 10], 300.0, 120, 120) 119 | 120 | # proxy_host, proxy_port = s.get_ip() 121 | # proxy_meta = "http://%(host)s:%(port)s" % { 122 | # "host" : proxy_host, 123 | # "port" : proxy_port, 124 | # } 125 | # proxies = { 126 | # "http" : proxy_meta, 127 | # "https" : proxy_meta 128 | # } 129 | # cookies = { 130 | # 'kuaishou.merchant.guard_st': 'ChprdWFpc2hvdS5tZXJjaGFudC5ndWFyZC5zdBKwAZE4YnjlQrG8Aaf5fr6lqRL0Cp7X7sQ4j6eapyaB6UVTdR9hBRPYoubcbfj5dlkFd4PyuYcdU8eZ3tE_8wE0GOzmrZH56kCb2KITWkhGX8RLaZFogh1AGTSiKWOL0Ipw1cg-RRIEny8kwaPnc5G4tLO6klN5NyrhYjxdI7z6pVKIncmgOQlYRYePlICbaSVyz5y2lsBrda82qHQ3yjk2su8-uQrF82OJuxyMrskDpCh_GhKdiHHQOZJX8h-sVT_H10927YkiIO9tYuDJWPi1WejtCPHV4k9rVfiYw2xlz0wkdfS_XkwDKAowAQ', 131 | # 'did': 'web_153c6482d2aa4abebace13592eb6641bc734', 132 | # 'userId': '1761432505' 133 | # } 134 | # res = requests.get('https://kwaishop-guard.test.gifshow.com/rest/pc/guard/users/getUserInfo', proxies=proxies, cookies=cookies) 135 | # print(res.text) -------------------------------------------------------------------------------- /data/server.json: -------------------------------------------------------------------------------- 1 | { 2 | "1": [["上海1区", "5_3", "4", "shanghai1qu", 1, "shyq"], [[159, "珍宝阁", "1_1", "zhenbaoge", "zbg"], [163, "晚芳亭", "2_1", "wanfangting", "wft"], [841, "灿若星河", "3_1", "canruoxinghe", "crxh"], [841, "海阔天空", "4_1", "haikuotiankong", "hktk"], [861, "倾城之恋", "5_1", "qingchengzhilian", "qczl"]]], 3 | "2": [["广东3区", "4_7", "40", "guangdong3qu", 2, "gdsq"], [[2, "罗浮山", "1_1", "luofushan", "lfs"], [677, "广州湾", "2_1", "guangzhouwan", "gzw"]]], 4 | "3": [["北京1区", "5_1", "3", "beijing1qu", 3, "bjyq"], [[3, "国子监", "1_1", "guozijian", "gzj"], [155, "太和殿", "2_1", "taihedian", "thd"], [9, "紫禁城", "3_1", "zijincheng", "zjc"], [459, "2008", "4_1", "2008", "ellb"], [527, "生日快乐", "5_1", "shengrikuaile", "srkl"], [699, "喜大普奔", "6_1", "xidapuben", "xdpb"], [769, "恭王府", "7_1", "gongwangfu", "gwf"], [776, "天坛公园", "1_2", "tiantangongyuan", "ttgy"], [786, "五道口", "2_2", "wudaokou", "wdk"], [838, "黄金台", "3_2", "huangjintai", "hjt"], [846, "豪情壮志", "4_2", "haoqingzhuangzhi", "hqzz"], [851, "江山如画", "5_2", "jiangshanruhua", "jsrh"], [871, "繁荣富强", "6_2", "fanrongfuqiang", "frfq"]]], 5 | "4": [["广东4区", "4_8", "48", "guangdong4qu", 4, "gdsq"], [[358, "流花湖", "1_1", "liuhuahu", "lhh"], [85, "白云山", "2_1", "baiyunshan", "bys"], [82, "状元坊", "3_1", "zhuangyuanfang", "zyf"], [84, "流溪河", "4_1", "liuxihe", "lxh"]]], 6 | "5": [["浙江3区", "4_3", "43", "zhejiang3qu", 5, "zjsq"], [[139, "普陀山", "1_1", "putuoshan", "pts"], [138, "钱塘江", "2_1", "qiantangjiang", "qtj"], [804, "功成名就", "3_1", "gongchengmingjiu", "gcmj"], [804, "水阁乌镇", "4_1", "shuigewuzhen", "sgwz"], [870, "人杰地灵", "5_1", "renjiediling", "rjdl"]]], 7 | "6": [["广西2区", "1_9", "55", "guangxi2qu", 6, "gxeq"], [[297, "叠彩山", "1_1", "diecaishan", "dcs"], [6, "黄姚古镇", "2_1", "huangyaoguzhen", "hygz"]]], 8 | "7": [["河南2区", "2_5", "39", "henan2qu", 7, "hneq"], [[192, "牡丹亭", "1_1", "mudanting", "mdt"], [193, "少室山", "2_1", "shaoshishan", "sss"], [337, "王屋山", "3_1", "wangwushan", "wws"], [825, "逍遥游", "4_1", "xiaoyaoyou", "xyy"], [869, "天地无极", "5_1", "tiandiwuji", "tdwj"]]], 9 | "8": [["山东2区", "6_6", "13", "shandong2qu", 8, "sdeq"], [[212, "水泊梁山", "1_1", "shuipoliangshan", "spls"], [828, "泱泱大风", "2_1", "yangyangdafeng", "yydf"], [857, "齐鲁大地", "3_1", "qiludadi", "qldd"], [857, "藏龙涧", "4_1", "canglongjian", "clj"]]], 10 | "9": [["北京2区", "5_2", "44", "beijing2qu", 9, "bjeq"], [[299, "阳光城", "1_1", "yangguangcheng", "ygc"], [689, "万里长城", "2_1", "wanlichangcheng", "wlcc"], [732, "长安街", "3_1", "changanjie", "caj"], [799, "东方巨龙", "4_1", "dongfangjulong", "dfjl"], [810, "天之骄子", "5_1", "tianzhijiaozi", "tzjz"], [816, "龙争虎斗", "6_1", "longzhenghudou", "lzhd"], [821, "顺天府", "7_1", "shuntianfu", "stf"], [880, "天下宝藏", "1_2", "tianxiabaozang", "txbz"], [816, "三吴都会", "2_2", "sanwuduhui", "swdh"], [821, "百战不殆", "3_2", "baizhanbudai", "bzbd"], [890, "卢沟晓月", "4_2", "lugouxiaoyue", "lgxy"], [821, "千帆竞发", "5_2", "qianfanjingfa", "qfjf"], [900, "乾清宫", "6_2", "qianqinggong", "qqg"]]], 11 | "10": [["福建2区", "3_7", "45", "fujian2qu", 10, "fjeq"], [[304, "日光岩", "1_1", "riguangyan", "rgy"], [234, "鼓浪屿", "2_1", "gulangyu", "gly"], [11, "百花村", "3_1", "baihuacun", "bhc"], [326, "齐云楼", "4_1", "qiyunlou", "qyl"]]], 12 | "11": [["广西1区", "1_8", "20", "guangxi1qu", 11, "gxyq"], [[12, "明秀园", "1_1", "mingxiuyuan", "mxy"], [249, "青秀山", "2_1", "qingxiushan", "qxs"], [86, "云天宫", "3_1", "yuntiangong", "ytg"]]], 13 | "12": [["河北1区", "2_1", "14", "hebei1qu", 12, "hbyq"], [[60, "缘聚唐城", "1_1", "yuanjutangcheng", "yjtc"], [402, "渤海明珠", "2_1", "bohaimingzhu", "bhmz"]]], 14 | "13": [["河北3区", "2_3", "49", "hebei3qu", 13, "hbsq"], [[15, "避暑山庄", "1_1", "bishushanzhuang", "bssz"]]], 15 | "14": [["黑龙江区", "6_1", "35", "heilongjiangqu", 14, "hljq"], [[221, "雪域天龙", "1_1", "xueyutianlong", "xytl"]]], 16 | "15": [["湖北1区", "2_7", "16", "hubei1qu", 15, "hbyq"], [[94, "武当山", "1_1", "wudangshan", "wds"], [420, "昭君台", "2_1", "zhaojuntai", "zjt"], [874, "大江大湖", "3_1", "dajiangdahu", "djdh"]]], 17 | "16": [["湖北2区", "2_8", "42", "hubei2qu", 16, "hbeq"], [[95, "神农架", "1_1", "shennongjia", "snj"], [223, "黄鹤楼", "2_1", "huanghelou", "hhl"]]], 18 | "17": [["湖南区", "2_9", "26", "hunanqu", 17, "hnq"], [[275, "橘子洲", "1_1", "juzizhou", "jzz"], [96, "洞庭湖", "2_1", "dongtinghu", "dth"]]], 19 | "19": [["天津区", "7_1", "60", "tianjinqu", 19, "tjq"], [[55, "精武门", "1_1", "jingwumen", "jwm"]]], 20 | "20": [["吉林区", "6_2", "36", "jilinqu", 20, "jlq"], [[307, "佟佳江", "1_1", "tongjiajiang", "tjj"]]], 21 | "21": [["江苏1区", "3_1", "9", "jiangsu1qu", 21, "jsyq"], [[101, "文昌阁", "1_1", "wenchangge", "wcg"], [104, "雨花台", "2_1", "yuhuatai", "yht"], [676, "凤凰台", "3_1", "fenghuangtai", "fht"], [831, "风起云扬", "4_1", "fengqiyunyang", "fqyy"], [855, "天下文枢", "5_1", "tianxiawenshu", "txws"]]], 22 | "22": [["江苏2区", "3_2", "38", "jiangsu2qu", 22, "jseq"], [[105, "夫子庙", "1_1", "fuzimiao", "fzm"], [352, "姑苏城", "2_1", "gusucheng", "gsc"], [860, "金风玉露", "3_1", "jinfengyulu", "jfyl"], [860, "枫桥夜泊", "4_1", "fengqiaoyepo", "fqyp"]]], 23 | "23": [["江苏3区", "3_3", "51", "jiangsu3qu", 23, "jssq"], [[26, "花果山", "1_1", "huaguoshan", "hgs"], [462, "镇淮楼", "2_1", "zhenhuailou", "zhl"], [831, "燕子矶", "3_1", "yanziji", "yzj"], [860, "春风十里", "4_1", "chunfengshili", "cfsl"]]], 24 | "24": [["江西区", "3_5", "25", "jiangxiqu", 24, "jxq"], [[270, "庐山胜境", "1_1", "lushanshengjing", "lssj"]]], 25 | "25": [["辽宁1区", "6_3", "15", "liaoning1qu", 25, "lnyq"], [[367, "星海湾", "1_1", "xinghaiwan", "xhw"]]], 26 | "26": [["山东1区", "6_5", "33", "shandong1qu", 26, "sdyq"], [[211, "东岳泰山", "1_1", "dongyuetaishan", "dyts"], [360, "南天门", "2_1", "nantianmen", "ntm"], [669, "青岛栈桥", "3_1", "qingdaozhanqiao", "qdzq"], [681, "东海崂山", "4_1", "donghailaoshan", "dhls"], [669, "孙子兵法", "5_1", "sunzibingfa", "szbf"], [821, "千帆竞发", "6_1", "qianfanjingfa", "qfjf"], [821, "百战不殆", "1_2", "baizhanbudai", "bzbd"], [872, "蓬莱仙境", "2_2", "penglaixianjing", "plxj"], [879, "凌绝顶", "3_2", "lingjueding", "ljd"], [891, "临江仙", "4_2", "linjiangxian", "ljx"]]], 27 | "27": [["山东3区", "6_7", "37", "shandong3qu", 27, "sdsq"], [[33, "蓬莱岛", "1_1", "penglaidao", "pld"], [857, "壮气凌云", "2_1", "zhuangqilingyun", "zqly"], [867, "黄海明珠", "3_1", "huanghaimingzhu", "hhmz"]]], 28 | "28": [["山东4区", "6_8", "47", "shandong4qu", 28, "sdsq"], [[207, "大明湖", "1_1", "daminghu", "dmh"], [443, "沂水雪山", "2_1", "yishuixueshan", "ysxs"], [883, "琅琊书院", "3_1", "langyashuyuan", "lysy"], [897, "百家宗师", "4_1", "baijiazongshi", "bjzs"]]], 29 | "29": [["山东5区", "6_9", "54", "shandong5qu", 29, "sdwq"], [[34, "玉皇顶", "1_1", "yuhuangding", "yhd"], [407, "曲阜孔庙", "2_1", "qufukongmiao", "qfkm"], [657, "威海卫", "3_1", "weihaiwei", "whw"], [905, "太公岛", "4_1", "taigongdao", "tgd"]]], 30 | "30": [["山西区", "1_2", "19", "shanxiqu", 30, "sxq"], [[421, "雁门关", "1_1", "yanmenguan", "ymg"]]], 31 | "31": [["陕西区", "1_3", "12", "shanxiqu", 31, "sxq"], [[200, "大雁塔", "1_1", "dayanta", "dyt"], [203, "西岳华山", "2_1", "xiyuehuashan", "xyhs"]]], 32 | "32": [["上海2区", "5_4", "22", "shanghai2qu", 32, "sheq"], [[38, "东方明珠", "1_1", "dongfangmingzhu", "dfmz"], [622, "徐家汇", "2_1", "xujiahui", "xjh"], [855, "四海升平", "3_1", "sihaishengping", "shsp"], [855, "天下文枢", "4_1", "tianxiawenshu", "txws"]]], 33 | "33": [["深圳2区", "3_9", "52", "shenzhen2qu", 33, "szeq"], [[412, "梧桐山", "1_1", "wutongshan", "wts"], [344, "小梅沙", "2_1", "xiaomeisha", "xms"], [39, "世界之窗", "3_1", "shijiezhichuang", "sjzc"]]], 34 | "34": [["四川1区", "1_4", "23", "sichuan1qu", 34, "scyq"], [[263, "嘉陵江", "1_1", "jialingjiang", "jlj"], [40, "成都府", "2_1", "chengdufu", "cdf"]]], 35 | "35": [["浙江4区", "4_4", "50", "zhejiang4qu", 35, "zjsq"], [[377, "绍兴兰亭", "1_1", "shaoxinglanting", "sxlt"], [416, "绍兴鉴湖", "2_1", "shaoxingjianhu", "sxjh"], [750, "烟雨江南", "3_1", "yanyujiangnan", "yyjn"], [864, "琴心剑胆", "4_1", "qinxinjiandan", "qxjd"]]], 36 | "36": [["贵州区", "1_7", "57", "guizhouqu", 36, "gzq"], [[285, "红枫湖", "1_1", "hongfenghu", "hfh"]]], 37 | "37": [["深圳1区", "3_8", "21", "shenzhen1qu", 37, "szyq"], [[116, "大观园", "1_1", "daguanyuan", "dgy"]]], 38 | "38": [["时光", "7_6", "32", "shiguang", 38, "sg"], [[45, "花样年华", "1_1", "huayangnianhua", "hynh"]]], 39 | "39": [["华南区", "7_2", "6", "huananqu", 39, "hnq"], [[173, "逍遥城", "1_1", "xiaoyaocheng", "xyc"], [625, "钓鱼岛", "2_1", "diaoyudao", "dyd"], [173, "侠客岛", "3_1", "xiakedao", "xkd"]]], 40 | "40": [["内蒙区", "1_1", "17", "neimengqu", 40, "nmq"], [[229, "雄鹰岭", "1_1", "xiongyingling", "xyl"]]], 41 | "41": [["福建1区", "3_6", "18", "fujian1qu", 41, "fjyq"], [[305, "朱紫坊", "1_1", "zhuzifang", "zzf"], [305, "凌云殿", "2_1", "lingyundian", "lyd"]]], 42 | "42": [["安徽1区", "3_4", "24", "anhui1qu", 42, "ahyq"], [[417, "紫蓬山", "1_1", "zipengshan", "zps"], [266, "慈光阁", "2_1", "ciguangge", "cgg"]]], 43 | "43": [["广东2区", "4_6", "8", "guangdong2qu", 43, "gdeq"], [[79, "如意岛", "1_1", "ruyidao", "ryd"], [77, "进贤门", "2_1", "jinxianmen", "jxm"], [78, "万绿湖", "3_1", "wanluhu", "wlh"], [79, "七星岩", "4_1", "qixingyan", "qxy"]]], 44 | "44": [["云南区", "1_6", "29", "yunnanqu", 44, "ynq"], [[127, "彩云之南", "1_1", "caiyunzhinan", "cyzn"], [130, "蝴蝶泉", "2_1", "hudiequan", "hdq"]]], 45 | "45": [["追忆", "7_5", "2", "zhuiyi", 45, "zy"], [[149, "再续前缘", "1_1", "zaixuqianyuan", "zxqy"], [150, "梦回望月", "2_1", "menghuiwangyue", "mhwy"], [901, "2020", "3_1", "2020", "elel"]]], 46 | "47": [["广东1区", "4_5", "34", "guangdong1qu", 47, "gdyq"], [[72, "湖光岩", "1_1", "huguangyan", "hgy"], [904, "三水荷花", "2_1", "sanshuihehua", "sshh"]]], 47 | "48": [["河北2区", "2_2", "41", "hebei2qu", 48, "hbeq"], [[334, "燕塞湖", "1_1", "yansehu", "ysh"], [215, "燕赵风云", "2_1", "yanzhaofengyun", "yzfy"]]], 48 | "49": [["河南1区", "2_4", "11", "henan1qu", 49, "hnyq"], [[413, "少林寺", "1_1", "shaolinsi", "sls"], [197, "中岳嵩山", "2_1", "zhongyuesongshan", "zyss"], [199, "汴梁城", "3_1", "bianliangcheng", "blc"], [825, "龙图腾", "4_1", "longtuteng", "ltt"], [825, "武麒麟", "5_1", "wuqilin", "wql"], [825, "九州鼎", "6_1", "jiuzhouding", "jzd"], [825, "紫气东来", "7_1", "ziqidonglai", "zqdl"]]], 49 | "50": [["河南3区", "2_6", "58", "henan3qu", 50, "hnsq"], [[414, "南阳府", "1_1", "nanyangfu", "nyf"], [898, "逐鹿中原", "2_1", "zhuluzhongyuan", "zlzy"], [903, "老君山", "3_1", "laojunshan", "ljs"]]], 50 | "51": [["辽宁2区", "6_4", "46", "liaoning2qu", 51, "lneq"], [[367, "医巫闾山", "1_1", "yiwulvshan", "ywls"]]], 51 | "52": [["四川2区", "1_5", "5", "sichuan2qu", 52, "sceq"], [[167, "文殊院", "1_1", "wenshuyuan", "wsy"], [123, "德阳文庙", "2_1", "deyangwenmiao", "dywm"]]], 52 | "54": [["浙江1区", "4_1", "28", "zhejiang1qu", 54, "zjyq"], [[133, "台州湾", "1_1", "taizhouwan", "tzw"], [132, "西栅老街", "2_1", "xishanlaojie", "xslj"], [712, "文澜阁", "3_1", "wenlange", "wlg"], [816, "三吴都会", "4_1", "sanwuduhui", "swdh"], [856, "龙泉山", "5_1", "longquanshan", "lqs"], [875, "龙游四海", "6_1", "longyousihai", "lysh"], [889, "八阵图", "7_1", "bazhentu", "bzt"], [896, "九州同", "8_1", "jiuzhoutong", "jzt"]]], 53 | "55": [["浙江2区", "4_2", "10", "zhejiang2qu", 55, "zjeq"], [[137, "苏堤春晓", "1_1", "sudichunxiao", "sdcx"], [378, "灵隐寺", "2_1", "lingyinsi", "lys"], [661, "碧海潮生", "3_1", "bihaichaosheng", "bhcs"], [758, "西湖龙井", "4_1", "xihulongjing", "xhlj"], [864, "彩凤鸣岐", "5_1", "caifengmingqi", "cfmq"], [881, "忆江南", "6_1", "yijiangnan", "yjn"], [885, "安吉灵峰", "7_1", "anjilingfeng", "ajlf"]]], 54 | "56": [["重庆区", "5_5", "31", "chongqingqu", 56, "cqq"], [[146, "解放碑", "1_1", "jiefangbei", "jfb"], [482, "茶山竹海", "2_1", "chashanzhuhai", "cszh"], [877, "洪崖洞", "3_1", "hongyadong", "hyd"]]], 55 | "57": [["海外专区", "7_4", "30", "haiwaizhuanqu", 57, "hwzq"], [[173, "侠客岛", "1_1", "xiakedao", "xkd"]]], 56 | "58": [["无与伦比", "7_3", "61", "wuyulunbi", 58, "wylb"], [[554, "兰亭序", "1_1", "lantingxu", "ltx"], [558, "青花瓷", "2_1", "qinghuaci", "qhc"], [559, "本草纲目", "3_1", "bencaogangmu", "bcgm"], [558, "菊花台", "4_1", "juhuatai", "jht"], [579, "千里之外", "5_1", "qianlizhiwai", "qlzw"], [583, "龙拳", "6_1", "longquan", "lq"], [584, "将军", "7_1", "jiangjun", "jj"], [705, "龙马精神", "1_2", "longmajingshen", "lmjs"]]], 57 | "60": [["天下无双", "5_6", "67", "tianxiawushuang", 60, "txws"], [[723, "群星璀璨", "1_1", "qunxingcuican", "qxcc"], [730, "金戈铁马", "2_1", "jingetiema", "jgtm"], [785, "群雄逐鹿", "3_1", "qunxiongzhulu", "qxzl"], [805, "聚圣三界", "4_1", "jushengsanjie", "jssj"], [785, "梦回长安", "5_1", "menghuichangan", "mhca"], [785, "逍遥三界", "6_1", "xiaoyaosanjie", "xysj"], [791, "诗情画意", "7_1", "shiqinghuayi", "sqhy"], [795, "超凡入圣", "1_2", "chaofanrusheng", "cfrs"], [866, "纵横驰骋", "2_2", "zonghengchicheng", "zhcc"], [884, "风雅颂", "3_2", "fengyasong", "fys"], [894, "金榜题名", "4_2", "jinbangtiming", "jbtm"]]], 58 | "61": [["笑傲三界", "5_7", "70", "xiaoaosanjie", 61, "xasj"], [[807, "花好月圆", "1_1", "huahaoyueyuan", "hhyy"], [811, "华山论剑", "2_1", "huashanlunjian", "hslj"], [819, "上古神器", "3_1", "shanggushenqi", "sgsq"], [828, "群雄争霸", "4_1", "qunxiongzhengba", "qxzb"], [832, "纵横天下", "5_1", "zonghengtianxia", "zhtx"], [842, "腾云驾雾", "6_1", "tengyunjiawu", "tyjw"], [842, "皓月千里", "7_1", "haoyueqianli", "hyql"], [848, "龙吟九天", "1_2", "longyinjiutian", "lyjt"], [856, "绝代天骄", "2_2", "juedaitianjiao", "jdtj"], [862, "龙飞凤舞", "3_2", "longfeifengwu", "lffw"], [876, "锦绣河山", "4_2", "jinxiuheshan", "jxhs"], [828, "泱泱大风", "5_2", "yangyangdafeng", "yydf"], [887, "盛夏光年", "6_2", "shengxiaguangnian", "sxgn"], [856, "龙泉山", "7_2", "longquanshan", "lqs"]]], 59 | "62": [["名扬三界", "5_8", "71", "mingyangsanjie", 62, "mysj"], [[868, "文韬武略", "1_1", "wentaowulue", "wtwl"], [873, "日月同辉", "2_1", "riyuetonghui", "ryth"], [878, "洋光闪耀", "3_1", "yangguangshanyao", "ygsy"], [882, "国泰民安", "4_1", "guotaiminan", "gtma"], [886, "博览三界", "5_1", "bolansanjie", "blsj"], [888, "剑胆孤心", "6_1", "jiandanguxin", "jdgx"], [893, "叱咤风云", "7_1", "chizhafengyun", "czfy"], [895, "黄金时代", "8_1", "huangjinshidai", "hjsd"], [906, "大风起兮", "9_1", "dafengqixi", "dfqx"]]], 60 | "63": [["山河社稷", "5_9", "72", "shanhesheji", 63, "shsj"], [[892, "长安城", "1_1", "changancheng", "cac"], [902, "东海湾", "2_1", "donghaiwan", "dhw"]]] 61 | } 62 | --------------------------------------------------------------------------------