问题 按品牌名称获取设备类型(手机/平板电脑/其他)


我从各种来源获得了很多设备名称和制造商。我正在寻找一种程序化方式(可能是api)来确定哪些设备是手机,哪些是平板电脑,哪些是其他设备(例如计算机)。

我在网上搜索,我只能找到 WURFL API非常好,但它无法仅通过其名称来确定设备。

设备的一些示例(名称,制造商):

Galaxy Note 3,三星

MID-97D,上网本

谢谢您的帮助!

编辑

所有答案都非常好。如果我能分开赏金,我会做到这一点。

我选择给予GSMArena答案的赏金,因为它是最有用和最实用的答案。

感谢大家!


4991
2017-11-08 17:10


起源

GSMArena可能有帮助吗? codeproject.com/Articles/660151/... - Oli


答案:


经过一段时间的搜索和谷歌搜索后,我遇到了一个名为的网站 GSMArena。现在该网站是手机和平板电脑的比较网站,你基本上可以看到平板电脑/手机的所有规格。查看搜索页面的源代码,我发现有一个包含所有搜索结果的“制造者”类的div。

此外,一旦您点击手机/平板电脑链接,它就会转到标题为“平板电脑名称 - 完整平板电脑规格”(如果是标签)的页面,以及“移动电话名称 - 完整电话规格”(如果它是移动电话)。

如果它找到与搜索查询的直接匹配,它会直接重定向到规范页面,所以我添加了一个If测试来检查它是否是搜索页面或spec页面。

我的程序获取“maker”div中的第一个链接(使用 BeautifulSoup)然后转到链接,拉出html,然后获取页面的标题。

如果没有找到结果,我的程序将其标记为“其他”

码:

import urllib.request
from bs4 import BeautifulSoup
searchlist = ["galaxy note","nexus 10","nexus 5","galaxy ace","moto g","galaxy tab 2", "MID-97D"]
for searchstr in searchlist:
    other = False
    searchstr = searchstr.replace(" ", "%20")
    searchlink = "http://www.gsmarena.com/results.php3?sQuickSearch=yes&sName="+searchstr
    string = urllib.request.urlopen(searchlink).read().decode("ISO-8859-1")
    soup = BeautifulSoup(string,"lxml")
    if soup.title.string == "Phone Finder results - GSMArena.com":
        makerdiv = soup.find_all('div', attrs={'class': 'makers'})
        links = makerdiv[0].find_all('a')
        if len(links) != 0:
            link = "http://www.gsmarena.com/" + links[0].attrs['href']
            string = urllib.request.urlopen(link).read().decode("ISO-8859-1")
            soup = BeautifulSoup(string,"lxml")
        else:
            other = True
    if other == False:
        title = soup.title.string
        name = title.split("-")[0]
        rest = title.split("-")[1]
        taborphone = rest.split(" ")[2]
    else:
        name = searchstr
        taborphone = "other"
    print("Name:",name)
    print("Type:",taborphone)

输出:

Name: Samsung Galaxy Note5 
Type: phone
Name: Samsung Google Nexus 10 P8110 
Type: tablet
Name: LG Nexus 5X 
Type: phone
Name: Samsung Galaxy Ace 3 
Type: phone
Name: Motorola Moto G (3rd gen) 
Type: phone
Name: Samsung Galaxy Tab 2 7.0 P3100 
Type: tablet
Name: MID-97D
Type: other

它的工作原理:)

优点:

数据库将始终保持更新,GSMArena在其数据库中有许多手机和平板电脑

缺点:

它不能用于平板电脑和手机以外的设备,如上网本等。

我刚注意到@Oli在评论中提出了GSMArena。


2
2017-11-18 09:06



我已经考虑过但没有时间调查该网站。非常有用,谢谢! - matan7890
不用谢!那么这是您正在寻找的解决方案吗? - Divyanshu Kalra
可能是的,但其他答案(特别是@Benjamin Gruenbaum的答案)也非常好。我不确定是谁应该给予赏金。 - matan7890
问题的关键在于对设备进行分类,正如您所指出的,尽管FCC是一个绝妙的主意,它无法告诉您它是什么类型的设备...... - Divyanshu Kalra


我建议采用一种更简单的方法。每当设备用于无线通信时,都必须进行认证。在美国 - 这就是FCC。

他们有一个API:

https://data.fcc.gov:443/api/accessibilityclearinghouse/product/searchProducts?api_key=23232323&format=json&rowPerPage=20&searchString=galaxy%20s4

这很乐意回归:

  "maker": "Samsung",

在这里看到: https://ach.fcc.gov/for-developers//#!/API/product_searchProducts_get

您还可以查询eis,如eBay和亚马逊。


7
2017-11-14 00:07



FCC提供了一个有趣的API,但FCC API似乎没有返回任何提供搜索查询示例的结果,因此您需要设备的确切名称才能获得结果。即使API返回某些查询的结果,设备的类型也总是“移动”,因此无法确定它是平板电脑还是手机。问题是如何识别设备类型,而不是制造商。 - Alex Paliarush
这个api似乎相当不错,虽然当我搜索例如“Nexus 7”时我没有找到任何结果。所以它似乎不完整,但非常有用。另外,我很高兴听到您提到的其他API。谢谢! - matan7890


我在用 http://www.handsetdetection.com/ API付费版本,可提供准确的结果。他们有免费试用版选项进行测试。

$referer_site = $_SERVER['HTTP_REFERER'];
$useragent = $_SERVER['HTTP_USER_AGENT']; //"NokiaN95";//
$curlOpts = array(
CURLOPT_URL => "http://api.handsetdetection.com/apiv3/site/detect/xxxxx.json",     
CURLOPT_RETURNTRANSFER => true,    
CURLOPT_HTTPAUTH => CURLAUTH_DIGEST, 
CURLOPT_USERPWD => 'xxxxxxxx:xxxxxxxxx',
CURLOPT_HTTPHEADER => array('Content-Type:application/json'),
CURLOPT_POSTFIELDS => '{"user-agent":"'.$useragent.'"}');
/******************************************/

$curl = curl_init();
curl_setopt_array($curl, $curlOpts);
$responseBody = curl_exec($curl);
$jsonObj = json_decode($responseBody);
curl_close($curl);


$device_details = json_decode($responseBody);

2
2017-11-17 06:23



这是一个比接受的答案更简洁的解决方案。免费套餐允许每月20000次点击。 - dspringate


以下方法应该有效,但需要一些编程:

  1. 为您尝试分类的每个设备类型名称创建同义词组(例如[手机;手机],[平板电脑;手柄])
  2. 使用 Google搜索REST API 获取设备名称的搜索结果(更专业,可以使用互联网零售商API)
  3. 使用 常用表达 根据特定组中的每个同义词计算搜索结果中的匹配数
  4. 所有同义词的总匹配计数最高的组代表您的设备类型
  5. 如果未找到匹配项,则设备类型应归类为“其他”。为了防止误报匹配作为目标群体之一,可以设置最小匹配数量,以确保“其他”设备未被错误地放入“平板电脑”或“手机”。我假设将立即对多个搜索结果项执行正则表达式检查

主要优点是您的结果将始终是最新的,并得到世界上最好的搜索引擎的支持。

至于缺点,如果您将免费使用Google API,他们将限制每天允许的请求数量(可以增加费用)。此外,“其他”设备可能需要进行一些审核,以确保您的分类程序正常运行

通过在谷歌中输入样本设备名称并查看搜索结果,可以在开发之前粗略估计方法潜力。如果它们包含“缺失”的设备类型,那么值得尝试实现它。

由于Google API对商业用途有严格的速率限制和限制,因此您可以考虑使用其他搜索引擎,例如:雅虎,哪个 允许商业用途 如果你通知他们,他们在这种情况下有很高的费率限制。


1
2017-11-13 23:22



已经尝试过,但谷歌政策不允许将他们的服务用于最终用户的真实搜索查询。一旦我尝试以编程方式使用他们的服务,他们实际上已经暂时禁止了我。 - matan7890
您可以考虑使用其他搜索引擎,例如雅虎,如果你通知他们允许商业用途,并且他们在这种情况下有很高的费率限制,请参阅 developer.yahoo.com/yql/guide/usage_info_limits.html - Alex Paliarush