commit bf11186b8d4fa6f062f2e3a1408d5c8faef5a2a6 Author: lsy Date: Wed Apr 16 18:00:14 2025 +0800 完成boss直聘公司行业的筛选 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e4fbbcc --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +**/test +**/output +**/__pycache__ \ No newline at end of file diff --git a/assets/boss/site.json b/assets/boss/site.json new file mode 100644 index 0000000..2990d14 --- /dev/null +++ b/assets/boss/site.json @@ -0,0 +1,2493 @@ +{ + "siteList": [ + { + "code": 100010000, + "name": "全国", + "url": "/?city=100010000", + "subLevelModelList": [ + { + "code": 100010000, + "name": "全国", + "url": "/?city=100010000", + "subLevelModelList": null + } + ] + }, + { + "code": 101010000, + "name": "北京", + "url": "", + "subLevelModelList": [ + { + "code": 101010100, + "name": "北京", + "url": "/beijing/", + "subLevelModelList": null + } + ] + }, + { + "code": 101030000, + "name": "天津", + "url": "", + "subLevelModelList": [ + { + "code": 101030100, + "name": "天津", + "url": "/tianjin/", + "subLevelModelList": null + } + ] + }, + { + "code": 101090000, + "name": "河北", + "url": "", + "subLevelModelList": [ + { + "code": 101090100, + "name": "石家庄", + "url": "/shijiazhuang/", + "subLevelModelList": null + }, + { + "code": 101090500, + "name": "唐山", + "url": "/chengshi/c101090500/", + "subLevelModelList": null + }, + { + "code": 101091100, + "name": "秦皇岛", + "url": "/chengshi/c101091100/", + "subLevelModelList": null + }, + { + "code": 101091000, + "name": "邯郸", + "url": "/chengshi/c101091000/", + "subLevelModelList": null + }, + { + "code": 101090900, + "name": "邢台", + "url": "/chengshi/c101090900/", + "subLevelModelList": null + }, + { + "code": 101090200, + "name": "保定", + "url": "/baoding/", + "subLevelModelList": null + }, + { + "code": 101090300, + "name": "张家口", + "url": "/chengshi/c101090300/", + "subLevelModelList": null + }, + { + "code": 101090400, + "name": "承德", + "url": "/chengshi/c101090400/", + "subLevelModelList": null + }, + { + "code": 101090700, + "name": "沧州", + "url": "/chengshi/c101090700/", + "subLevelModelList": null + }, + { + "code": 101090600, + "name": "廊坊", + "url": "/chengshi/c101090600/", + "subLevelModelList": null + }, + { + "code": 101090800, + "name": "衡水", + "url": "/chengshi/c101090800/", + "subLevelModelList": null + } + ] + }, + { + "code": 101100000, + "name": "山西", + "url": "", + "subLevelModelList": [ + { + "code": 101100100, + "name": "太原", + "url": "/taiyuan/", + "subLevelModelList": null + }, + { + "code": 101100200, + "name": "大同", + "url": "/chengshi/c101100200/", + "subLevelModelList": null + }, + { + "code": 101100300, + "name": "阳泉", + "url": "/chengshi/c101100300/", + "subLevelModelList": null + }, + { + "code": 101100500, + "name": "长治", + "url": "/chengshi/c101100500/", + "subLevelModelList": null + }, + { + "code": 101100600, + "name": "晋城", + "url": "/chengshi/c101100600/", + "subLevelModelList": null + }, + { + "code": 101100900, + "name": "朔州", + "url": "/chengshi/c101100900/", + "subLevelModelList": null + }, + { + "code": 101100400, + "name": "晋中", + "url": "/chengshi/c101100400/", + "subLevelModelList": null + }, + { + "code": 101100800, + "name": "运城", + "url": "/chengshi/c101100800/", + "subLevelModelList": null + }, + { + "code": 101101000, + "name": "忻州", + "url": "/chengshi/c101101000/", + "subLevelModelList": null + }, + { + "code": 101100700, + "name": "临汾", + "url": "/chengshi/c101100700/", + "subLevelModelList": null + }, + { + "code": 101101100, + "name": "吕梁", + "url": "/chengshi/c101101100/", + "subLevelModelList": null + } + ] + }, + { + "code": 101080000, + "name": "内蒙古", + "url": "", + "subLevelModelList": [ + { + "code": 101080100, + "name": "呼和浩特", + "url": "/chengshi/c101080100/", + "subLevelModelList": null + }, + { + "code": 101080200, + "name": "包头", + "url": "/chengshi/c101080200/", + "subLevelModelList": null + }, + { + "code": 101080300, + "name": "乌海", + "url": "/chengshi/c101080300/", + "subLevelModelList": null + }, + { + "code": 101080500, + "name": "赤峰", + "url": "/chengshi/c101080500/", + "subLevelModelList": null + }, + { + "code": 101080400, + "name": "通辽", + "url": "/chengshi/c101080400/", + "subLevelModelList": null + }, + { + "code": 101080600, + "name": "鄂尔多斯", + "url": "/chengshi/c101080600/", + "subLevelModelList": null + }, + { + "code": 101080700, + "name": "呼伦贝尔", + "url": "/chengshi/c101080700/", + "subLevelModelList": null + }, + { + "code": 101080800, + "name": "巴彦淖尔", + "url": "/chengshi/c101080800/", + "subLevelModelList": null + }, + { + "code": 101080900, + "name": "乌兰察布", + "url": "/chengshi/c101080900/", + "subLevelModelList": null + }, + { + "code": 101081100, + "name": "兴安盟", + "url": "/chengshi/c101081100/", + "subLevelModelList": null + }, + { + "code": 101081000, + "name": "锡林郭勒盟", + "url": "/chengshi/c101081000/", + "subLevelModelList": null + }, + { + "code": 101081200, + "name": "阿拉善盟", + "url": "/chengshi/c101081200/", + "subLevelModelList": null + } + ] + }, + { + "code": 101070000, + "name": "辽宁", + "url": "", + "subLevelModelList": [ + { + "code": 101070100, + "name": "沈阳", + "url": "/shenyang/", + "subLevelModelList": null + }, + { + "code": 101070200, + "name": "大连", + "url": "/dalian/", + "subLevelModelList": null + }, + { + "code": 101070300, + "name": "鞍山", + "url": "/chengshi/c101070300/", + "subLevelModelList": null + }, + { + "code": 101070400, + "name": "抚顺", + "url": "/chengshi/c101070400/", + "subLevelModelList": null + }, + { + "code": 101070500, + "name": "本溪", + "url": "/chengshi/c101070500/", + "subLevelModelList": null + }, + { + "code": 101070600, + "name": "丹东", + "url": "/chengshi/c101070600/", + "subLevelModelList": null + }, + { + "code": 101070700, + "name": "锦州", + "url": "/chengshi/c101070700/", + "subLevelModelList": null + }, + { + "code": 101070800, + "name": "营口", + "url": "/chengshi/c101070800/", + "subLevelModelList": null + }, + { + "code": 101070900, + "name": "阜新", + "url": "/chengshi/c101070900/", + "subLevelModelList": null + }, + { + "code": 101071000, + "name": "辽阳", + "url": "/chengshi/c101071000/", + "subLevelModelList": null + }, + { + "code": 101071300, + "name": "盘锦", + "url": "/chengshi/c101071300/", + "subLevelModelList": null + }, + { + "code": 101071100, + "name": "铁岭", + "url": "/chengshi/c101071100/", + "subLevelModelList": null + }, + { + "code": 101071200, + "name": "朝阳", + "url": "/chengshi/c101071200/", + "subLevelModelList": null + }, + { + "code": 101071400, + "name": "葫芦岛", + "url": "/chengshi/c101071400/", + "subLevelModelList": null + } + ] + }, + { + "code": 101060000, + "name": "吉林", + "url": "", + "subLevelModelList": [ + { + "code": 101060100, + "name": "长春", + "url": "/changchun/", + "subLevelModelList": null + }, + { + "code": 101060200, + "name": "吉林", + "url": "/chengshi/c101060200/", + "subLevelModelList": null + }, + { + "code": 101060300, + "name": "四平", + "url": "/chengshi/c101060300/", + "subLevelModelList": null + }, + { + "code": 101060600, + "name": "辽源", + "url": "/chengshi/c101060600/", + "subLevelModelList": null + }, + { + "code": 101060400, + "name": "通化", + "url": "/chengshi/c101060400/", + "subLevelModelList": null + }, + { + "code": 101060800, + "name": "白山", + "url": "/chengshi/c101060800/", + "subLevelModelList": null + }, + { + "code": 101060700, + "name": "松原", + "url": "/chengshi/c101060700/", + "subLevelModelList": null + }, + { + "code": 101060500, + "name": "白城", + "url": "/chengshi/c101060500/", + "subLevelModelList": null + }, + { + "code": 101060900, + "name": "延边朝鲜族自治州", + "url": "/chengshi/c101060900/", + "subLevelModelList": null + } + ] + }, + { + "code": 101050000, + "name": "黑龙江", + "url": "", + "subLevelModelList": [ + { + "code": 101050100, + "name": "哈尔滨", + "url": "/haerbin/", + "subLevelModelList": null + }, + { + "code": 101050200, + "name": "齐齐哈尔", + "url": "/chengshi/c101050200/", + "subLevelModelList": null + }, + { + "code": 101051000, + "name": "鸡西", + "url": "/chengshi/c101051000/", + "subLevelModelList": null + }, + { + "code": 101051100, + "name": "鹤岗", + "url": "/chengshi/c101051100/", + "subLevelModelList": null + }, + { + "code": 101051200, + "name": "双鸭山", + "url": "/chengshi/c101051200/", + "subLevelModelList": null + }, + { + "code": 101050800, + "name": "大庆", + "url": "/chengshi/c101050800/", + "subLevelModelList": null + }, + { + "code": 101050700, + "name": "伊春", + "url": "/chengshi/c101050700/", + "subLevelModelList": null + }, + { + "code": 101050400, + "name": "佳木斯", + "url": "/chengshi/c101050400/", + "subLevelModelList": null + }, + { + "code": 101050900, + "name": "七台河", + "url": "/chengshi/c101050900/", + "subLevelModelList": null + }, + { + "code": 101050300, + "name": "牡丹江", + "url": "/chengshi/c101050300/", + "subLevelModelList": null + }, + { + "code": 101050600, + "name": "黑河", + "url": "/chengshi/c101050600/", + "subLevelModelList": null + }, + { + "code": 101050500, + "name": "绥化", + "url": "/chengshi/c101050500/", + "subLevelModelList": null + }, + { + "code": 101051300, + "name": "大兴安岭地区", + "url": "/chengshi/c101051300/", + "subLevelModelList": null + } + ] + }, + { + "code": 101020000, + "name": "上海", + "url": "", + "subLevelModelList": [ + { + "code": 101020100, + "name": "上海", + "url": "/shanghai/", + "subLevelModelList": null + } + ] + }, + { + "code": 101190000, + "name": "江苏", + "url": "", + "subLevelModelList": [ + { + "code": 101190100, + "name": "南京", + "url": "/nanjing/", + "subLevelModelList": null + }, + { + "code": 101190200, + "name": "无锡", + "url": "/wuxi/", + "subLevelModelList": null + }, + { + "code": 101190800, + "name": "徐州", + "url": "/xuzhou/", + "subLevelModelList": null + }, + { + "code": 101190400, + "name": "苏州", + "url": "/suzhou/", + "subLevelModelList": null + }, + { + "code": 101191100, + "name": "常州", + "url": "/changzhou/", + "subLevelModelList": null + }, + { + "code": 101190500, + "name": "南通", + "url": "/nantong/", + "subLevelModelList": null + }, + { + "code": 101191000, + "name": "连云港", + "url": "/chengshi/c101191000/", + "subLevelModelList": null + }, + { + "code": 101190900, + "name": "淮安", + "url": "/chengshi/c101190900/", + "subLevelModelList": null + }, + { + "code": 101190700, + "name": "盐城", + "url": "/chengshi/c101190700/", + "subLevelModelList": null + }, + { + "code": 101190600, + "name": "扬州", + "url": "/chengshi/c101190600/", + "subLevelModelList": null + }, + { + "code": 101190300, + "name": "镇江", + "url": "/chengshi/c101190300/", + "subLevelModelList": null + }, + { + "code": 101191200, + "name": "泰州", + "url": "/chengshi/c101191200/", + "subLevelModelList": null + }, + { + "code": 101191300, + "name": "宿迁", + "url": "/chengshi/c101191300/", + "subLevelModelList": null + } + ] + }, + { + "code": 101210000, + "name": "浙江", + "url": "", + "subLevelModelList": [ + { + "code": 101210100, + "name": "杭州", + "url": "/hangzhou/", + "subLevelModelList": null + }, + { + "code": 101210400, + "name": "宁波", + "url": "/ningbo/", + "subLevelModelList": null + }, + { + "code": 101210700, + "name": "温州", + "url": "/wenzhou/", + "subLevelModelList": null + }, + { + "code": 101210300, + "name": "嘉兴", + "url": "/jiaxing/", + "subLevelModelList": null + }, + { + "code": 101210200, + "name": "湖州", + "url": "/chengshi/c101210200/", + "subLevelModelList": null + }, + { + "code": 101210500, + "name": "绍兴", + "url": "/chengshi/c101210500/", + "subLevelModelList": null + }, + { + "code": 101210900, + "name": "金华", + "url": "/jinhua/", + "subLevelModelList": null + }, + { + "code": 101211000, + "name": "衢州", + "url": "/chengshi/c101211000/", + "subLevelModelList": null + }, + { + "code": 101211100, + "name": "舟山", + "url": "/chengshi/c101211100/", + "subLevelModelList": null + }, + { + "code": 101210600, + "name": "台州", + "url": "/chengshi/c101210600/", + "subLevelModelList": null + }, + { + "code": 101210800, + "name": "丽水", + "url": "/chengshi/c101210800/", + "subLevelModelList": null + } + ] + }, + { + "code": 101220000, + "name": "安徽", + "url": "", + "subLevelModelList": [ + { + "code": 101220100, + "name": "合肥", + "url": "/hefei/", + "subLevelModelList": null + }, + { + "code": 101220300, + "name": "芜湖", + "url": "/chengshi/c101220300/", + "subLevelModelList": null + }, + { + "code": 101220200, + "name": "蚌埠", + "url": "/chengshi/c101220200/", + "subLevelModelList": null + }, + { + "code": 101220400, + "name": "淮南", + "url": "/chengshi/c101220400/", + "subLevelModelList": null + }, + { + "code": 101220500, + "name": "马鞍山", + "url": "/chengshi/c101220500/", + "subLevelModelList": null + }, + { + "code": 101221100, + "name": "淮北", + "url": "/chengshi/c101221100/", + "subLevelModelList": null + }, + { + "code": 101221200, + "name": "铜陵", + "url": "/chengshi/c101221200/", + "subLevelModelList": null + }, + { + "code": 101220600, + "name": "安庆", + "url": "/chengshi/c101220600/", + "subLevelModelList": null + }, + { + "code": 101221600, + "name": "黄山", + "url": "/chengshi/c101221600/", + "subLevelModelList": null + }, + { + "code": 101221000, + "name": "滁州", + "url": "/chengshi/c101221000/", + "subLevelModelList": null + }, + { + "code": 101220800, + "name": "阜阳", + "url": "/chengshi/c101220800/", + "subLevelModelList": null + }, + { + "code": 101220700, + "name": "宿州", + "url": "/chengshi/c101220700/", + "subLevelModelList": null + }, + { + "code": 101221400, + "name": "六安", + "url": "/chengshi/c101221400/", + "subLevelModelList": null + }, + { + "code": 101220900, + "name": "亳州", + "url": "/chengshi/c101220900/", + "subLevelModelList": null + }, + { + "code": 101221500, + "name": "池州", + "url": "/chengshi/c101221500/", + "subLevelModelList": null + }, + { + "code": 101221300, + "name": "宣城", + "url": "/chengshi/c101221300/", + "subLevelModelList": null + } + ] + }, + { + "code": 101230000, + "name": "福建", + "url": "", + "subLevelModelList": [ + { + "code": 101230100, + "name": "福州", + "url": "/fuzhou/", + "subLevelModelList": null + }, + { + "code": 101230200, + "name": "厦门", + "url": "/xiamen/", + "subLevelModelList": null + }, + { + "code": 101230400, + "name": "莆田", + "url": "/chengshi/c101230400/", + "subLevelModelList": null + }, + { + "code": 101230800, + "name": "三明", + "url": "/chengshi/c101230800/", + "subLevelModelList": null + }, + { + "code": 101230500, + "name": "泉州", + "url": "/quanzhou/", + "subLevelModelList": null + }, + { + "code": 101230600, + "name": "漳州", + "url": "/chengshi/c101230600/", + "subLevelModelList": null + }, + { + "code": 101230900, + "name": "南平", + "url": "/chengshi/c101230900/", + "subLevelModelList": null + }, + { + "code": 101230700, + "name": "龙岩", + "url": "/chengshi/c101230700/", + "subLevelModelList": null + }, + { + "code": 101230300, + "name": "宁德", + "url": "/chengshi/c101230300/", + "subLevelModelList": null + } + ] + }, + { + "code": 101240000, + "name": "江西", + "url": "", + "subLevelModelList": [ + { + "code": 101240100, + "name": "南昌", + "url": "/nanchang/", + "subLevelModelList": null + }, + { + "code": 101240800, + "name": "景德镇", + "url": "/chengshi/c101240800/", + "subLevelModelList": null + }, + { + "code": 101240900, + "name": "萍乡", + "url": "/chengshi/c101240900/", + "subLevelModelList": null + }, + { + "code": 101240200, + "name": "九江", + "url": "/chengshi/c101240200/", + "subLevelModelList": null + }, + { + "code": 101241000, + "name": "新余", + "url": "/chengshi/c101241000/", + "subLevelModelList": null + }, + { + "code": 101241100, + "name": "鹰潭", + "url": "/chengshi/c101241100/", + "subLevelModelList": null + }, + { + "code": 101240700, + "name": "赣州", + "url": "/chengshi/c101240700/", + "subLevelModelList": null + }, + { + "code": 101240600, + "name": "吉安", + "url": "/chengshi/c101240600/", + "subLevelModelList": null + }, + { + "code": 101240500, + "name": "宜春", + "url": "/chengshi/c101240500/", + "subLevelModelList": null + }, + { + "code": 101240400, + "name": "抚州", + "url": "/chengshi/c101240400/", + "subLevelModelList": null + }, + { + "code": 101240300, + "name": "上饶", + "url": "/chengshi/c101240300/", + "subLevelModelList": null + } + ] + }, + { + "code": 101120000, + "name": "山东", + "url": "", + "subLevelModelList": [ + { + "code": 101120100, + "name": "济南", + "url": "/jinan/", + "subLevelModelList": null + }, + { + "code": 101120200, + "name": "青岛", + "url": "/qingdao/", + "subLevelModelList": null + }, + { + "code": 101120300, + "name": "淄博", + "url": "/chengshi/c101120300/", + "subLevelModelList": null + }, + { + "code": 101121400, + "name": "枣庄", + "url": "/chengshi/c101121400/", + "subLevelModelList": null + }, + { + "code": 101121200, + "name": "东营", + "url": "/chengshi/c101121200/", + "subLevelModelList": null + }, + { + "code": 101120500, + "name": "烟台", + "url": "/yantai/", + "subLevelModelList": null + }, + { + "code": 101120600, + "name": "潍坊", + "url": "/weifang/", + "subLevelModelList": null + }, + { + "code": 101120700, + "name": "济宁", + "url": "/chengshi/c101120700/", + "subLevelModelList": null + }, + { + "code": 101120800, + "name": "泰安", + "url": "/chengshi/c101120800/", + "subLevelModelList": null + }, + { + "code": 101121300, + "name": "威海", + "url": "/chengshi/c101121300/", + "subLevelModelList": null + }, + { + "code": 101121500, + "name": "日照", + "url": "/chengshi/c101121500/", + "subLevelModelList": null + }, + { + "code": 101120900, + "name": "临沂", + "url": "/chengshi/c101120900/", + "subLevelModelList": null + }, + { + "code": 101120400, + "name": "德州", + "url": "/chengshi/c101120400/", + "subLevelModelList": null + }, + { + "code": 101121700, + "name": "聊城", + "url": "/chengshi/c101121700/", + "subLevelModelList": null + }, + { + "code": 101121100, + "name": "滨州", + "url": "/chengshi/c101121100/", + "subLevelModelList": null + }, + { + "code": 101121000, + "name": "菏泽", + "url": "/chengshi/c101121000/", + "subLevelModelList": null + } + ] + }, + { + "code": 101180000, + "name": "河南", + "url": "", + "subLevelModelList": [ + { + "code": 101180100, + "name": "郑州", + "url": "/zhengzhou/", + "subLevelModelList": null + }, + { + "code": 101180800, + "name": "开封", + "url": "/chengshi/c101180800/", + "subLevelModelList": null + }, + { + "code": 101180900, + "name": "洛阳", + "url": "/chengshi/c101180900/", + "subLevelModelList": null + }, + { + "code": 101180500, + "name": "平顶山", + "url": "/chengshi/c101180500/", + "subLevelModelList": null + }, + { + "code": 101180200, + "name": "安阳", + "url": "/chengshi/c101180200/", + "subLevelModelList": null + }, + { + "code": 101181200, + "name": "鹤壁", + "url": "/chengshi/c101181200/", + "subLevelModelList": null + }, + { + "code": 101180300, + "name": "新乡", + "url": "/chengshi/c101180300/", + "subLevelModelList": null + }, + { + "code": 101181100, + "name": "焦作", + "url": "/chengshi/c101181100/", + "subLevelModelList": null + }, + { + "code": 101181300, + "name": "濮阳", + "url": "/chengshi/c101181300/", + "subLevelModelList": null + }, + { + "code": 101180400, + "name": "许昌", + "url": "/chengshi/c101180400/", + "subLevelModelList": null + }, + { + "code": 101181500, + "name": "漯河", + "url": "/chengshi/c101181500/", + "subLevelModelList": null + }, + { + "code": 101181700, + "name": "三门峡", + "url": "/chengshi/c101181700/", + "subLevelModelList": null + }, + { + "code": 101180700, + "name": "南阳", + "url": "/chengshi/c101180700/", + "subLevelModelList": null + }, + { + "code": 101181000, + "name": "商丘", + "url": "/chengshi/c101181000/", + "subLevelModelList": null + }, + { + "code": 101180600, + "name": "信阳", + "url": "/chengshi/c101180600/", + "subLevelModelList": null + }, + { + "code": 101181400, + "name": "周口", + "url": "/chengshi/c101181400/", + "subLevelModelList": null + }, + { + "code": 101181600, + "name": "驻马店", + "url": "/chengshi/c101181600/", + "subLevelModelList": null + }, + { + "code": 101181800, + "name": "济源", + "url": "/chengshi/c101181800/", + "subLevelModelList": null + } + ] + }, + { + "code": 101200000, + "name": "湖北", + "url": "", + "subLevelModelList": [ + { + "code": 101200100, + "name": "武汉", + "url": "/wuhan/", + "subLevelModelList": null + }, + { + "code": 101200600, + "name": "黄石", + "url": "/chengshi/c101200600/", + "subLevelModelList": null + }, + { + "code": 101201000, + "name": "十堰", + "url": "/chengshi/c101201000/", + "subLevelModelList": null + }, + { + "code": 101200900, + "name": "宜昌", + "url": "/chengshi/c101200900/", + "subLevelModelList": null + }, + { + "code": 101200200, + "name": "襄阳", + "url": "/chengshi/c101200200/", + "subLevelModelList": null + }, + { + "code": 101200300, + "name": "鄂州", + "url": "/chengshi/c101200300/", + "subLevelModelList": null + }, + { + "code": 101201200, + "name": "荆门", + "url": "/chengshi/c101201200/", + "subLevelModelList": null + }, + { + "code": 101200400, + "name": "孝感", + "url": "/chengshi/c101200400/", + "subLevelModelList": null + }, + { + "code": 101200800, + "name": "荆州", + "url": "/chengshi/c101200800/", + "subLevelModelList": null + }, + { + "code": 101200500, + "name": "黄冈", + "url": "/chengshi/c101200500/", + "subLevelModelList": null + }, + { + "code": 101200700, + "name": "咸宁", + "url": "/chengshi/c101200700/", + "subLevelModelList": null + }, + { + "code": 101201100, + "name": "随州", + "url": "/chengshi/c101201100/", + "subLevelModelList": null + }, + { + "code": 101201300, + "name": "恩施土家族苗族自治州", + "url": "/chengshi/c101201300/", + "subLevelModelList": null + }, + { + "code": 101201500, + "name": "潜江", + "url": "/chengshi/c101201500/", + "subLevelModelList": null + }, + { + "code": 101201700, + "name": "神农架", + "url": "/chengshi/c101201700/", + "subLevelModelList": null + }, + { + "code": 101201600, + "name": "天门", + "url": "/chengshi/c101201600/", + "subLevelModelList": null + }, + { + "code": 101201400, + "name": "仙桃", + "url": "/chengshi/c101201400/", + "subLevelModelList": null + } + ] + }, + { + "code": 101250000, + "name": "湖南", + "url": "", + "subLevelModelList": [ + { + "code": 101250100, + "name": "长沙", + "url": "/changsha/", + "subLevelModelList": null + }, + { + "code": 101250300, + "name": "株洲", + "url": "/chengshi/c101250300/", + "subLevelModelList": null + }, + { + "code": 101250200, + "name": "湘潭", + "url": "/chengshi/c101250200/", + "subLevelModelList": null + }, + { + "code": 101250400, + "name": "衡阳", + "url": "/chengshi/c101250400/", + "subLevelModelList": null + }, + { + "code": 101250900, + "name": "邵阳", + "url": "/chengshi/c101250900/", + "subLevelModelList": null + }, + { + "code": 101251000, + "name": "岳阳", + "url": "/chengshi/c101251000/", + "subLevelModelList": null + }, + { + "code": 101250600, + "name": "常德", + "url": "/chengshi/c101250600/", + "subLevelModelList": null + }, + { + "code": 101251100, + "name": "张家界", + "url": "/chengshi/c101251100/", + "subLevelModelList": null + }, + { + "code": 101250700, + "name": "益阳", + "url": "/chengshi/c101250700/", + "subLevelModelList": null + }, + { + "code": 101250500, + "name": "郴州", + "url": "/chengshi/c101250500/", + "subLevelModelList": null + }, + { + "code": 101251300, + "name": "永州", + "url": "/chengshi/c101251300/", + "subLevelModelList": null + }, + { + "code": 101251200, + "name": "怀化", + "url": "/chengshi/c101251200/", + "subLevelModelList": null + }, + { + "code": 101250800, + "name": "娄底", + "url": "/chengshi/c101250800/", + "subLevelModelList": null + }, + { + "code": 101251400, + "name": "湘西土家族苗族自治州", + "url": "/chengshi/c101251400/", + "subLevelModelList": null + } + ] + }, + { + "code": 101280000, + "name": "广东", + "url": "", + "subLevelModelList": [ + { + "code": 101280100, + "name": "广州", + "url": "/guangzhou/", + "subLevelModelList": null + }, + { + "code": 101280200, + "name": "韶关", + "url": "/chengshi/c101280200/", + "subLevelModelList": null + }, + { + "code": 101280600, + "name": "深圳", + "url": "/shenzhen/", + "subLevelModelList": null + }, + { + "code": 101280700, + "name": "珠海", + "url": "/zhuhai/", + "subLevelModelList": null + }, + { + "code": 101280500, + "name": "汕头", + "url": "/shantou/", + "subLevelModelList": null + }, + { + "code": 101280800, + "name": "佛山", + "url": "/foshan/", + "subLevelModelList": null + }, + { + "code": 101281100, + "name": "江门", + "url": "/jiangmen/", + "subLevelModelList": null + }, + { + "code": 101281000, + "name": "湛江", + "url": "/chengshi/c101281000/", + "subLevelModelList": null + }, + { + "code": 101282000, + "name": "茂名", + "url": "/chengshi/c101282000/", + "subLevelModelList": null + }, + { + "code": 101280900, + "name": "肇庆", + "url": "/chengshi/c101280900/", + "subLevelModelList": null + }, + { + "code": 101280300, + "name": "惠州", + "url": "/huizhou/", + "subLevelModelList": null + }, + { + "code": 101280400, + "name": "梅州", + "url": "/chengshi/c101280400/", + "subLevelModelList": null + }, + { + "code": 101282100, + "name": "汕尾", + "url": "/chengshi/c101282100/", + "subLevelModelList": null + }, + { + "code": 101281200, + "name": "河源", + "url": "/chengshi/c101281200/", + "subLevelModelList": null + }, + { + "code": 101281800, + "name": "阳江", + "url": "/chengshi/c101281800/", + "subLevelModelList": null + }, + { + "code": 101281300, + "name": "清远", + "url": "/chengshi/c101281300/", + "subLevelModelList": null + }, + { + "code": 101281600, + "name": "东莞", + "url": "/dongguan/", + "subLevelModelList": null + }, + { + "code": 101281700, + "name": "中山", + "url": "/zhongshan/", + "subLevelModelList": null + }, + { + "code": 101281500, + "name": "潮州", + "url": "/chengshi/c101281500/", + "subLevelModelList": null + }, + { + "code": 101281900, + "name": "揭阳", + "url": "/chengshi/c101281900/", + "subLevelModelList": null + }, + { + "code": 101281400, + "name": "云浮", + "url": "/chengshi/c101281400/", + "subLevelModelList": null + }, + { + "code": 101282200, + "name": "东沙群岛", + "url": "/chengshi/c101282200/", + "subLevelModelList": null + } + ] + }, + { + "code": 101300000, + "name": "广西", + "url": "", + "subLevelModelList": [ + { + "code": 101300100, + "name": "南宁", + "url": "/nanning/", + "subLevelModelList": null + }, + { + "code": 101300300, + "name": "柳州", + "url": "/chengshi/c101300300/", + "subLevelModelList": null + }, + { + "code": 101300500, + "name": "桂林", + "url": "/chengshi/c101300500/", + "subLevelModelList": null + }, + { + "code": 101300600, + "name": "梧州", + "url": "/chengshi/c101300600/", + "subLevelModelList": null + }, + { + "code": 101301300, + "name": "北海", + "url": "/chengshi/c101301300/", + "subLevelModelList": null + }, + { + "code": 101301400, + "name": "防城港", + "url": "/chengshi/c101301400/", + "subLevelModelList": null + }, + { + "code": 101301100, + "name": "钦州", + "url": "/chengshi/c101301100/", + "subLevelModelList": null + }, + { + "code": 101300800, + "name": "贵港", + "url": "/chengshi/c101300800/", + "subLevelModelList": null + }, + { + "code": 101300900, + "name": "玉林", + "url": "/chengshi/c101300900/", + "subLevelModelList": null + }, + { + "code": 101301000, + "name": "百色", + "url": "/chengshi/c101301000/", + "subLevelModelList": null + }, + { + "code": 101300700, + "name": "贺州", + "url": "/chengshi/c101300700/", + "subLevelModelList": null + }, + { + "code": 101301200, + "name": "河池", + "url": "/chengshi/c101301200/", + "subLevelModelList": null + }, + { + "code": 101300400, + "name": "来宾", + "url": "/chengshi/c101300400/", + "subLevelModelList": null + }, + { + "code": 101300200, + "name": "崇左", + "url": "/chengshi/c101300200/", + "subLevelModelList": null + } + ] + }, + { + "code": 101310000, + "name": "海南", + "url": "", + "subLevelModelList": [ + { + "code": 101311400, + "name": "白沙黎族自治县", + "url": "/chengshi/c101311400/", + "subLevelModelList": null + }, + { + "code": 101311800, + "name": "保亭黎族苗族自治县", + "url": "/chengshi/c101311800/", + "subLevelModelList": null + }, + { + "code": 101311500, + "name": "昌江黎族自治县", + "url": "/chengshi/c101311500/", + "subLevelModelList": null + }, + { + "code": 101311200, + "name": "澄迈", + "url": "/chengshi/c101311200/", + "subLevelModelList": null + }, + { + "code": 101310100, + "name": "海口", + "url": "/haikou/", + "subLevelModelList": null + }, + { + "code": 101310200, + "name": "三亚", + "url": "/chengshi/c101310200/", + "subLevelModelList": null + }, + { + "code": 101310300, + "name": "三沙", + "url": "/chengshi/c101310300/", + "subLevelModelList": null + }, + { + "code": 101310400, + "name": "儋州", + "url": "/chengshi/c101310400/", + "subLevelModelList": null + }, + { + "code": 101311000, + "name": "定安", + "url": "/chengshi/c101311000/", + "subLevelModelList": null + }, + { + "code": 101310900, + "name": "东方", + "url": "/chengshi/c101310900/", + "subLevelModelList": null + }, + { + "code": 101311600, + "name": "乐东黎族自治县", + "url": "/chengshi/c101311600/", + "subLevelModelList": null + }, + { + "code": 101311300, + "name": "临高", + "url": "/chengshi/c101311300/", + "subLevelModelList": null + }, + { + "code": 101311700, + "name": "陵水黎族自治县", + "url": "/chengshi/c101311700/", + "subLevelModelList": null + }, + { + "code": 101310600, + "name": "琼海", + "url": "/chengshi/c101310600/", + "subLevelModelList": null + }, + { + "code": 101311900, + "name": "琼中黎族苗族自治县", + "url": "/chengshi/c101311900/", + "subLevelModelList": null + }, + { + "code": 101311100, + "name": "屯昌", + "url": "/chengshi/c101311100/", + "subLevelModelList": null + }, + { + "code": 101310800, + "name": "万宁", + "url": "/chengshi/c101310800/", + "subLevelModelList": null + }, + { + "code": 101310700, + "name": "文昌", + "url": "/chengshi/c101310700/", + "subLevelModelList": null + }, + { + "code": 101310500, + "name": "五指山", + "url": "/chengshi/c101310500/", + "subLevelModelList": null + } + ] + }, + { + "code": 101040000, + "name": "重庆", + "url": "", + "subLevelModelList": [ + { + "code": 101040100, + "name": "重庆", + "url": "/chongqing/", + "subLevelModelList": null + } + ] + }, + { + "code": 101270000, + "name": "四川", + "url": "", + "subLevelModelList": [ + { + "code": 101270100, + "name": "成都", + "url": "/chengdu/", + "subLevelModelList": null + }, + { + "code": 101270300, + "name": "自贡", + "url": "/chengshi/c101270300/", + "subLevelModelList": null + }, + { + "code": 101270200, + "name": "攀枝花", + "url": "/chengshi/c101270200/", + "subLevelModelList": null + }, + { + "code": 101271000, + "name": "泸州", + "url": "/chengshi/c101271000/", + "subLevelModelList": null + }, + { + "code": 101271700, + "name": "德阳", + "url": "/chengshi/c101271700/", + "subLevelModelList": null + }, + { + "code": 101270400, + "name": "绵阳", + "url": "/chengshi/c101270400/", + "subLevelModelList": null + }, + { + "code": 101271800, + "name": "广元", + "url": "/chengshi/c101271800/", + "subLevelModelList": null + }, + { + "code": 101270700, + "name": "遂宁", + "url": "/chengshi/c101270700/", + "subLevelModelList": null + }, + { + "code": 101271200, + "name": "内江", + "url": "/chengshi/c101271200/", + "subLevelModelList": null + }, + { + "code": 101271400, + "name": "乐山", + "url": "/chengshi/c101271400/", + "subLevelModelList": null + }, + { + "code": 101270500, + "name": "南充", + "url": "/chengshi/c101270500/", + "subLevelModelList": null + }, + { + "code": 101271500, + "name": "眉山", + "url": "/chengshi/c101271500/", + "subLevelModelList": null + }, + { + "code": 101271100, + "name": "宜宾", + "url": "/chengshi/c101271100/", + "subLevelModelList": null + }, + { + "code": 101270800, + "name": "广安", + "url": "/chengshi/c101270800/", + "subLevelModelList": null + }, + { + "code": 101270600, + "name": "达州", + "url": "/chengshi/c101270600/", + "subLevelModelList": null + }, + { + "code": 101271600, + "name": "雅安", + "url": "/chengshi/c101271600/", + "subLevelModelList": null + }, + { + "code": 101270900, + "name": "巴中", + "url": "/chengshi/c101270900/", + "subLevelModelList": null + }, + { + "code": 101271300, + "name": "资阳", + "url": "/chengshi/c101271300/", + "subLevelModelList": null + }, + { + "code": 101271900, + "name": "阿坝藏族羌族自治州", + "url": "/chengshi/c101271900/", + "subLevelModelList": null + }, + { + "code": 101272100, + "name": "甘孜藏族自治州", + "url": "/chengshi/c101272100/", + "subLevelModelList": null + }, + { + "code": 101272000, + "name": "凉山彝族自治州", + "url": "/chengshi/c101272000/", + "subLevelModelList": null + } + ] + }, + { + "code": 101260000, + "name": "贵州", + "url": "", + "subLevelModelList": [ + { + "code": 101260100, + "name": "贵阳", + "url": "/guiyang/", + "subLevelModelList": null + }, + { + "code": 101260600, + "name": "六盘水", + "url": "/chengshi/c101260600/", + "subLevelModelList": null + }, + { + "code": 101260200, + "name": "遵义", + "url": "/chengshi/c101260200/", + "subLevelModelList": null + }, + { + "code": 101260300, + "name": "安顺", + "url": "/chengshi/c101260300/", + "subLevelModelList": null + }, + { + "code": 101260500, + "name": "毕节", + "url": "/chengshi/c101260500/", + "subLevelModelList": null + }, + { + "code": 101260400, + "name": "铜仁", + "url": "/chengshi/c101260400/", + "subLevelModelList": null + }, + { + "code": 101260900, + "name": "黔西南布依族苗族自治州", + "url": "/chengshi/c101260900/", + "subLevelModelList": null + }, + { + "code": 101260700, + "name": "黔东南苗族侗族自治州", + "url": "/chengshi/c101260700/", + "subLevelModelList": null + }, + { + "code": 101260800, + "name": "黔南布依族苗族自治州", + "url": "/chengshi/c101260800/", + "subLevelModelList": null + } + ] + }, + { + "code": 101290000, + "name": "云南", + "url": "", + "subLevelModelList": [ + { + "code": 101290100, + "name": "昆明", + "url": "/kunming/", + "subLevelModelList": null + }, + { + "code": 101290200, + "name": "曲靖", + "url": "/chengshi/c101290200/", + "subLevelModelList": null + }, + { + "code": 101290400, + "name": "玉溪", + "url": "/chengshi/c101290400/", + "subLevelModelList": null + }, + { + "code": 101290300, + "name": "保山", + "url": "/chengshi/c101290300/", + "subLevelModelList": null + }, + { + "code": 101290700, + "name": "昭通", + "url": "/chengshi/c101290700/", + "subLevelModelList": null + }, + { + "code": 101290900, + "name": "丽江", + "url": "/chengshi/c101290900/", + "subLevelModelList": null + }, + { + "code": 101290500, + "name": "普洱", + "url": "/chengshi/c101290500/", + "subLevelModelList": null + }, + { + "code": 101290800, + "name": "临沧", + "url": "/chengshi/c101290800/", + "subLevelModelList": null + }, + { + "code": 101291700, + "name": "楚雄彝族自治州", + "url": "/chengshi/c101291700/", + "subLevelModelList": null + }, + { + "code": 101291200, + "name": "红河哈尼族彝族自治州", + "url": "/chengshi/c101291200/", + "subLevelModelList": null + }, + { + "code": 101291100, + "name": "文山壮族苗族自治州", + "url": "/chengshi/c101291100/", + "subLevelModelList": null + }, + { + "code": 101291000, + "name": "西双版纳傣族自治州", + "url": "/chengshi/c101291000/", + "subLevelModelList": null + }, + { + "code": 101291600, + "name": "大理白族自治州", + "url": "/chengshi/c101291600/", + "subLevelModelList": null + }, + { + "code": 101291300, + "name": "德宏傣族景颇族自治州", + "url": "/chengshi/c101291300/", + "subLevelModelList": null + }, + { + "code": 101291400, + "name": "怒江傈僳族自治州", + "url": "/chengshi/c101291400/", + "subLevelModelList": null + }, + { + "code": 101291500, + "name": "迪庆藏族自治州", + "url": "/chengshi/c101291500/", + "subLevelModelList": null + } + ] + }, + { + "code": 101140000, + "name": "西藏", + "url": "", + "subLevelModelList": [ + { + "code": 101140100, + "name": "拉萨", + "url": "/chengshi/c101140100/", + "subLevelModelList": null + }, + { + "code": 101140200, + "name": "日喀则", + "url": "/chengshi/c101140200/", + "subLevelModelList": null + }, + { + "code": 101140300, + "name": "昌都", + "url": "/chengshi/c101140300/", + "subLevelModelList": null + }, + { + "code": 101140400, + "name": "林芝", + "url": "/chengshi/c101140400/", + "subLevelModelList": null + }, + { + "code": 101140500, + "name": "山南", + "url": "/chengshi/c101140500/", + "subLevelModelList": null + }, + { + "code": 101140600, + "name": "那曲", + "url": "/chengshi/c101140600/", + "subLevelModelList": null + }, + { + "code": 101140700, + "name": "阿里地区", + "url": "/chengshi/c101140700/", + "subLevelModelList": null + } + ] + }, + { + "code": 101110000, + "name": "陕西", + "url": "", + "subLevelModelList": [ + { + "code": 101110100, + "name": "西安", + "url": "/xian/", + "subLevelModelList": null + }, + { + "code": 101111000, + "name": "铜川", + "url": "/chengshi/c101111000/", + "subLevelModelList": null + }, + { + "code": 101110900, + "name": "宝鸡", + "url": "/chengshi/c101110900/", + "subLevelModelList": null + }, + { + "code": 101110200, + "name": "咸阳", + "url": "/chengshi/c101110200/", + "subLevelModelList": null + }, + { + "code": 101110500, + "name": "渭南", + "url": "/chengshi/c101110500/", + "subLevelModelList": null + }, + { + "code": 101110300, + "name": "延安", + "url": "/chengshi/c101110300/", + "subLevelModelList": null + }, + { + "code": 101110800, + "name": "汉中", + "url": "/chengshi/c101110800/", + "subLevelModelList": null + }, + { + "code": 101110400, + "name": "榆林", + "url": "/chengshi/c101110400/", + "subLevelModelList": null + }, + { + "code": 101110700, + "name": "安康", + "url": "/chengshi/c101110700/", + "subLevelModelList": null + }, + { + "code": 101110600, + "name": "商洛", + "url": "/chengshi/c101110600/", + "subLevelModelList": null + } + ] + }, + { + "code": 101160000, + "name": "甘肃", + "url": "", + "subLevelModelList": [ + { + "code": 101160100, + "name": "兰州", + "url": "/chengshi/c101160100/", + "subLevelModelList": null + }, + { + "code": 101161200, + "name": "嘉峪关", + "url": "/chengshi/c101161200/", + "subLevelModelList": null + }, + { + "code": 101160600, + "name": "金昌", + "url": "/chengshi/c101160600/", + "subLevelModelList": null + }, + { + "code": 101161000, + "name": "白银", + "url": "/chengshi/c101161000/", + "subLevelModelList": null + }, + { + "code": 101160900, + "name": "天水", + "url": "/chengshi/c101160900/", + "subLevelModelList": null + }, + { + "code": 101160500, + "name": "武威", + "url": "/chengshi/c101160500/", + "subLevelModelList": null + }, + { + "code": 101160700, + "name": "张掖", + "url": "/chengshi/c101160700/", + "subLevelModelList": null + }, + { + "code": 101160300, + "name": "平凉", + "url": "/chengshi/c101160300/", + "subLevelModelList": null + }, + { + "code": 101160800, + "name": "酒泉", + "url": "/chengshi/c101160800/", + "subLevelModelList": null + }, + { + "code": 101160400, + "name": "庆阳", + "url": "/chengshi/c101160400/", + "subLevelModelList": null + }, + { + "code": 101160200, + "name": "定西", + "url": "/chengshi/c101160200/", + "subLevelModelList": null + }, + { + "code": 101161100, + "name": "陇南", + "url": "/chengshi/c101161100/", + "subLevelModelList": null + }, + { + "code": 101161300, + "name": "临夏回族自治州", + "url": "/chengshi/c101161300/", + "subLevelModelList": null + }, + { + "code": 101161400, + "name": "甘南藏族自治州", + "url": "/chengshi/c101161400/", + "subLevelModelList": null + } + ] + }, + { + "code": 101150000, + "name": "青海", + "url": "", + "subLevelModelList": [ + { + "code": 101150100, + "name": "西宁", + "url": "/chengshi/c101150100/", + "subLevelModelList": null + }, + { + "code": 101150200, + "name": "海东", + "url": "/chengshi/c101150200/", + "subLevelModelList": null + }, + { + "code": 101150300, + "name": "海北藏族自治州", + "url": "/chengshi/c101150300/", + "subLevelModelList": null + }, + { + "code": 101150400, + "name": "黄南藏族自治州", + "url": "/chengshi/c101150400/", + "subLevelModelList": null + }, + { + "code": 101150500, + "name": "海南藏族自治州", + "url": "/chengshi/c101150500/", + "subLevelModelList": null + }, + { + "code": 101150600, + "name": "果洛藏族自治州", + "url": "/chengshi/c101150600/", + "subLevelModelList": null + }, + { + "code": 101150700, + "name": "玉树藏族自治州", + "url": "/chengshi/c101150700/", + "subLevelModelList": null + }, + { + "code": 101150800, + "name": "海西蒙古族藏族自治州", + "url": "/chengshi/c101150800/", + "subLevelModelList": null + } + ] + }, + { + "code": 101170000, + "name": "宁夏", + "url": "", + "subLevelModelList": [ + { + "code": 101170100, + "name": "银川", + "url": "/chengshi/c101170100/", + "subLevelModelList": null + }, + { + "code": 101170200, + "name": "石嘴山", + "url": "/chengshi/c101170200/", + "subLevelModelList": null + }, + { + "code": 101170300, + "name": "吴忠", + "url": "/chengshi/c101170300/", + "subLevelModelList": null + }, + { + "code": 101170400, + "name": "固原", + "url": "/chengshi/c101170400/", + "subLevelModelList": null + }, + { + "code": 101170500, + "name": "中卫", + "url": "/chengshi/c101170500/", + "subLevelModelList": null + } + ] + }, + { + "code": 101130000, + "name": "新疆", + "url": "", + "subLevelModelList": [ + { + "code": 101132500, + "name": "新星市", + "url": "/chengshi/c101132500/", + "subLevelModelList": null + }, + { + "code": 101132600, + "name": "胡杨河市", + "url": "/chengshi/c101132600/", + "subLevelModelList": null + }, + { + "code": 101132700, + "name": "白杨市", + "url": "/chengshi/c101132700/", + "subLevelModelList": null + }, + { + "code": 101131700, + "name": "阿拉尔", + "url": "/chengshi/c101131700/", + "subLevelModelList": null + }, + { + "code": 101132100, + "name": "北屯市", + "url": "/chengshi/c101132100/", + "subLevelModelList": null + }, + { + "code": 101132200, + "name": "可克达拉市", + "url": "/chengshi/c101132200/", + "subLevelModelList": null + }, + { + "code": 101132300, + "name": "昆玉市", + "url": "/chengshi/c101132300/", + "subLevelModelList": null + }, + { + "code": 101131600, + "name": "石河子", + "url": "/chengshi/c101131600/", + "subLevelModelList": null + }, + { + "code": 101132400, + "name": "双河市", + "url": "/chengshi/c101132400/", + "subLevelModelList": null + }, + { + "code": 101130100, + "name": "乌鲁木齐", + "url": "/wulumuqi/", + "subLevelModelList": null + }, + { + "code": 101130200, + "name": "克拉玛依", + "url": "/chengshi/c101130200/", + "subLevelModelList": null + }, + { + "code": 101130800, + "name": "吐鲁番", + "url": "/chengshi/c101130800/", + "subLevelModelList": null + }, + { + "code": 101130900, + "name": "哈密", + "url": "/chengshi/c101130900/", + "subLevelModelList": null + }, + { + "code": 101130300, + "name": "昌吉回族自治州", + "url": "/chengshi/c101130300/", + "subLevelModelList": null + }, + { + "code": 101130500, + "name": "博尔塔拉蒙古自治州", + "url": "/chengshi/c101130500/", + "subLevelModelList": null + }, + { + "code": 101130400, + "name": "巴音郭楞蒙古自治州", + "url": "/chengshi/c101130400/", + "subLevelModelList": null + }, + { + "code": 101131000, + "name": "阿克苏地区", + "url": "/chengshi/c101131000/", + "subLevelModelList": null + }, + { + "code": 101131100, + "name": "克孜勒苏柯尔克孜自治州", + "url": "/chengshi/c101131100/", + "subLevelModelList": null + }, + { + "code": 101131200, + "name": "喀什地区", + "url": "/chengshi/c101131200/", + "subLevelModelList": null + }, + { + "code": 101131300, + "name": "和田地区", + "url": "/chengshi/c101131300/", + "subLevelModelList": null + }, + { + "code": 101130600, + "name": "伊犁哈萨克自治州", + "url": "/chengshi/c101130600/", + "subLevelModelList": null + }, + { + "code": 101131400, + "name": "塔城地区", + "url": "/chengshi/c101131400/", + "subLevelModelList": null + }, + { + "code": 101131500, + "name": "阿勒泰地区", + "url": "/chengshi/c101131500/", + "subLevelModelList": null + }, + { + "code": 101132000, + "name": "铁门关", + "url": "/chengshi/c101132000/", + "subLevelModelList": null + }, + { + "code": 101131800, + "name": "图木舒克", + "url": "/chengshi/c101131800/", + "subLevelModelList": null + }, + { + "code": 101131900, + "name": "五家渠", + "url": "/chengshi/c101131900/", + "subLevelModelList": null + } + ] + }, + { + "code": 101340000, + "name": "台湾", + "url": "", + "subLevelModelList": [ + { + "code": 101341100, + "name": "台湾", + "url": "/chengshi/c101341100/", + "subLevelModelList": null + } + ] + }, + { + "code": 101320000, + "name": "香港", + "url": "", + "subLevelModelList": [ + { + "code": 101320300, + "name": "香港", + "url": "/chengshi/c101320300/", + "subLevelModelList": null + } + ] + }, + { + "code": 101330000, + "name": "澳门", + "url": "", + "subLevelModelList": [ + { + "code": 101330100, + "name": "澳门", + "url": "/chengshi/c101330100/", + "subLevelModelList": null + } + ] + } + ] +} diff --git a/base.py b/base.py new file mode 100644 index 0000000..5357fd6 --- /dev/null +++ b/base.py @@ -0,0 +1,670 @@ +from selenium import webdriver +from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC +from selenium.webdriver.chrome.options import Options +from selenium.webdriver.common.by import By +import os +from urllib.parse import urljoin, urlparse +from datetime import datetime +import time +import random +import json + +# 定义常量 +DEBUGGER = True # 调试模式 +SEND_TIME = 10 # 每投递一个岗位 +REQUEST_TIME = 2 # 请求间隔时间 + + +# 调试信息输出 +import os +from datetime import datetime + + +class Logger: + LEVELS = {"debug": 10, "info": 20, "warn": 30, "error": 40} + + COLORS = { + "debug": "\033[90m", # 灰色 + "info": "\033[92m", # 绿色 + "warn": "\033[93m", # 黄色 + "error": "\033[91m", # 红色 + } + + STYLES = { + "debug": "\033[0m", # 默认样式(无加粗等) + "info": "\033[1m", # 加粗 + "warn": "\033[4m", # 下划线 + "error": "\033[1;31m", # 红色加粗 + } + + RESET = "\033[0m" # 重置样式 + current_level = "debug" + save_logs = False + log_dir = "logs" # 默认日志目录 + + @classmethod + def set_level(cls, level): + """设置日志级别""" + if level.lower() not in cls.LEVELS: + raise ValueError(f"未知日志等级: {level}") + cls.current_level = level.lower() + + @classmethod + def enable_log_save(cls, base_path): + """启用日志保存功能,并指定基础路径""" + cls.save_logs = True + cls.log_dir = os.path.join(base_path, "logs") # 生成路径: path/logs + + @classmethod + def disable_log_save(cls): + """禁用日志保存功能""" + cls.save_logs = False + + @classmethod + def _should_log(cls, level): + """判断是否满足日志等级输出条件""" + return cls.LEVELS[level] >= cls.LEVELS[cls.current_level] + + @classmethod + def _write_to_file(cls, log_message): + """写入文件,路径动态生成:logs/yyyy-mm-dd.txt""" + if cls.save_logs: + date_str = datetime.now().strftime("%Y-%m-%d") + log_file_path = os.path.join(cls.log_dir, f"{date_str}.txt") + os.makedirs(cls.log_dir, exist_ok=True) # 确保目录存在 + with open(log_file_path, "a", encoding="utf-8") as file: + file.write(log_message + "\n") + + @classmethod + def _log(cls, level, title, msg=None, data=None): + """打印日志并保存到文件""" + if not cls._should_log(level): + return + + color = cls.COLORS.get(level, "") + style = cls.STYLES.get(level, "") + now = datetime.now().strftime("[%Y-%m-%d %H:%M:%S]") + + log_message = f"{now}" + + # 只有标题 + if msg is None and data is None: + log_message += f" {title}" + else: + log_message += f"\n{title}" + if msg: + log_message += f"\n{msg}" + if data and isinstance(data, dict): + for k, v in data.items(): + log_message += f"\n{k}: {v}" + + # 控制台输出 + print(f"{style}{color}{log_message}{cls.RESET}") + + # 如果启用了保存日志,则写入文件 + cls._write_to_file(log_message) + + @classmethod + def debug(cls, title, msg=None, data=None): + cls._log("debug", title, msg, data) + + @classmethod + def info(cls, title, msg=None, data=None): + cls._log("info", title, msg, data) + + @classmethod + def warn(cls, title, msg=None, data=None): + cls._log("warn", title, msg, data) + + @classmethod + def error(cls, title, msg=None, data=None): + cls._log("error", title, msg, data) + + +# 深度查询 +def deep_get(d, keys, default=None): + for key in keys: + if isinstance(d, dict): + d = d.get(key, default) + else: + return default + return d + + +# 深度设置 +def deep_set(data, path, value): + for i, key in enumerate(path): + is_last = i == len(path) - 1 + + if isinstance(key, int): + if not isinstance(data, list): + raise TypeError( + f"预期 list,但找到 {type(data).__name__},在路径 {path[:i]}" + ) + + while len(data) <= key: + data.append({}) + + if is_last: + data[key] = value + else: + if not isinstance(data[key], (dict, list)): + data[key] = {} + data = data[key] + + else: # str 类型,处理 dict + if not isinstance(data, dict): + raise TypeError( + f"预期 dict,但找到 {type(data).__name__},在路径 {path[:i]}" + ) + + if is_last: + data[key] = value + else: + if key not in data or not isinstance(data[key], (dict, list)): + # 如果下一个是 int,自动生成 list,否则 dict + next_key = path[i + 1] + data[key] = [] if isinstance(next_key, int) else {} + data = data[key] + + +class Url: + + base = None # 基础url + login = None # 登录路径 + + +class Core: + name = None # 平台名称 + driver = None # 浏览器驱动 + esumes = {} # 属于该平台的简历 + cookies = [] # cookies + url = Url() # url + login_status = False # 登录状态 + verify_status = False # 验证状态 + assets_path = None # 资源目录 + output_path = None # 输出目录 + send_amount = None # 投递总数 + last_send_time = time.time() # 上次发送时间 + last_request_time = time.time() # 上次请求时间 + info = {} # 操作信息 + + def __init__(self, name, url_base, url_login, send_amount): + # 创建名字 + self.name = name + # 配置url + self.url.base = url_base + self.url.login = url_login + # 请求总数 + self.send_amount = send_amount + # 获取简历 + for key, value in Info.resume_profiles.items(): + if self.name in value["platforms"]: + self.esumes[key] = value + if len(self.esumes) == 0: + exit() + # 配置资源目录 + self.assets_path = os.path.join(os.getcwd(), "assets", self.name) + # 配置输出目录 + self.output_path = os.path.join(os.getcwd(), "output", self.name) + try: + if not os.path.exists(self.output_path): + os.makedirs(self.output_path) + except Exception as e: + Logger.error("创建输出目录失败", e) + # 配置信息 + info = {} + try: + with open( + os.path.join(self.output_path, "info.json"), + "r", + encoding="utf-8", + ) as f: + info = json.load(f) + except Exception as e: + Logger.warn("没有读取到配置信息") + if "date" not in info or info["date"] != datetime.now().strftime("%Y-%m-%d"): + info = {"date": datetime.now().strftime("%Y-%m-%d"), "resumes": {}} + self.info = info + # 配置Chrome选项 + chrome_options = Options() + chrome_options.add_argument("--ignore-certificate-errors") + chrome_options.add_argument("--ignore-ssl-errors") + chrome_options.add_argument("--no-sandbox") + chrome_options.add_argument("--disable-dev-shm-usage") + chrome_options.add_argument("--ignore-certificate-errors-spki-list") + chrome_options.add_argument("--allow-insecure-localhost") + # 新增以下选项 + chrome_options.add_argument("--disable-web-security") + chrome_options.add_argument("--allow-running-insecure-content") + chrome_options.add_argument("--reduce-security-for-testing") + chrome_options.add_experimental_option("excludeSwitches", ["enable-logging", "enable-automation"]) + chrome_options.add_experimental_option("useAutomationExtension", False) + # 设置偏好,禁用自动化提示 + prefs = { + "credentials_enable_service": False, + "profile.password_manager_enabled": False, + "profile.default_content_setting_values.notifications": 2, + # 下面的设置对绕过检测很重要 + "excludeSwitches": ["enable-automation"], + "useAutomationExtension": False + } + chrome_options.add_experimental_option("prefs", prefs) + + # 使用随机用户代理 + user_agents = [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36" + ] + chrome_options.add_argument(f"--user-agent={random.choice(user_agents)}") + + # 使用隐身模式 + chrome_options.add_argument("--incognito") + + # 添加新的自动化相关选项 + chrome_options.add_argument("--disable-blink-features=AutomationControlled") + + # 添加CDP命令,彻底禁用"Chrome正在被自动化软件控制"的提示 + chrome_options.add_argument("--remote-debugging-port=9222") + # 添加新的自动化相关选项 + chrome_options.add_argument("--ignore-gpu-blocklist") + chrome_options.add_argument("--use-gl=desktop") + # 禁用"浏览器正在被自动化软件控制"的信息栏 + chrome_options.add_argument("--disable-infobars") + + # 创建Chrome浏览器实例 + self.driver = webdriver.Chrome(options=chrome_options) + + # 核心:先访问空白页面然后执行脚本移除webdriver属性 + self.driver.get("about:blank") + + # 立即执行脚本,移除webdriver标志 + self.driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})") + + # 执行CDP命令,修改navigator.webdriver标志位 + self.driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { + "source": """ + // 覆盖 webdriver 属性 + Object.defineProperty(navigator, 'webdriver', { + get: () => false + }); + + // 修改window.navigator.chrome.runtime + if (window.navigator.chrome) { + window.navigator.chrome = { + runtime: {} + }; + } + + // 修改automation标识 + const originalQuery = window.navigator.permissions.query; + window.navigator.permissions.query = (parameters) => ( + parameters.name === 'notifications' ? + Promise.resolve({ state: Notification.permission }) : + originalQuery(parameters) + ); + + // 修改语言和插件 + Object.defineProperty(navigator, 'plugins', { + get: () => [1, 2, 3, 4, 5] + }); + + // 添加指纹模拟 + Object.defineProperty(navigator, 'languages', { + get: () => ['zh-CN', 'zh', 'en-US', 'en'] + }); + + // 覆盖 Notification API + const originalNotification = window.Notification; + if (originalNotification) { + window.Notification = function(title, options) { + return new originalNotification(title, options); + }; + window.Notification.permission = originalNotification.permission; + window.Notification.requestPermission = originalNotification.requestPermission; + } + """ + }) + + # 获取实际url + def get_url(self, url_path=""): + return urljoin(self.url.base, url_path) + + # 防止请求频繁 + def request_await(self): + interval = time.time() - self.last_request_time + if interval < REQUEST_TIME: + rest = REQUEST_TIME - interval + Logger.info(f"请求间隔过短,等待{rest}秒") + time.sleep(rest) + self.last_request_time = time.time() + + # 等待页面加载完成 + def page_load_await(self, timeout=10, wait_for_element=None): + last_url = self.driver.current_url # 记录初始 URL + last_change_time = time.time() # 记录 URL 变化的时间 + + while True: + try: + # 检查文档加载状态 + ready_state = self.driver.execute_script("return document.readyState") + + # 检查 URL 是否变化并更新时间 + current_url = self.driver.current_url + if current_url != last_url: + last_url = current_url + last_change_time = time.time() # 更新时间 + Logger.info("URL 发生变化,重新检测页面加载状态") + + # 如果 URL 没有变化超过两秒并且文档状态是 complete + if time.time() - last_change_time > 2 and ready_state == "complete": + # 检查是否可以获取元素(确保 DOM 元素没有失效) + if wait_for_element: + try: + self.driver.find_element(*wait_for_element) + except Exception as e: + Logger.info(f"获取 DOM 元素时出错: {e}") + return False + return True + + except Exception as e: + Logger.warn(f"检查页面加载状态时出错: {e}") + + # 如果在 timeout 时间内没有加载完成,退出等待 + if time.time() - last_change_time > timeout: + Logger.warn("等待超时,退出") + return False + + time.sleep(1) # 每秒检测一次 + + # 添加cookies + def add_cookies(self, cookies_str=None): + self.page_load_await() + # 读取cookies + if not cookies_str: + try: + with open( + os.path.join(self.output_path, "cookies.txt"), + "r", + encoding="utf-8", + ) as f: + cookies_str = f.read() + except Exception as e: + Logger.info("读取cookies失败", e) + return + else: + self.save_cookies(cookies_str) + # 解析cookies + try: + cookies_list = [] + + for item in cookies_str.split("; "): + name, value = item.split("=", 1) + cookie = { + "name": name, + "value": value, + "domain": urlparse(self.url.base).netloc, + } + cookies_list.append(cookie) + + self.cookies = cookies_list + except Exception as e: + Logger.warn("解析cookies失败", e, {"cookies_str": cookies_str}) + return + + # 添加cookies + try: + if self.cookies: + for cookie in self.cookies: + self.driver.add_cookie(cookie) + self.driver.refresh() + Logger.info("添加cookie完成") + else: + Logger.info("没有cookie,添加失败") + + except Exception as e: + Logger.info("添加cookie失败", e) + + # 保存cookies + def save_cookies(self, cookies_str=None): + try: + if cookies_str is None: + cookies = self.driver.get_cookies() + cookies_str = "; ".join( + [f"{cookie['name']}={cookie['value']}" for cookie in cookies] + ) + with open( + os.path.join(self.output_path, "cookies.txt"), + "w", + encoding="utf-8", + ) as f: + f.write(cookies_str) + Logger.info("保存cookie成功") + except Exception as e: + Logger.info("保存cookie失败", e) + + # 检测登录状态 + def detect_login(self): + pass + + # 检测是否触发验证 + def detect_verify(self): + pass + + # 所有检测+请求限制 + def detect(self): + self.page_load_await() + + # self.detect_verify() + # if self.verify_status: + # Logger.warn("当前处于人机验证") + # return True + + # self.detect_login() + # if not self.login_status: + # Logger.warn("当前处于未登录状态") + # login_url = self.get_url(self.url.login) + # if self.driver.current_url != login_url: + # self.driver.get(login_url) + # else: + # time.sleep(5) + # return True + self.request_await() + return False + + # 获取城市链接 + def get_city_info(self, value): + pass + + # 模拟真实移动 + def human_move(self, element, timeout=10): + try: + # 等待元素可见 + WebDriverWait(self.driver, timeout).until(EC.visibility_of(element)) + + # 滚动到元素可见位置 + self.driver.execute_script( + "arguments[0].scrollIntoView({behavior: 'smooth', block: 'center'});", + element, + ) + time.sleep(random.uniform(0.3, 0.8)) # 等待滚动完成 + + # 使用JavaScript直接高亮元素,模拟鼠标悬停效果 + self.driver.execute_script( + """ + var element = arguments[0]; + var originalBackground = element.style.backgroundColor; + var originalTransition = element.style.transition; + + element.style.transition = 'background-color 0.3s'; + element.style.backgroundColor = 'rgba(255, 255, 0, 0.3)'; + + setTimeout(function() { + element.style.backgroundColor = originalBackground; + element.style.transition = originalTransition; + }, 300); + """, + element, + ) + + # 直接移动到元素 + actions = ActionChains(self.driver) + actions.move_to_element(element).perform() + + time.sleep(random.uniform(0.3, 0.8)) + return True + except Exception as e: + print(f"移动到元素失败,错误信息:{e}") + return False + + # 模拟真实点击 + def human_click(self, element, timeout=10): + try: + # 滚动到元素中间 + self.driver.execute_script( + "arguments[0].scrollIntoView({behavior: 'smooth', block: 'center'});", + element, + ) + time.sleep(random.uniform(0.3, 0.8)) + + # 确保滚动完成 + time.sleep(1) + + # 简化鼠标操作,避免复杂的动作链 + actions = ActionChains(self.driver) + # 直接移动到元素 + actions.move_to_element(element) + # 短暂停顿 + actions.pause(random.uniform(0.2, 0.5)) + # 点击 + actions.click() + # 执行动作链 + actions.perform() + + time.sleep(random.uniform(0.2, 0.6)) + return True + except Exception as e: + Logger.error("点击失败", e) + return False + + # 模拟真实输入 + def human_type(self, by, value, text, timeout=10): + # 显式等待元素可输入 + wait = WebDriverWait(self.driver, timeout) + input_element = wait.until(EC.element_to_be_clickable((by, value))) + + # 清空现有输入(如果有的话) + input_element.clear() + + # 模拟键入的过程(逐个字符) + actions = ActionChains(self.driver) + for char in text: + actions.send_keys(char) + actions.pause(random.uniform(0.1, 0.4)) # 随机停顿模拟人类输入的速度 + + actions.perform() + + # 投递 + def send(self): + pass + + # 保存信息 + def save_info(self): + try: + with open( + os.path.join(self.output_path, "info.json"), + "w", + encoding="utf-8", + ) as f: + json.dump(self.info, f, indent=4) + Logger.info("保存信息成功") + except Exception as e: + Logger.info("保存信息失败", e) + + # 修改信息 + def set_info(self, paths, value): + data = self.info + for i, key in enumerate(paths): + is_last = i == len(paths) - 1 + + if isinstance(key, int): + if not isinstance(data, list): + raise TypeError( + f"路径 {paths[:i]} 处应为 list,但实际为 {type(data).__name__}" + ) + while len(data) <= key: + data.append({}) + if is_last: + data[key] = value + else: + if not isinstance(data[key], (dict, list)): + data[key] = {} + data = data[key] + + else: # key 是 str,处理 dict + if not isinstance(data, dict): + raise TypeError( + f"路径 {paths[:i]} 处应为 dict,但实际为 {type(data).__name__}" + ) + if is_last: + data[key] = value + else: + if key not in data or not isinstance(data[key], (dict, list)): + next_key = paths[i + 1] + data[key] = [] if isinstance(next_key, int) else {} + data = data[key] + + +class Info: + # 存储所有预定义的简历配置 + resume_profiles = {} + + # 默认配置 + DEFAULT_CONFIG = { + "citys": {"全国": ["全国"]}, + "keywords": ["Python"], # 需要搜索的职位,会依次投递 + "industry": [ + "不限" + ], # 公司行业,只能选三个,相关代码枚举的部分,如果需要其他的需要自己找 + "experience": [ + "不限" + ], # 工作经验:"应届毕业生", "1年以下", "1-3年", "3-5年", "5-10年", "10年以上" + "jobType": "不限", # 求职类型:"全职", "兼职" + "salary": "50K以上", # 薪资(单选):"3K以下", "3-5K", "5-10K", "10-20K", "20-50K", "50K以上" + "degree": [ + "不限" + ], # 学历: "初中及以下", "中专/中技", "高中", "大专", "本科", "硕士", "博士" + "scale": [ + "不限" + ], # 公司规模:"0-20人", "20-99人", "100-499人", "500-999人", "1000-9999人", "10000人以上" + "stage": [ + "不限" + ], # "未融资", "天使轮", "A轮", "B轮", "C轮", "D轮及以上", "已上市", "不需要融资" + "expectedSalary": [ + 25 + ], # 期望薪资,单位为K,第一个数字为最低薪资,第二个数字为最高薪资,只填一个数字默认为最低薪水 + "filterDeadHR": True, # 是否过滤不活跃HR,该选项会过滤半年前活跃的HR + "sayHi": "您好,我有8年工作经验,还有AIGC大模型、Java,Python,Golang和运维的相关经验,希望应聘这个岗位,期待可以与您进一步沟通,谢谢!", # 必须要关闭boss的自动打招呼 + "platforms": ["boss"], + } + + def __init__(self): + # 初始化时加载默认配置 + if "default" not in Info.resume_profiles: + Info.resume_profiles["default"] = Info.DEFAULT_CONFIG.copy() + + @classmethod + def add_profile(cls, name, config_dict): + """添加一个新的简历配置""" + # 从默认配置创建一个新的配置副本 + new_config = cls.DEFAULT_CONFIG.copy() + + # 更新新的配置副本,只有在config_dict中有值的字段会被更新 + new_config.update(config_dict) + + # 将新的配置添加到resume_profiles + cls.resume_profiles[name] = new_config + return cls diff --git a/boss.py b/boss.py new file mode 100644 index 0000000..aa7a204 --- /dev/null +++ b/boss.py @@ -0,0 +1,267 @@ +import time +import base +from base import Logger +from selenium.webdriver.common.by import By +import json +import os +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC +import consts + + +class BossCore(base.Core): + citys = {} + + def __init__(self): + super().__init__( + name="boss", + url_base="https://www.zhipin.com/", + url_login="/web/user/?ka=header-login", + send_amount=300, + ) + + def detect_login(self): + last_status = self.login_status + self.login_status = ( + len(self.driver.find_elements(By.CLASS_NAME, "link-logout")) > 0 + ) + if not last_status and self.login_status: + self.save_cookies() + + def detect_verify(self): + self.verify_status = ( + len(self.driver.find_elements(By.CLASS_NAME, "validate_button_click")) > 0 + ) + + def get_city_info(self, value): + province = next(iter(value.keys())) + city = next(iter(value.keys())) + if province in self.citys.keys(): + if city in self.citys[province].keys(): + return self.citys[province][city] + + try: + with open( + os.path.join(self.assets_path + "\site.json"), "r", encoding="utf-8" + ) as f: + allData = json.load(f) + ProvinceData = None + Data = None + # 获取省份数据 + for item in allData["siteList"]: + if item["name"] == province: + ProvinceData = item + self.citys[province] = {} + break + if ProvinceData is None: + Logger.warn(f"没有找到省份 {province} 的信息") + return + # 获取城市数据 + for item in ProvinceData["subLevelModelList"]: + if item["name"] == city: + Data = item + self.citys[province][city] = {} + break + if Data is None: + Logger.warn(f"没有找到城市 {city} 的信息") + return + self.citys[province][city]["url"] = Data["url"] + self.citys[province][city]["code"] = Data["code"] + return self.citys[province][city] + except Exception as e: + Logger.warn(f"获取城市信息失败", e, {"province": province, "city": city}) + return + + def send(self): + # 所有检查 + if core.detect(): + self.send() + return + # 检查简历信息 + if len(self.info["resumes"]) == 0: + send_amount = 0 + + for name, resume in self.esumes.items(): + send_amount += len(resume["keywords"]) * len(resume["citys"]) + self.info["resumes"][name] = {} + + for name, resume in self.esumes.items(): + for province, citys in resume["citys"].items(): + self.info["resumes"][name][province] = {} + for city in citys: + self.info["resumes"][name][province][city] = {} + for keyword in resume["keywords"]: + self.info["resumes"][name][province][city][keyword] = { + "expected": self.send_amount // send_amount, + "actual": 0, + "page": 1, + "surplus": False, + } + self.save_info() + # 取出本次需要投递的 + current_name = None + current_keyword = None + current_province = None + current_city = None + actual_amount = 0 + + for name, provinces in self.info["resumes"].items(): + for province, citys in provinces.items(): + for city, kywords in citys.items(): + for keyword, info in kywords.items(): + if ( + info["surplus"] == False + and info["actual"] < info["expected"] + ): + current_province = province + current_city = city + current_keyword = keyword + current_name = name + break + if current_name is not None: + break + if current_name is not None: + break + if current_name is not None: + break + + if actual_amount < self.send_amount and current_keyword is None: + for name, provinces in self.info["resumes"].items(): + for province, citys in provinces.items(): + for city, kywords in citys.items(): + for keyword, info in kywords.items(): + if info["surplus"] == False: + current_province = province + current_city = city + current_keyword = keyword + current_name = name + break + if current_name is not None: + break + if current_name is not None: + break + if current_name is not None: + break + if current_keyword is None: + Logger.info("投递完毕") + self.driver.close() + exit() + + info_path = [ + "resumes", + current_name, + current_province, + current_city, + current_keyword, + ] + Logger.info( + f"当前投递 {current_name} - {current_province} - {current_city} - {current_keyword}" + ) + # 获取要投递的城市链接 + city_info = self.get_city_info({current_province: [current_city]}) + if city_info is None: + self.info["resumes"][current_name][current_province][current_city][ + current_keyword + ]["surplus"] = True + self.save_info() + return + # 跳转到搜索页面 + self.driver.get( + self.get_url( + f"/web/geek/job?query={current_keyword}&city={city_info['code']}&page={base.deep_get(self.info, info_path)['page']}" + ) + ) + + # 所有检查 + if core.detect(): + self.send() + return + + ## 设置筛选标签 + def get_level_ones(): + if core.detect(): + return + try: + level_ones = self.driver.find_elements(By.CLASS_NAME, "placeholder-text") + level_ones_dict = {} + for item in level_ones: + s = item.find_element(By.XPATH, "./..") + box = s.find_element(By.XPATH, "./..") + level_ones_dict[item.text] = {} + level_ones_dict[item.text]["father"] = box + level_ones_dict[item.text]["self"] = item + if len(level_ones_dict)!=0: + return level_ones_dict + else: + Logger.error("筛选的一级菜单盒子查找失败") + except Exception as e: + Logger.error("筛选的一级菜单盒子查找失败") + + + # 设置公司行业 + current_industry_site = 0 + while current_industry_site < len(self.esumes[current_name]["industry"]): + try: + level_ones_dict = get_level_ones() + if level_ones_dict is None: return + is_select = False + level_one_box = level_ones_dict["公司行业"]["father"] + level_two_box = level_one_box.find_element( + By.CLASS_NAME, "filter-select-dropdown" + ) + if level_two_box is None: + Logger.error("公司行业的二级菜单盒子查找失败") + level_twos = level_two_box.find_elements(By.TAG_NAME, "a") + if level_twos is None: + Logger.error("公司行业的二级菜单选项查找失败") + while not is_select and current_industry_site < len( + self.esumes[current_name]["industry"] + ): + for item in level_twos: + tag_text = item.get_attribute("innerText") + if ( + tag_text + == self.esumes[current_name]["industry"][ + current_industry_site + ] + ): + core.human_move(level_ones_dict["公司行业"]["self"]) + core.human_click(item) + is_select = True + WebDriverWait(self.driver, 10).until(EC.staleness_of(item)) + break + except Exception as e: + Logger.error( + "设置公司行业失败", + e, + { + "industry": self.esumes[current_name]["industry"][ + current_industry_site + ] + }, + ) + finally: + current_industry_site += 1 + + + Logger.info("设置公司行业完成") + time.sleep(1000) + + +core = BossCore() + +# 配置日志输出 +Logger.enable_log_save(core.output_path) + +# 首次打开页面 +core.request_await() +core.driver.get(core.get_url()) +core.page_load_await() +# 添加cookies +# core.request_await() +# core.add_cookies() +# core.page_load_await() +# 投递 +core.send() + +core.driver.close() diff --git a/consts.py b/consts.py new file mode 100644 index 0000000..b6be5bd --- /dev/null +++ b/consts.py @@ -0,0 +1,18 @@ +from base import Info + +Info.add_profile( + "custom_profile", + { + "keywords": ["全栈开发", "Rust", "React", "爬虫", "Linux"], + "experience": ["3-5年", "5-10年"], # 根据您的经验调整 + "salary": "20-50K", # 根据您的期望调整 + "sayHi": ( + "您好,我是一名全栈开发工程师,精通React和Rust技术栈。在前端方面熟悉React、Dioxus并结合" + "Astro,Vite.js和Tailwind CSS进行现代响应式前端开发;后端方面熟悉Rust、Node.js,擅长使用Rocket和" + "Express框架。此外,我具备数据库管理、容器化部署、网络通信等多方面技能,有echoes和echoer等" + "项目经验。希望能有机会与您进一步交流,谢谢!" + ), + "degree": ["本科", "硕士"], # 根据您的学历调整 + "industry": ["互联网", "计算机软件", "计算机服务"], # 根据您的目标行业调整 + }, +) diff --git a/test.py b/test.py new file mode 100644 index 0000000..b0c3d1a --- /dev/null +++ b/test.py @@ -0,0 +1,13 @@ +import base +import time +from selenium.webdriver.common.by import By + +test = base.Core("test", "https://www.baidu.com", "/login", 100) + +test.driver.get(test.get_url()) +test.page_load_await() +submit = test.driver.find_element(By.ID, "su") +print(submit.text) +test.human_move(submit) + +time.sleep(1000)