2016-05-11 3 views
1

Angenommen, ich habe diese TSV filePython & BigData. Alternative zu user_agents (funktioniert wirklich langsam mit großen Datensätzen)?

Es sieht aus wie:

status=200 protocol=http region_name=Podolsk datetime=2016-03-10 15:51:58 user_ip=0.120.81.243 user_agent=Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36 user_id=7885299833141807155 user_vhost=tindex.ru method=GET page=/search/ 

und ich brauche zu extrahieren Benutzer-Browser und OS Nutzungsstatistiken. Hier ist der Code, der nur in Ordnung, außer, dass es funktioniert wirklich langsam:

from ua_parser import user_agent_parser 
import user_agents 
dict0 = {} 
def grep(filename, pattern): 
    for n,line in enumerate(open(filename)): 
     ua_start = line.find(pattern) + len(pattern) 
     ua_end = line.find('\t', ua_start) 
     ua = str(user_agents.parse(line[ua_start:ua_end]).browser.family) 
     try: 
      dict0[ua] += 1 
     except KeyError: 
      dict0[ua] = 1 

grep('data/data.tsv', 'user_agent=') 

Es gibt mir eine nette Idee von Statistiken in einem Wörterbuch, das wie folgt aussehen:

{'Android': 10890, 
'Apache-HttpClient': 59, 
'Avant': 21, 
'BlackBerry WebKit': 16, 
'CFNetwork': 301, 
'Chrome': 20963, 
'Chrome Mobile': 1442, 
'Chrome Mobile iOS': 69, 
'Chromium': 290, 
'Dolfin': 34, 
'Edge': 872, 
'Edge Mobile': 12, 
'Epiphany': 1, 
'Firefox': 9757, 
'Firefox Beta': 4, 
'Firefox Mobile': 22, 
'Firefox iOS': 1, 
'Galeon': 1, 
'Googlebot': 1, 
'IE': 5399, 
'IE Large Screen': 4, 
'IE Mobile': 340, 
'Iceweasel': 12, 
'Iron': 7, 
'Jasmine': 3, 
'Mail.ru Chromium Browser': 649, 
'Maxthon': 137, 
'Midori': 1, 
'Mobile Safari': 2778, 
'Mobile Safari UI/WKWebView': 51, 
'Nokia Browser': 14, 
'Nokia OSS Browser': 1, 
'Obigo': 2, 
'Opera': 10652, 
'Opera Coast': 2, 
'Opera Mini': 675, 
'Opera Mobile': 299, 
'Opera Tablet': 25, 
'Other': 13424, 
'PhantomJS': 11, 
'Pinterest': 1, 
'Puffin': 25, 
'Python Requests': 39, 
'Python-urllib': 9, 
'QQ Browser Mobile': 3, 
'Safari': 255, 
'Samsung Internet': 522, 
'SeaMonkey': 1, 
'Sogou Explorer': 2, 
'Spider': 17, 
'UC Browser': 528, 
'Vivaldi': 7, 
'WebKit Nightly': 104, 
'Yandex Browser': 19969, 
'YandexBot': 86, 
'YandexDirect': 2, 
'YandexMobileBot': 1, 
'YandexSearch': 2601} 

Die Komponente, die wirklich langsam ist hier die user_agents Sache selbst. Ich bin nicht wirklich an die user_agents-Bibliothek gebunden oder an die Art, wie ich die Ergebnisse speichere. Wenn Sie irgendwelche Ideen haben, wie Sie die Verarbeitungsgeschwindigkeit verbessern können, sind Sie willkommen.

Antwort

1

Eigentlich habe ich eine schöne Art und Weise, dass eine große Verbesserung der Geschwindigkeit machen könnte! Grundsätzlich fügen wir zuerst user_agent = Zeilen zum Wörterbuch hinzu und zählen sie. Dann parsen wir Schlüssel zu user_agents und zählen Werte!

from ua_parser import user_agent_parser 
parsing_dict = {} 
os_stats = {} 
browser_stats = {} 
target = 'tindex.ru' 
def grep(filename, pattern): 
    def parse_ua(ua): 
      p = ua_parser.user_agent_parser.Parse(ua) 
      return [p.get('os').get('family'), p.get('user_agent').get('family')] 

    for n,line in enumerate(open(filename)): 
     if target in line: 
      ua_start = line.find(pattern) + len(pattern) 
      ua_end = line.find('\t', ua_start) 
      ua = line[ua_start:ua_end] 
      try: 
       parsing_dict[ua] += 1 
      except KeyError: 
       parsing_dict[ua] = 1 

    for key, value in parsing_dict.iteritems(): 
     ua = parse_ua(key) 
     try: 
       os_stats[ua[0]] += value 
       browser_stats[ua[1]] += value 
     except KeyError: 
       os_stats[ua[0]] = value 
       browser_stats[ua[1]] = value 
grep('data/data.tsv', 'user_agent=') 
0

Sie die Regex verwenden können:

/user_agent=(.*) user_id/

enter image description here

0

I verwendet, um die PyWurfl Bibliothek, die mit dem Geräte-Mapping Useragents, OS und andere solche Informationen zur Verfügung stellt.

Es erfordert, dass wir die neueste wurfl.xml Datei herunterladen und verwenden Sie dann wurfl2python.py Datei die Daten an einen Python-Objekt zu konvertieren. Um die Leistung zu verbessern, können Sie dies ein wenig optimieren.

Was können Sie tun, vorausgesetzt die neuesten wurfl.xml Daten geladen werden durch die Bibliothek (in herkömmlicher Weise zum ersten Mal) und dann diese konvertieren zu sagen, csv Format. Laden Sie dann den Inhalt der csv-Datei in den Speicher (als Wörterbuchobjekt). Dann habe ich für meine Anforderung Spark-Jobs verwendet, um die Daten zu verarbeiten, indem dieses Wörterbuch-Objekt über die Knoten gesendet wird.