对展会数据分类后,我的新任务是如何通过公司名、公司地址、国家等海关数据推断出该公司的官网网站(若官网不存在则不考虑)
以下数据仅供参考:
| 公司名 | 国家 | 地址 |
|---|---|---|
| JPW INDUSTRIES INC | 427 NEW SANFORD RD LAVERGNE TN 37086 US | |
| Fujian Xishi Co., Ltd | CN, CHINA | |
| BusinessPartner Co.,ltd | ||
| BENKAI Co.,Ltd | ||
| GOLD INC | 18245 E 40TH AVE AURORA CO 80011 US |
需要得到结果:
| 公司名 | 官方网站 |
|---|---|
| JPW INDUSTRIES INC | http://http://www.jpwindustries.com/ |
| Fujian Xishi Co., Ltd | http://www.xishigroup.com/ |
| BusinessPartner Co.,ltd | http://www.traderthailand.com/ |
| BENKAI Co.,Ltd | http://www.benkaico.com |
| GOLD INC | https://goldbuginc.com/ |
由数据可看出,公司名是绝对存在的,故解决思路是从公司名出发,而不怎么全面的国家以及地址信息则用来提高准确度。
大体思路是这样的,若公司官网存在,那么通过搜索引擎定会被检索到,搜索引擎自然首选google,所以可以先通过获取谷歌搜索的结果,然后分析获取的结果,从而得出最可能是该公司网站的url。
初步搜索一下,看看各种情况:
第一种情况,检索即可很直观地得出结果
JPW INDUSTRIES INC
第二种情况,检索不能直观地得出结果,但官网确实存在(第二检索个结果)
Fujian Xishi Co., Ltd
第三种情况,输入公司名+公司地址和只输入公司名得出的结果不一样
GOLD INC
对于第三种情况,可以看出输入公司名+公司地址得出的结果是绝对正确的。
观察第三种情况,当输入公司名+公司地址时,返回结果的右侧会出现公司的详细信息,经过验证,若出现这种情况,则其website对应的url绝对正确。
故代码的第一步骤可以首先检索公司名+公司地址,观察website元素是否存在,若存在,返回公司官网,否则,对公司名进行检索。
代码:
def searchWeb(query, tld='com', lang='en', tbs='0', num=10, safe='off', tpe='', user_agent=None): query = quote_plus(query) get_page(url_home % vars()) url = url_search_num % vars() # Request the Google Search results page. html = get_page(url) try: href = re.findall(r'DirectionsWebsite', str(html))[0] link = filter_result(href) return link except: pass return None
直接返回公司官网
能直接获取公司官网毕竟是少数,大多数据还是要通过一步步计算得出,主要经过以下步骤:
获取搜索引擎检索结果提取url->初步排除某些url->余弦相似度计算最可能的结果
对于谷歌搜索,我使用了MarioVilas的项目google,毕竟在国内,为了以防万一我也写了yahoo搜索,代码如下:
#!/usr/bin/env # -*-coding:utf-8-*- # script: yahooSearch.py __author__ = 'howie' import sys import time if sys.version_info[0] > 2: from urllib.request import Request, urlopen from urllib.parse import quote_plus, urlparse else: from urllib import quote_plus from urllib2 import Request, urlopen from urlparse import urlparse, parse_qs try: from bs4 import BeautifulSoup is_bs4 = True except importError: from BeautifulSoup import BeautifulSoup is_bs4 = False url_search = "https://search.yahoo.com/search?p=%(query)s&b=%(start)s&pz=%(num)s" headers = { 'accept-encoding': 'gzip, deflate, sdch, br', 'accept-language': 'zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4', 'upgrade-insecure-requests': '1', 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,**;q=0.8", "Accept-Encoding": "gzip, deflate, sdch", "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4", "Cache-Control": "max-age=0", "Proxy-Connection": "keep-alive", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36", } try: data = requests.get(domain, headers=headers).text soup = BeautifulSoup(data, 'html.parser') title = soup.title.get_text() title = re.sub(r'rn', '', title.strip()) titleToken = nltk.word_tokenize(title.lower(), language='english') domainData[domain] = titleToken except: pass return domainData def get_counts(self, allDomain): """ 返回网站列表各个域名数量 :param allDomain: 网站列表 :return: 网站:数量 """ counts = defaultdict(int) for eachDomain in allDomain: counts[eachDomain] += 1 return counts if __name__ == '__main__': # allQuery = ["National Sales Company, Inc.", "Decor Music Inc.","Fujian Xishi Co., Ltd","Kiho USA Inc.","BusinessPartner Co.,ltd","BENKAI Co.,Ltd"] # GOLD INC 18245 E 40TH AVE AURORA CO 80011 US allQuery = ["ALZARKI INTERNATIONAL"] website = Website(engine='google') for query in allQuery: time.sleep(2) website = website.get_web(query=query) print(website)计算余弦相似度代码
# -*-coding:utf-8-*- # script: CosineSimilarity.py __author__ = 'howie' import numpy as np from functools import reduce from math import sqrt class CosineSimilarity(object): """ 余弦相似性计算相似度 """ def __init__(self, initQuery, domainData): self.title = initQuery self.data = domainData def create_vector(self): """ 创建单词向量 :return: wordVector = {} 目标标题以及各个网站标题对应的单词向量 """ wordVector = {} for web, value in self.data.items(): wordVector[web] = [] titleVector, valueVector = [], [] allWord = set(self.title + value) for eachWord in allWord: titleNum = self.title.count(eachWord) valueNum = value.count(eachWord) titleVector.append(titleNum) valueVector.append(valueNum) wordVector[web].append(titleVector) wordVector[web].append(valueVector) return wordVector def calculate(self, wordVector): """ 计算余弦相似度 :param wordVector: wordVector = {} 目标标题以及各个网站标题对应的单词向量 :return: 返回各个网站相似度值 """ resultDic = {} for web, value in wordVector.items(): valueArr = np.array(value) # 余弦相似性 squares = [] numerator = reduce(lambda x, y: x + y, valueArr[0] * valueArr[1]) square_title, square_data = 0.0, 0.0 for num in range(len(valueArr[0])): square_title += pow(valueArr[0][num], 2) square_data += pow(valueArr[1][num], 2) squares.append(sqrt(square_title)) squares.append(sqrt(square_data)) sum_of_squares = reduce(lambda x, y: x * y, squares) resultDic[web] = numerator / sum_of_squares return resultDic def get_website(self, resultDic): """ 获取最可能是官网的网站 :param resultDic: 各个网站相似度值 :return: 最可能的网站 也可能为空 """ website = '' largest = max(zip(resultDic.values(), resultDic.keys())) if largest[0]: website = largest[1] # 当相似度为0 else: websites = [key for key, values in resultDic.items() if values == 0.0] for eachWebsite in websites: keyword = ','.join(self.data[eachWebsite]).lower() if 'home' in keyword or "welcome" in keyword: website = eachWebsite return website至此,若有更好的解决方案,欢迎赐教,谢谢。
作者:howie6879
链接:https://www.jianshu.com/p/d1cf6c6df6bb



