一、项目进展
项目功能完成了追加规范地域,行政区划代码两字段,完成了关键字的提取,行业分类。还有行业代码没有对应以及数据展示没有完成。
二、追加规范地域,行政区划代码两字段(参考博客:https://www.cnblogs.com/zlc364624/p/12482427.html)
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 4 5 import urllib.request, urllib.parse, urllib.error 6 import json 7 import hashlib 8 import MySQLdb 9 10 11 MyAK = 'xxxx' 12 MySK = 'xxxx' 13 lat = 0 14 lng = 0 15 dictjson = {} # 声明一个字典 16 17 def JingWei(address): 18 global lat, lng 19 # 产生sn码 20 queryStr = "/geocoding/v3/?address=" + address + '&output=json&ak=' + MyAK 21 encodedStr = urllib.parse.quote(queryStr, safe="/:=&?#+!$,;'@()*[]") 22 rawStr = encodedStr + MySK 23 sn = (hashlib.md5(urllib.parse.quote_plus(rawStr).encode("utf8")).hexdigest()) 24 25 # 生成url 26 url = urllib.parse.quote("http://api.map.baidu.com" + queryStr + "&sn=" + sn, safe="/:=&?#+!$,;'@()*[]") 27 # print('Retrieving', url) 28 29 # 从API读取数据 30 uh = urllib.request.urlopen(url) 31 data = uh.read().decode() 32 # print('Retrieved', len(data), 'characters') 33 34 # 解析数据 35 try: 36 js = json.loads(data) 37 except: 38 js = None 39 40 if not js or 'status' not in js or js['status'] != 0: 41 print('======Failure====') 42 print(data) 43 return 44 45 # print(json.dumps(js, indent=4, ensure_ascii=False)) 46 47 # 获取经纬度坐标和地址类型 48 lat = js["result"]["location"]["lat"] 49 lng = js["result"]["location"]["lng"] 50 # print('纬度', lat, '经度', lng) 51 level = js["result"]["level"] 52 # print('地址类型', level) 53 54 55 # 基于百度地图API下的经纬度信息来解析地理位置信息 56 def getlocation(lat, lng): 57 # print(lat,"ss",lng) 58 url = '/reverse_geocoding/v3/?ak='+MyAK+'&output=json&coordtype=wgs84ll&location='+str(lat)+','+str(lng) 59 encodedStr = urllib.parse.quote(url, safe="/:=&?#+!$,;'@()*[]") 60 rawStr = encodedStr + MySK 61 sn = (hashlib.md5(urllib.parse.quote_plus(rawStr).encode("utf8")).hexdigest()) 62 # 生成url 63 url = urllib.parse.quote("http://api.map.baidu.com" + url + "&sn=" + sn, safe="/:=&?#+!$,;'@()*[]") 64 # print('Retrieving', url) 65 req = urllib.request.urlopen(url) # json格式的返回数据 66 res = req.read().decode("utf-8") # 将其他编码的字符串解码成unicode 67 # print(json.loads(res)) 68 return json.loads(res) 69 70 71 def jsonFormat(lat, lng): 72 str = getlocation(lat, lng) 73 global dictjson 74 dictjson={} 75 # get()获取json里面的数据 76 jsonResult = str.get('result') 77 address = jsonResult.get('addressComponent') 78 # 国家 79 country = address.get('country') 80 # 国家编号(0:中国) 81 country_code = address.get('country_code') 82 # 省 83 province = address.get('province') 84 # 城市 85 city = address.get('city') 86 # 城市等级 87 city_level = address.get('city_level') 88 # 县级 89 district = address.get('district') 90 # 区划代码 91 adcode=address.get('adcode') 92 # 街道 93 street=address.get('street') 94 # 街道编号 95 street_number=address.get('street_number') 96 # 把获取到的值,添加到字典里(添加) 97 # dictjson['country']=country 98 # dictjson['country_code'] = country_code 99 dictjson['province'] = province+city+district+street+street_number 100 dictjson['adcode'] = adcode 101 # dictjson['city_level'] = city_level 102 # dictjson['district']=district 103 return dictjson 104 105 def getInfo(): 106 Data = [] 107 108 # 打开数据库连接 109 db = MySQLdb.connect("127.0.0.1", "root", "root", "datax", charset='utf8') 110 111 # 使用cursor()方法获取操作游标 112 cursor = db.cursor() 113 114 # SQL 查询语句 115 sql = "SELECT * FROM exam23" 116 try: 117 # 执行SQL语句 118 cursor.execute(sql) 119 # 获取所有记录列表 120 results = cursor.fetchall() 121 print(results) 122 for row in results: 123 data = {} 124 # data['序号'] = row[10] 125 data['地址'] = row[0] 126 # if data["地址"] == None: 127 # data['地址'] = row[11].split()[0] 128 # if data["地址"] == "": 129 # data['地址'] = row[11].split()[0] 130 # if ' ' in row[15]: 131 # data['完成单位'] = row[11].split()[0] 132 # else: 133 # data['完成单位'] = row[15] 134 Data.append(data) 135 print(len(Data)) 136 for data in Data: 137 if data["地址"]==None: 138 print(data) 139 if data["地址"]=='': 140 print(data) 141 if len(data["地址"])<2: 142 print(data) 143 print(Data) 144 Data.sort(reverse=True) 145 for i in range(1, len(Data)-1): 146 if Data[i]["地址"] == Data[i-1]["地址"]: 147 Data 148 149 150 except: 151 print("Error: unable to fecth data") 152 153 154 # 关闭数据库连接 155 db.close() 156 return Data 157 158 def update(Data): 159 # for data in Data: 160 # 打开数据库连接 161 db = MySQLdb.connect("localhost", "root", "root", "datax", charset='utf8') 162 163 # 使用cursor()方法获取操作游标 164 cursor = db.cursor() 165 for data in Data: 166 # SQL 更新语句 167 sql = "UPDATE exam23 SET 行政区划编码 = '%s',规范地域 = '%s' WHERE 序号 = '%s'" % (data['行政区划编码'],data['规范地域'],data['序号']) 168 try: 169 # 执行SQL语句 170 cursor.execute(sql) 171 # 提交到数据库执行 172 db.commit() 173 except: 174 # 发生错误时回滚 175 db.rollback() 176 177 # 关闭数据库连接 178 db.close() 179 180 181 def getInfo1(): 182 Data = [] 183 Data1 = [] 184 185 # 打开数据库连接 186 db = MySQLdb.connect("127.0.0.1", "root", "hjy173780", "datax", charset='utf8') 187 188 # 使用cursor()方法获取操作游标 189 cursor = db.cursor() 190 191 # SQL 查询语句 192 sql = "SELECT * FROM exam21" 193 try: 194 # 执行SQL语句 195 cursor.execute(sql) 196 # 获取所有记录列表 197 results = cursor.fetchall() 198 print(results) 199 print(len(results[0])) 200 for row in results: 201 data = {} 202 data['行政区划编码'] = row[18] 203 data['规范地域'] = row[19] 204 # if data["地址"] == None: 205 # data['地址'] = row[11].split()[0] 206 # if data["地址"] == "": 207 # data['地址'] = row[11].split()[0] 208 # if ' ' in row[15]: 209 # data['完成单位'] = row[11].split()[0] 210 # else: 211 # data['完成单位'] = row[15] 212 if data not in Data: 213 Data.append(data) 214 215 print(len(Data)) 216 print(Data) 217 218 for data in Data: 219 print(data['规范地域']) 220 if data['规范地域'] != None: 221 if '区' in data['规范地域']: 222 data['规范地域'] = data['规范地域'][:data['规范地域'].index('区')+1] 223 if data not in Data1: 224 Data1.append(data) 225 226 227 print(len(Data1)) 228 print(Data1) 229 230 231 except: 232 print("Error: unable to fecth data") 233 234 235 # 关闭数据库连接 236 db.close() 237 return Data 238 239 def update1(Data): 240 # for data in Data: 241 # 打开数据库连接 242 db = MySQLdb.connect("localhost", "root", "hjy173780", "datax", charset='utf8') 243 244 # 使用cursor()方法获取操作游标 245 cursor = db.cursor() 246 for data in Data: 247 # SQL 更新语句 248 sql = "UPDATE exam21 SET 规范地域 = '%s' where 行政区划编码 = '%s'" % (data['规范地域'],data['行政区划编码']) 249 try: 250 # 执行SQL语句 251 cursor.execute(sql) 252 # 提交到数据库执行 253 db.commit() 254 except: 255 # 发生错误时回滚 256 db.rollback() 257 258 # 关闭数据库连接 259 db.close() 260 261 if __name__ == "__main__": 262 data = getInfo1() 263 update1(data) 264 # datas = getInfo() 265 # Data = [] 266 # for data in datas: 267 # print(data["地址"]) 268 # JingWei(data["地址"]) 269 # jsonFormat(lat, lng) 270 # data['行政区划编码']=dictjson.get('adcode') 271 # data['规范地域']=dictjson.get('province') 272 # Data.append(data) 273 # print(Data) 274 # update(Data) 275 # JingWei("北京市地铁建筑安装工程公司") 276 # jsonFormat(lat, lng) 277 # # print(jsonFormat(lat,lng)) 278 # print(dictjson.get('province')[:dictjson.get('province').index('区')+1]+" 行政区划代码"+dictjson.get('adcode')) 279 # JingWei("深圳大学") 280 # jsonFormat(lat, lng) 281 # # print(jsonFormat(lat, lng)) 282 # print(dictjson.get('province')[:dictjson.get('province').index('区')+1]+" 行政区划代码"+dictjson.get('adcode'))
三、jieba关键字提取
设计思路:从数据库中获取关键字构建自定义的分词库,进行分词提取。
知识追加:TF-IDF分词法中停词文本语料库就是文本中出现次数追多的词,最无用的词(简单的来说就是像去掉标点符号那样)。逆向文本频率文本语料库就是一些在文章中不常见的词语,出现次数少的词。
1 content = "该课题针对TDI(甲苯二异氰酸酯)生产废渣污染问题,将TDI废渣进行催化水解生成TDA(甲苯二胺)单体,实现了资源再生。创新点如下:1、确定了在温和反应条件下TDA高收率的水解催化剂和相转移催化剂;2、研发了高粘度、高沸点物料的连续化液固分离技术,实现了万吨级工业化生产,并形成了工艺技术软件包;3、开发了催化剂、水的循环利用和集成换热技术,降低了能耗和生产成本。采用该工艺生产的TDA,产品检测合格,满足TDI生产和其他用户要求。该技术已获得中国和美国发明专利(CN 102633651B;US 8,658,828 B2)及实用新型专利(CN 203222567 U),并制定了企业标准(Q/CFY01-2014)。该技术实现了TDI生产过程中排放的焦油废渣的回收利用,具有明显的经济效益、社会效益和环境效益。" 2 3 # 第一个参数:待提取关键词的文本 4 # 第二个参数:返回关键词的数量,重要性从高到低排序 5 # 第三个参数:是否同时返回每个关键词的权重 6 # 第四个参数:词性过滤,为空表示不过滤,若提供则仅返回符合词性要求的关键词 7 # 加载停止词(Stop Words)文本语料库 8 jieba.analyse.set_stop_words("stop_words.txt") 9 # 加载逆向文件频率(IDF)文本语料库 10 jieba.analyse.set_idf_path("idf.txt.big"); 11 keywords = jieba.analyse.extract_tags(content, topK=5, withWeight=True, allowPOS=('n','v',),) 12 print(keywords)
四,爬取《国民经济行业分类与代码》的数据表
知识点积累:1、爬取数据出现乱码现象:encoding与apparent_encoding不一致。解决办法
1 response_data = requests.get(url, headers=headers) 2 print(response_data.encoding) 3 print(response_data.apparent_encoding) 4 response_data.encoding = response_data.apparent_encoding
2、BeautiSoup方法:将爬取的数据通过lxml解析。(使用该方法结合select方法会很快的找到相应的数据)
3、select方法:F12打开浏览器编辑器。选择想爬取的数据,复制路径(右击copy-->copy selector),将路径的后部分作为参数即可。
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 import requests 4 from bs4 import BeautifulSoup 5 import re 6 import xlwt 7 import string 8 import json 9 import os 10 11 12 13 def deal(Str): 14 # print(type(Str)) 15 Str = str(Str) 16 item = [] 17 try: 18 datas = re.findall('>(.*?)</', Str, re.S) 19 # print(datas) 20 for data in datas: 21 data = re.sub(r'<.*?>', '', data) 22 if len(data) >= 1: 23 data = re.sub(r' ', '', data) 24 data = re.sub(r'xa0', '', data) 25 data = re.sub(r' ', '', data) 26 item.append(data) 27 except: 28 print(str) 29 return item 30 31 32 url = "http://114.xixik.com/hangyefenlei/" 33 headers = { 34 35 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36' 36 } 37 response_data = requests.get(url, headers=headers) 38 print(response_data.encoding) 39 print(response_data.apparent_encoding) 40 response_data.encoding = response_data.apparent_encoding 41 if response_data.text: 42 # print(response_data.text) 43 soup = BeautifulSoup(response_data.text, "lxml") 44 director = soup.select("table > tbody > tr") 45 # print(type("".join(director))) 46 # datas = director[0].split(',') 47 48 print(director[0]) 49 Data = [] 50 for data in director: 51 item = deal(data) 52 # print(data) 53 Data.append(item) 54 print(Data) 55 # print(datas) 56 # print(len(datas)) 57 58 59 # parent = ["0","0","0","0"] 60 # m=0 61 A = '' 62 finalCodes = [] 63 for item in Data: 64 if item[4]=="": 65 continue 66 code = {} 67 if item[0]!='': 68 A = item[0] 69 code["code"] = A 70 else: 71 code["code"] =A + item[0]+item[1]+item[2]+item[3] 72 code["name"] = item[4] 73 code["intro"] = item[5] 74 finalCodes.append(code) 75 # if item[0]!='': 76 # if len(item[0])<=parent 77 78 f = xlwt.Workbook(encoding='utf-8') 79 sheet01 = f.add_sheet(u'sheet1', cell_overwrite_ok=True) 80 sheet01.write(0, 0, 'code') # 第一行第一列 81 sheet01.write(0, 1, 'name') 82 sheet01.write(0, 2, 'intro') 83 84 for i in range(len(finalCodes)): 85 sheet01.write(i + 1, 0, finalCodes[i]['code']) 86 sheet01.write(i + 1, 1, finalCodes[i]['name']) 87 sheet01.write(i + 1, 2, finalCodes[i]['intro']) 88 f.save('D:\爬虫数据\行业代码\industrycode.xls') 89 # if __name__ == '__main__': 90 data = "<tr><td><b>A</b></td><td><b> </b></td><td><b> </b></td><td> </td><td><b>农、林、牧、渔业</b></td><td> 本门类包括01~05大类</td></tr>" 91 item = deal(data) 92 print(item) 93 # data1 = "" 94 # datas = re.findall('>(.*?)</',data,re.S) 95 # print(datas) 96 # Data = [] 97 # for data in datas: 98 # data = re.sub(r'<.*?>', '', data) 99 # if len(data)>=1: 100 # data = re.sub(r' ','',data) 101 # data = re.sub(r'xa0', '', data) 102 # data = re.sub(r' ', '', data) 103 # Data.append(data) 104 # 105 # print(Data)
五、贝叶斯公式实现行业分类
1 def buildBY(): 2 Data = getdatas1() + getdatas2() 3 types = [] 4 intros = [] 5 print(len(Data)) 6 for data in Data: 7 data['intro'] = draw_key_word(data['intro']) # 关键字提取 8 types.append(data['type']) 9 intros.append(data['intro']) 10 11 print(Data) 12 df_train = pd.DataFrame({'content_clean': intros, 'label': types}) # 使用panadas收集数据集 13 train_data = df_train.tail() 14 print(train_data) 15 label_mapping = {} 16 mapping = df_train.label.unique() # 结果集数据去重 17 n = 1 18 for item in mapping: 19 label_mapping[item] = n 20 n = n + 1 21 print(label_mapping) 22 df_train['label'] = df_train['label'].map(label_mapping) # 处理结果数据集,最终形成这种样子:[1,2,3,4,5] 23 print(df_train['label']) 24 print(df_train.head()) 25 26 labels = [] 27 for label in df_train['label']: 28 labels.append(label) 29 30 print(labels) 31 32 # words = [] 33 # for line_index in range() 34 # vec = TfidfTransformer(analyzer='word', max_features=200,lowercase=False) 35 vec = CountVectorizer(analyzer='word', max_features=200, lowercase=False) # 构建多维度数据模型 36 vec.fit(intros) 37 38 classifier = MultinomialNB() # 实例化一个贝叶斯对象 39 classifier.fit(vec.transform(intros), labels) # 开始训练 40 41 return label_mapping,intros,classifier,vec,mapping 42 43 44 def deal_data(Data): 45 label_mapping, intros, classifier, vec, mapping = buildBY() 46 47 for data in Data: 48 intro = data['deal_intro'] 49 The_type = [] 50 for n in range(len(label_mapping)): 51 test_words = [] 52 for i in range(1): 53 test_words.append(intro) 54 test_labels = [] 55 for i in range(1): 56 test_labels.append(n) 57 score = classifier.score(vec.transform(test_words), test_labels) # 计算测试用例符合要求的概率 58 if score > 0.8: 59 The_type.append(mapping[n]) 60 print(score, len(test_labels), len(test_words)) 61 final_type = " ".join(The_type) 62 print(final_type) 63 data['type'] = final_type 64 65 return Data