2015-11-08 44 views
11

我有很多來自不同來源的設備名稱和製造商名單。我正在尋找一種編程方式(可能是api)來確定哪些設備是手機,哪些是平板電腦,哪些是其他設備(例如計算機)。按品牌名稱獲取設備類型(手機/平板電腦/其他)

我搜索了網頁,我只能找到WURFL API,這很不錯,但它不能僅通過名稱來確定設備。

設備的一些示例(名稱,生產):

的Galaxy Note 3,三星

MID-97D,上網本

感謝您的幫助!

編輯

所有的答案都非常好。如果我能分裂獎金,我會這樣做。

我選擇給GSMArena的答案,因爲它是最有用和最實用的答案。

謝謝大家!

+3

GSMArena可能有幫助嗎? http://www.codeproject.com/Articles/660151/Screen-scraping-using-YQL-and-AJAX – Oli

回答

2

搜索和谷歌上搜索了一陣後,我遇到了一個叫GSMArena網站。現在,該網站是用於手機和平板電腦的比較網站,您基本上可以看到平板電腦/手機的所有規格。查看搜索頁面的源代碼,我發現有一個包含所有搜索結果的類「maker」的div。

此外,一旦您點擊手機/平板電腦鏈接,它會將您帶到標題爲「平板電腦名稱 - 完整平板電腦規格」的頁面(如果其選項卡),以及「移動設備名稱 - 完整手機規格」(如果它是移動設備)。

如果發現與搜索查詢直接匹配,它會直接重定向到規範頁面,所以我添加了一個If測試以檢查它是否爲搜索頁面或規範頁面。

我的程序獲取「製造商」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。

+0

我已經考慮過了,但沒有足夠的時間來調查網站。非常有用,謝謝! – matan7890

+0

不客氣!那麼這是您尋找的解決方案嗎? –

+0

可能是的,但其他答案(特別是@Benjamin Gruenbaum的)也很好。我不確定誰應該給予獎勵。 – matan7890

1

以下方法應該可行,但需要一些編程:

  1. 要嘗試進行分類每個設備類型名稱創建同義詞組(例如:[手機;手機],[平板電腦,PAD])
  2. 使用Google Search REST API得到您的設備名稱搜索結果(更專業化,網絡零售商API可以用來代替)
  3. 使用regular expressions計算在特定羣體中針​​對每個同義詞搜索結果匹配的數量
  4. 具有最高總匹配數的所有同義詞的組代表您的設備類型
  5. 如果找不到匹配項,則應將設備類型歸類爲「其他」。爲防止錯誤匹配作爲目標羣體之一,可以設置最少匹配次數,以確保「其他」設備不會誤輸入「平板電腦」或「手機」。我認爲正則表達式檢查將針對多個搜索結果項一次

的主要優點是,你的結果將始終保持最新,並在世界上最好的搜索引擎支持下進行。至於缺點,如果您將免費使用Google API,他們將限制每天的允許請求數量(可增加費用)。還有些放緩可能需要的「其他」設備,以確保您的分類程序正常工作

該方法的潛在大致可開發之前就在谷歌進入樣本設備名稱,並在尋找搜索結果估計。如果它們包含「丟失」的設備類型,那麼值得嘗試實現這一點。

由於Google API對商業用途有嚴格的費率限制和限制,因此您可以考慮改用其他搜索引擎。雅虎,其中allows commercial use,如果你通知他們,並在這種情況下他們有高利率限制。

+0

已經嘗試過,但谷歌政策不允許使用他們的服務,因爲沒有真正的搜索查詢結束用戶。一旦我嘗試以編程方式使用他們的服務,他們實際上暫時禁止了我。 – matan7890

+1

您可以考慮改用其他搜索引擎,例如雅虎,允許商業用途,如果你通知他們,並在這種情況下他們有高費率限制,請參閱https://developer.yahoo.com/yql/guide/usage_info_limits.html –

7

我建議一個更簡單的方法。無論何時使用設備進行無線通信,都必須經過認證。在美國 - 這就是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

還可以查詢像eBay和亞馬遜的API。

+0

FCC提供了一個有趣的API,但FCC API不似乎會返回提供的搜索查詢示例的任何結果,因此您需要設備的確切名稱才能獲得結果。此外,即使API返回某些查詢的結果,設備的類型始終爲「Mobile」,因此無法說明它是平板電腦還是手機。問題是如何識別設備類型,而不是製造商。 –

+0

這個API似乎很不錯,雖然當我搜索例如「Nexus 7」時,我沒有找到任何結果。所以它似乎並不完整,但非常有用。另外,我很高興聽到您提到的其他API。謝謝! – matan7890

2

我使用的是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); 
+0

這是一個比公認的答案更簡潔的解決方案。免費套餐允許每月點擊20000次。 – dspringate

相關問題