ARMENTACIÓN DE URL de la URL acortada obtenida de Tweet -- python campo con multithreading campo con python-2.x campo con url campo con pandas camp codereview Relacionados El problema

Expanding url from shortened url obtained from tweet


6
vote

problema

Español

Tengo un conjunto de datos de Twitter. He extraído todas las URL expandidas del JSON y ahora estoy tratando de resolver los acortados. Además, necesito verificar qué URL siguen trabajando y solo mantén esos.

Estoy analizando más de 5 millones de URL. El problema es que el código a continuación es lento. ¿Alguien puede sugerir cómo hacerlo más rápido? ¿Hay una mejor manera de hacer esto?

  import csv import pandas as pd from urllib2 import urlopen import urllib2 import threading import time    def urlResolution(url,tweetId,w):      try:          print "Entered Function"         print "Original Url:",url          hdr = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',        'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',        'Accept-Encoding': 'none',        'Accept-Language': 'en-US,en;q=0.8',        'Connection': 'keep-alive'}          #header has been added since some sites give an error otherwise         req = urllib2.Request(url, headers=hdr)         temp = urlopen(req)         newUrl = temp.geturl()         print "Resolved Url:",newUrl         if newUrl!= 'None':             print "in if condition"             w.writerow([tweetId,newUrl])      except Exception,e:         print "Throwing exception"         print str(e)         return None   def urlResolver(urlFile):     df=pd.read_csv(urlFile, delimiter=" ")      df['Url']     df2 = df[["Tweet ID","Url"]].copy()     start = time.time()      df3 = df2[df2.Url!="None"]      list_url = []     n=0     w = csv.writer(open("OUTPUT_FILE.tsv", "w"), delimiter = ' ')         w.writerow(["Tweet ID","Url"])      maxC = 0     while maxC < df3.shape[0]:         #creates threads         #only 40 threads are created at a time, since for large number of threads it gives <too many open files> error         threads = [threading.Thread(target=urlResolution, args=(df3.iloc[n]['Url'],df3.iloc[n]['Tweet ID'],w)) for n in range(maxC,maxC+40)]           for thread in threads:                 thread.start()         for thread in threads:                 thread.join()         if maxC+40 >= df3.shape[0]:             threads = [threading.Thread(target=urlResolution, args=(df3.iloc[n]['Url'],df3.iloc[n]['Tweet ID'],w)) for n in range(maxC,df3.shape[0])]                      print "threads complete"                     for thread in threads:                             thread.start()                     for thread in threads:                             thread.join()                break         maxC = maxC + 40     print "Elapsed Time: %s" % (time.time() - start)      w.close()     if __name__ == '__main__':     df3 = urlResolver("INPUT_FILE.tsv")   
Original en ingles

I have a twitter data set. I have extracted all the expanded urls from the json and now am trying to resolve the shortened ones. Also, I need to check which urls are still working and only keep those.

I am parsing over 5 million urls. The problem is that the code below is slow. Can anyone suggest how to make it faster? Is there a better way to do this?

import csv import pandas as pd from urllib2 import urlopen import urllib2 import threading import time    def urlResolution(url,tweetId,w):      try:          print "Entered Function"         print "Original Url:",url          hdr = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',        'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',        'Accept-Encoding': 'none',        'Accept-Language': 'en-US,en;q=0.8',        'Connection': 'keep-alive'}          #header has been added since some sites give an error otherwise         req = urllib2.Request(url, headers=hdr)         temp = urlopen(req)         newUrl = temp.geturl()         print "Resolved Url:",newUrl         if newUrl!= 'None':             print "in if condition"             w.writerow([tweetId,newUrl])      except Exception,e:         print "Throwing exception"         print str(e)         return None   def urlResolver(urlFile):     df=pd.read_csv(urlFile, delimiter="\t")      df['Url']     df2 = df[["Tweet ID","Url"]].copy()     start = time.time()      df3 = df2[df2.Url!="None"]      list_url = []     n=0     w = csv.writer(open("OUTPUT_FILE.tsv", "w"), delimiter = '\t')         w.writerow(["Tweet ID","Url"])      maxC = 0     while maxC < df3.shape[0]:         #creates threads         #only 40 threads are created at a time, since for large number of threads it gives <too many open files> error         threads = [threading.Thread(target=urlResolution, args=(df3.iloc[n]['Url'],df3.iloc[n]['Tweet ID'],w)) for n in range(maxC,maxC+40)]           for thread in threads:                 thread.start()         for thread in threads:                 thread.join()         if maxC+40 >= df3.shape[0]:             threads = [threading.Thread(target=urlResolution, args=(df3.iloc[n]['Url'],df3.iloc[n]['Tweet ID'],w)) for n in range(maxC,df3.shape[0])]                      print "threads complete"                     for thread in threads:                             thread.start()                     for thread in threads:                             thread.join()                break         maxC = maxC + 40     print "Elapsed Time: %s" % (time.time() - start)      w.close()     if __name__ == '__main__':     df3 = urlResolver("INPUT_FILE.tsv") 
              
 
 

Lista de respuestas

2
 
vote

Pareja Cosas que intentaría:

  • Cambiar a pip4 Módulo Reutilizando el pip5 Para dejarlo reutilizar la misma conexión TCP:

    .. Si está haciendo varias solicitudes al mismo host, el TCP subyacente se reutilizará la conexión, lo que puede resultar en una importante Aumento de rendimiento

  • Usa la " "Método HTTP (en caso de pip6 puede necesitar el pip7 )

  • Pruébalo pip8 Marco de raspado web que es de un naturaleza asíncrona y se basa en el 99887776655443319 biblioteca de red. También movería la parte de salida CSV a una Pipipar de salida .
  • Otra cosa para probar es usar el pip install num2words 0 biblioteca ( pip install num2words 1 en pip install num2words 2 )

Algunas ideas de micro optimización:

  • Mover el pip install num2words 3 Definición de diccionario al nivel del módulo Para evitar redefinirlo cada vez pip install num2words 4 se llama (y, dado que es un uso en mayúsculas de uso constante; y elija Un nombre de variable más legible - 99887766555443325 ?)
 

Couple things I'd try:

  • switch to requests module reusing the requests.Session() to let it reuse the same TCP connection:

    ..if you're making several requests to the same host, the underlying TCP connection will be reused, which can result in a significant performance increase

  • use the "HEAD" HTTP method (in case of requests you may need the allow_redirects=True)

  • try out Scrapy web-scraping framework which is of an asynchronous nature and is based on the twisted network library. You would also move the CSV output part to an output pipeline.
  • another thing to try is use the grequests library (requests on gevent)

Some micro-optimization ideas:

  • move the hdr dictionary definition to the module level to avoid redefining it every time urlResolution() is called (and, since it is a constant use upper-case; and pick a more readable variable name - HEADERS?)
 
 

Relacionados problema

7  Salida de parcelas de dispersión [cerrada]  ( Outputting scatter plots ) 
cerrado. Esta pregunta es off-topic . Actualmente no está aceptando respuestas. ¿Quieres ...

5  Automatizar un conjunto A de informes semanales, incluidos los gráficos y la entrega de informes  ( Automating a set a of weekly reports including graphs and delivery of reports ) 
He estado escribiendo código para automatizar algunos informes semanales. Tuve Ayuda sobre el desbordamiento de la pila . Tengo código que funciona en su may...

4  Cuentos acumulativos de artículos en un marco de datos Panda  ( Cumulative counts of items in a pandas dataframe ) 
Estoy usando un conteo de datos lleno de encabezados / nombres de campo para desarrollar un esquema y necesito valores únicos para cada encabezado, pero cada ...

7  La forma más rápida de escribir un archivo CSV grande en Python  ( Fastest way to write large csv file in python ) 
Soy bastante nuevo para Python y Pandas, pero tratando de mejorar con él para analizar y procesar archivos de datos grandes. Actualmente estoy trabajando en u...

2  K_nearest_neighbors desde cero [cerrado]  ( K nearest neighbors from scratch ) 
cerrado. Esta pregunta es off-topic . Actualmente no está aceptando respuestas. ¿Quieres ...

0  Manipulando los cuadros de datos en Pandas  ( Manipulating dataframes on pandas ) 
Recientemente no pudo finalizar un código para una entrevista de trabajo. Uno de los problemas es que decidí usar Pandas (tenía sentido), pero no estaba famil...

10  Tkinter GUI por hacer ediciones muy simples a Pandas DataFrames  ( Tkinter gui for making very simple edits to pandas dataframes ) 
Es parte de una aplicación separada que permite a los usuarios interactuar muy libremente con diferentes bases de datos y verificar los posibles errores y rea...

6  Valores coincidentes de la tabla HTML para actualizar los valores en Pandas DataFrame  ( Matching values from html table for updating values in pandas dataframe ) 
Esto es más un ejercicio para que me utilice a Pandas y sus cuadros de datos. Para aquellos que no escucharon de él: Panda es un paquete de Python que prop...

2  Regresión en Pandas DataFrame  ( Regression on pandas dataframe ) 
Estoy trabajando en la siguiente tarea y estoy un poco perdido: construir un modelo de regresión que predecirá la puntuación de calificación de cada Prod...

8  Python CSV a XML Converter  ( Python csv to xml converter ) 
Estoy creando una aplicación que se lee en los datos de un archivo CSV y crea un archivo XML usando LXML. El siguiente código funciona como se esperaba. Sin e...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos