Categories
SEO

Cómo usar Python para analizar los archivos de registro del servidor PIVOT para SEO

Los datos de rastreo de motores de búsqueda encontrados dentro de los archivos de registro son una fuente fantástica de información para cualquier profesional de SEO.

Por Analizar los archivos de registro , puede obtener una comprensión de cómo los motores de búsqueda son Crawling e interpretación de su sitio web: la claridad, simplemente no puede obtener al confiar en las herramientas de terceros.

Esto le permitirá:

Validar sus teorías al proporcionar evidencia indiscutible de cómo se comportan los motores de búsqueda. Prioriza su hallazgos al ayudarlo a comprender la escala de un problema y el probable impacto de la fijación. Cuestiones adicionales que no son visibles al usar otras fuentes de datos.

Pero a pesar de la multitud de beneficios, los datos del archivo de registro no se utilizan Con frecuencia como debería ser. Las razones son comprensibles:

Acceso a la DATA generalmente implica pasar por un equipo de desarrollo, que puede tomar TIEMPO . Los archivos crudos pueden ser enormes y proporcionados en un formato hostil, por lo que analiza los datos esfuerzos .Tools diseñados para hacer Es posible que el proceso sea más fácil antes de que se puedan integrarse antes de que los datos se puedan canalizarlos, y los los costos pueden ser prohibitivos. ADVERTISIONEMENTETINA LECTURA A continuación

Todas estas cuestiones son barreras perfectamente válidas para la entrada, pero no Tener que ser insuperables.

Con un poco de conocimiento de codificación básica, puede automatizar todo el proceso. Eso es exactamente lo que vamos a hacer en esta lección paso a paso sobre el uso de Python para analizar los registros del servidor para SEO.

Encontrará un script para comenzar, también.

Consideraciones iniciales

Uno de los chalecos más grandesLos archivos de archivo de registro de anuncios de análisis son el número puro de formatos potenciales. Apache , Nginx , y IIS

ofrecen un rango de opciones diferentes y permite a los usuarios personalizar los puntos de datos devueltos.

para complicar aún más las cuestiones Muchos sitios web ahora utilizan proveedores de CDN

como CloudFlare, Cloodfront y Akamai para servir contenido de la ubicación de borde más cercano a un usuario. Cada uno de estos tiene sus propios formatos, también.

Se centraremos en el formato de registro combinado

para esta publicación, ya que este es el valor predeterminado para NGINX y una opción común en los servidores de Apache .

AnunciCementContinue Lectura a continuación

Si no está seguro de qué tipo de formato está tratando, los servicios como BURTEDW con y WAPPALYZER proporcionan información excelente sobre la pila de tecnología de un sitio web. TOye, puede ayudarlo a determinar esto si no tiene acceso directo a un interesado técnico.

¿Todavía no es más sabio? Intente abrir uno de los archivos RAW.

A menudo, los comentarios se proporcionan información sobre los campos específicos, que luego se pueden referenciar a los referencias cruzadas.

   

#fields: Time C-IP CS-Método CS-URI-STEM SC-Status CS-versión

17:42:15 172.16.255.255 Obtenga /default.htm 200 http / 1.0

Otra consideración es qué motores de búsqueda queremos incluir , ya que esto deberá ser factorizado en nuestro filtrado y validación iniciales. Para simplificar las cosas, nos centraremos en Google, dada su participación de mercado dominante

88%

.

Vamos a empezar.

1. Identifique los archivos y determinar los formatos

para realizar un análisis de SEO significativo, queremos un mínimode las solicitudes de ~ 100k y de 2 a 4 semanas de datos para el sitio promedio.

Debido a los tamaños de archivos involucrados, los registros generalmente se dividen en días individuales. Está virtualmente garantizado que recibirá múltiples archivos para procesar. A medida que no sabemos cuántos archivos con los que nos trataremos a menos que los combinen antes de ejecutar el script, un primer paso importante es generar Una lista de todos los archivos en nuestra carpeta utilizando el módulo

Glob

.

 Esto nos permite devolver cualquier archivo que coincide con un patrón que especifiquemos. Como ejemplo, el siguiente código coincidiría con cualquier archivo TXT. 

Importar globfiles = glob.glob (‘*. TXT’)

Los archivos de registro se pueden proporcionar en una variedad de formatos de archivo, Sin embargo, no solo TXT.

De hecho, a veces la extensión del archivo puede no ser una que reconoceIZE. Aquí hay un archivo de registro en bruto del servicio de entrega de registros de Akamai, que ilustra esto perfectamente:

BOT_LOG_100011.ESW3C_WAF_202160250000-2000-41

Además, es posible que los archivos recibidos se dividan en múltiples subcarpetas , y no queremos perder el tiempo copiando estos en una ubicación singular.

 Afortunadamente, Glob apoya tanto las búsquedas recursivas como los operadores de comodines. Esto significa que podemos generar una lista de todos los archivos dentro de una subcarpeta o subcarpetas infantiles. 

advertisementcontinue leyendo a continuación

archivos = glob.glob (‘** / *. *’, Recursivo = verdadero) A continuación, queremos identificar qué tipos de archivos están dentro de nuestra lista. Para hacer esto, se puede detectar el tipo MIME

del archivo específico. Esto nos dirá exactamente qué tipo de archivo estamos tratandocon, independientemente de la extensión.

 Esto se puede lograr usando Python-Magic, una envoltura alrededor de la biblioteca Libmagic C, y creando una función simple. 
 Pip Instale Python-MagicPip Instale libmagic 

Importar MagicDef File_Type (File_Path): mime = magic.from_file (file_path, mime = true) Mime

La comprensión de la lista

 se puede usar para bucle a través de nuestros archivos y Aplique la función, creando un diccionario para almacenar los nombres y los tipos. 

FILE_TYPES = [FILE_TYPE (archivo) para Archivos] File_DICT = DICT (ZIP (archivos, File_Types))

Finalmente, una función y un

, mientras que el bucle 

para extraer una lista de archivos que devuelven un tipo MIME de texto / liso y excluir cualquier otra cosa.

File identification. Sin comprimir = [] definir file_identifier (archivo): Para clave, valoren File_Dict.items (): Si el archivo en valor: sin comprimir. Append (clave) Mientras File_Identifier (‘Texto / Plain’): File_identifier (‘Texto / Plain’) en File_DICT

File identification.

 

 

 

Parsed dataframe.

Parsed dataframe.

 

2. Extraiga las solicitudes de los motores de búsqueda

Después de filtrar los archivos en nuestra (s) carpeta (s), el siguiente paso es filtrar los archivos en sí solo extraer las solicitudes que nos preocupan.

AnunciCementContinue leyendo a continuación
Esto elimina la necesidad de combinar los archivos utilizando utilidades de la línea de comandos como Log validation command line. GREP

o Findstr Log validation command line., lo que guarda una inevitable búsqueda de 5 a 10 minutos a través de pestañas y marcadores de portátiles abiertos para encontrar el comando correcto.

En este caso, como solo queremos solicitudes de GoogleBot, buscar ‘GoogleBot’ coincidirá con todo el

Agente de usuario relevantes

.

Podemos usar la función abierta de Python para leer y escribir nuestro módulo Rogex de archivos y Python, Re, para realizar la búsqueda. Importar Repletern = ‘GoogleBot’New_File = Open (‘./googlebot.txt’, ‘w’, codificación = ‘utf8’) para txt_files en sin comprimir: con abierto (txt_files, ‘r’, codificación = ‘utf8’) como Text_File: para la línea en Text_File: Si re. Búsqueda (patrón, línea): new_file.write (line) REGEX hace que esto sea fácilmente escalable utilizando un o operador.

 Patrón = 'GoogleBot | Bingbot' 

3. Solicitudes de parse

En

Publicación anterior , Hamlet Batista proporcionó una guía sobre cómo usar la RIGEX para analizar las solicitudes.

Como enfoque alternativo, usaremos

Panda

‘Pequeño analizador de CSV incorporado y algunos funciones básicos de procesamiento de datosOns a:

 Coloque las columnas innecesarias.Format, la marca de tiempo. Crea una columna con URLS.Renemos y reordenar las columnas restantes. 

En lugar de codificar un nombre de dominio, se puede usar la función de entrada

Status code pivot.. Para solicitar al usuario y guardar esto como una variable.
AnunciCementContinue Reading a continuación ‘SHODE_URL = ENTRADA (‘Ingrese el dominio completo con protocolo:’) # Obtenga dominio desde el usuario inputdf = pd.read_csv (‘./ googlebot. txt ‘, sep =’ \ s + ‘, error_bad_lines = falso, encabezado = ninguno, low_memory = false) # import importsdf.drop ([1, 2, 4], eje = 1, enlace = true) # caída columnas / caracteres .dff [3] = df [3] .str.replaceplace (‘[‘, ”) # Sello de tiempo dividido en TWODF[[‘FECHA’, ‘TIEMPO’]] = DF [3] .str.split (‘:’ , 1, expand expand = True) DF[[‘Tipo de solicitud’, ‘URI’, ‘Protocolo’]] = df [5] .str.split (”, 2, expand = true) # dividir URI Reqse en columnsdf.drop ([3, 5], eje = 1, enlace = true) df.rename (columnas = {0: ‘IP’, 6: ‘Código de estado’, 7: ‘Bytes’, 8: ‘Remandrador URL ‘, 9:’ Agente de usuario ‘}, enlace = verdadero) #reame columsdf [‘ URL completa ‘] = showing_url + df [‘ uri ‘] # concatenate dominio namedf [‘ fecha ‘] = pd.to_datetime (DF [‘ Fecha ‘]) # Declare los tipos de datos[[‘ código de estado ‘,’ bytes ‘]] = df[[‘ código de estado ‘,’ bytes ‘]]. Aplique (pd.to_numeric) df = df[[‘ fecha ‘, ‘Tiempo’, ‘Solicitud de tipo’, ‘URL completa’, ‘URI’, ‘Código de estado’, ‘Protocolo’, ‘Redrer URL’, ‘Bytes’, ‘Agente de usuario’, ‘ip’]] # reordenar columnas

Status code pivot.

 

4. Validar las solicitudes

Es increíblemente fácil de falsificar los agentes de usuario de los motores de búsqueda, haciendo que la validación de la solicitud sea una parte vital del proceso, no sea que terminemos dibujando conclusiones falsas al analizar nuestros propios rastros de terceros.

 Para hacer esto, vamos a instalar una biblioteca llamada 

dnspython

y realizaremos un DNS inverso. Status code url pivot.
Se pueden usar pandas para soltar IP duplicados y ejecutar las búsqueda de este flujo de datos más pequeño , Antes de volver a aplicar los resultados y filtrar las solicitudes inválidas.

AnunciCementContinue Reading a continuación de DNS Import Resolver, Reversenamedef Reversedns (IP): intente: devolver STR (Resolver.Qery (Reversename.from_Address (IP), ‘PTR ‘) Excepto: return’ n / a’logs_filtered = df.drop_dupplicates ([‘IP’]). Copiar () # Crear DF ​​con IP dupliate filtrado para checklogs_Filtered [‘DNS’] = Logs_Filtered [‘IP’ ]. Aply (Reversedns) # Crear columna DNS con el resumen de DNS de IP inversa_Filtered = DF.Merge (Logs_Filtered[[‘IP’, ‘DNS’]]], cómo = ‘IFT’, ON = [‘IP’]) # Fusion Columna DNS al registro completos coincidencia iPLOGS_FILTERED = Logs_Filtered [Logs_Filtered [‘DNS’]. STR.Contains (‘googlebot.com’)] # Filtro para verificar googlebotlogs_filtered.drop ([‘IP’, ‘DNS’], Axis = 1, Inplace = True) # COUR DNS / IP Columnas Status code url pivot. Este enfoque acelerará drásticamente las búsqueda, validando millones de solicitudes en minutos.

 

En el siguiente ejemplo, se procesaron ~ 4 millones de filas de solicitudes en 26. segundos.

5. Pivote los datos

Después de la validación, nos quedan con un conjunto de datos limpiador y bien formateado y puede comenzar a pinchar estos datos para analizar más fácilmente los puntos de interés de los datos.

En primer lugar, vamos a Comience con alguna agregación simple utilizando los Pandas ‘ Groupby y

AGG

 Funciones para realizar un recuento de la cantidad de solicitudes de diferentes SCódigos de tatus. 

PublicidadContinue Reading a continuación

status_code = logs_filtered.groupby (‘código de estado’). AGG (‘tamaño’)

Para replicar el tipo de conteo que está acostumbrado en Excel, es Vale la pena señalar que necesitamos especificar una función agregada de ‘tamaño’, no ‘cuenta’.

El uso de la función invocará la función todas las columnas

todas las columnas dentro del flujo de datos y los valores nulos se manejan diferente.

Restablecimiento El índice restaurará los encabezados para ambas columnas, y la última columna puede ser renombrada a algo más significativa.

status_code = logs_filtered.groupby (‘código de estado’). Agg (‘tamaño’). Sort_Values ​​(ascendente = falso) .reset_index () status_code.rename (columnas = {0: ‘# solicitudes’}, enlace = true)

para más avanzado Manipulación de datos, pandas inbuilt PIVLas tablas de OT ofrecen una funcionalidad comparable a Excel, lo que hace posible agregaciones complejas con una línea de código singular.

 

 En su nivel más básico, la función requiere un flujo de datos específico y Índice - o índices Si se requiere un múltiples índice, y devuelve los valores correspondientes. 

AnunciCementContinue leyendo a continuación

pd.pivot_table (logs_filtered, índice [‘URL completo’])

para mayor especificidad , los valores requeridos pueden ser declarados y agregados: suma, media, etc. – aplicado utilizando el parámetro AGGFUNC.

También vale la pena mencionar el parámetro de las columnas, lo que nos permite mostrar valores horizontalmente para la salida más clara.

 status_code_url = pd.pivot_table (logs_filtered, índice = ['url completo'], columnas = ['código de estado'], aggfunc = 'tamaño', Fill_Value = 0) <= 1048576:    logs_filtered.to_excel(writer, sheet_name='Master', index=False)else:    logs_filtered.to_csv('./logs_export.csv', index=False)

Aquí hay un ejemplo ligeramente más complejo, que proporciona un recuento de las URL únicas que se arrastran por agente de usuario por día, en lugar de solo un recuento de la cantidad de solicitudes.

user_agent_url = pd.pivot_table (logs_filtered, índice = [‘Agente de usuario’], valores = [‘URL completa’], columnas = [‘fecha’], aggfunc = pd.series.nunique , Fill_Value = 0) Si aún está luchando con la sintaxis, consulte

MITO

. Le permite interactuar con una interfaz visual dentro de Jupyter cuando se usa JUPYTERLAB, pero aún sale el código relevante.
AnunciCementContinue Lectura a continuación log parser animation
Incorporación de rangos

log parser animation Para los puntos de datos como los puntos de datos. Es probable que tengan muchos valores numéricos diferentes, tiene sentido cubrir los datos.

Para hacerlo, podemos definir oUR intervalos dentro de una lista y luego use la función Cortar para ordenar los valores en los contenedores, especificando np.inf para capturar cualquier cosa por encima del valor máximo declarado.

byte_range = [0, 50000, 100000, 200000, 500000, 1000000, NP.inf] bytes_grouped_ranges = (logs_filtered.groupby (pd.cut (logs_filtered [‘bytes’], bins = byte_range, precision = 0)) .agagg (‘tamaño’) .reset_index () ) bytes_grouped_ranges.rename (columnas = {0: ‘# Solicitudes’}, enlace = verdadero) La notación de intervalo se usa dentro de la salida para definir los rangos exactos, por ejemplo,

(50000 100000] (50000 100000] (50000 100000] (50000 100000] (50000 100000]


Los soportes redondos indican cuando un número es no se incluye y se incluye un soporte cuadrado cuando se incluye. Entonces, en el ejemplo anterior, el cubo contiene puntos de datos con un valor de entre 50,001 y 100,000 . 6. Exportación

El paso final en nuestro proceso es exportar nuestros datos de registro y pivots. Para facilitar el análisis, tiene sentido exportarlo a un archivo de Excel (XLSX) en lugar de un CSV. Los archivos XLSX son compatibles con varias hojas, lo que significa que todos los fráguidos de datos se pueden combinar en el mismo archivo.

Esto se puede lograr utilizando para sobresalir . En este caso, también se debe especificar un objeto de ExcelWiter porque se agrega más de una hoja en el mismo libro en el mismo libro. AnunciCementContinue leyendo a continuación Writer = PD.Excelwriter (‘logs_export.xlsx ‘, motor =’ xlsxwriter ‘, DateTime_Format =’ DD / MM / YYAY ‘, opciones = {‘ strings_to_urls ‘: falso}) logs_filtered.to_excel (escritor, sheet_name =’ master ‘, index = false) pivot1.to_excel (escritor, escritor, Shee_name = ‘My Pivot’) Writer.Save () Cuando exportanGA Gran cantidad de pivotes, ayuda a simplificar las cosas almacenando los marcadores de datos y los nombres de las hojas en un diccionario y usando A para el bucle. Hoja_names = {‘Códigos de estado de solicitud por día’: estado_date_date, ‘Códigos de estado de URL’ : status_code_url, ‘Solicitudes del agente de usuario por día’: user_agent_date, ‘Agente de usuario solicita URLs únicas’: user_agent_url,} para hoja, nombre en hoja_names.items (): name.to_excel (escritor, hoja_name = hoja) Una última complicación es que Excel tiene un límite de fila de 1,048,576. Estamos exportando cada solicitud, por lo que esto podría causar problemas cuando se trata de muestras grandes. Debido a que los archivos CSV no tienen límite, se puede emplear una instrucción SI si se puede emplear para agregar una exportación de CSV como consecución. Si la longitud del archivo de datos del archivo de registro es mayor que 1,048,576, THse exportará, en su lugar, se exportará como un CSV, lo que evita que el script falla al no combinar los pivotes en una exportación singular. Si LEN (logs_Filtered) Pensamientos finales Las ideas adicionales que se pueden recoger de los datos del archivo de registro bien vale la pena invirtiendo algún tiempo. Si ha estado evitando aprovechar estos datos debido a las complejidades involucradas, mi esperanza es que este post lo convencerá de que estos Se puede superar. Para aquellos con acceso a las herramientas que ya están interesadas en la codificación, espero que desactive este proceso de extremo a extremo le haya dado una mayor comprensión de las consideraciones involucradas al crear un guión más grande para Automatice las tareas repetitivas y que consumen mucho tiempo. AnuncioContinue leyendo a continuación El script completo I CREAquí se puede encontrar aquí en GitHub. Esto incluye extras adicionales como la integración de API de GSC, más pivotes y soporte para dos formatos de registro más: Amazon Elb y W3C (utilizado por IIS). Para agregar en otro formato, incluya el nombre dentro de la lista de log_fomats en la línea 17 y agregue una declaración ELIF adicional en la línea 193 (o edite uno de los existentes). Hay, por supuesto, el alcance masivo para ampliar esto más. Manténgase atento a una parte posterior de la parte dos que cubrirá la incorporación de datos de los rastreadores de terceros, Pivots más avanzados y visualización de datos. AnunciCementContinue Lectura a continuación Más recursos: Cómo usar Python para analizar los datos de SEO: una guía de referencia 8 Bibliotecas de Python para SEO y cómo usarlas SEO técnico avanzado: una guía completa Créditos de la imagen Todas las capturas de pantalla tomadas por Autor, Julio 2021

Leave a Reply

Your email address will not be published. Required fields are marked *