Oportunidades de interlinking automatizadas con Python
El SEO interlinking ha sido una
El SEO interlinking ha sido una tarea SEO fundamental desde el principio. La capacidad de dirigir a los usuarios y el PageRank a páginas relevantes puede ser una estrategia poderosa. Pero, incluso para un blog con solo 100 publicaciones, esto a menudo puede ser una tarea engorrosa de administrar manualmente. Es fácil encontrar oportunidades de interlinking** si tienes una estructura de categorías y etiquetas súper ajustada, pero la mayoría de las veces ese no es el caso. Entonces, ¿cómo podemos usar Python para ayudar a acelerar este proceso de descubrimiento de interlinking?
¿Por qué es importante Python para los profesionales de SEO?
Como profesionales del SEO, siempre estamos buscando formas de optimizar nuestro trabajo y obtener mejores resultados, ¿verdad? Bueno, Python puede ser tu gran aliado en esta búsqueda. Imaginate poder automatizar tareas repetitivas de SEO, analizar grandes cantidades de datos de manera eficiente y encontrar oportunidades de SEO interlinking que antes pasaban desapercibidas. Con Python, tenés el poder de transformar la forma en que abordás el SEO, ahorrando tiempo y mejorando tu rendimiento.
Requisitos y consideraciones
Funciona mejor con una lista de URL pequeña, digamos, menos de 500 URL, y con contenido diverso. Si tu contenido está muy relacionado, es probable que obtengas una cantidad inmanejable de oportunidades de interlinking. Con esa advertencia fuera del camino, vamos a profundizar.
Módulos importados
Importemos primero los módulos necesarios para este script. La siguiente lista es lo que ayuda a que este script sea útil.
import pandas as pd
import requests
from bs4 import BeautifulSoup
import nltk
nltk.download('punkt')
nltk.download('averaged_perceptron_tagger')
import string
import re
Lista de exclusión de palabras
Esta es la lista de exclusión de palabras. A menudo, los blogs o sitios generales que tienen una identidad fuerte tendrán muchas palabras en común. No queremos estas palabras comunes en nuestra evaluación o todo se activará como una oportunidad. A continuación, se muestra la lista de palabras que utilicé. Estas palabras se encuentran en casi todas las páginas. No es raro que tengas una lista 2 o 3 veces más larga y necesites agregar a medida que pruebes el script muchas veces hasta que te resulte útil. Este es el paso más importante para hacerlo bien o terminarás con cada URL coincidiendo con todo.
exwords = ['company', 'tips', 'ad', 'ads', 'site', 'google', 'ppc', 'seo', 'marketing', 'web', 'website', 'search', 'search engine', 'rocket', 'clicks']
Función de extracción, limpieza y tokenización de páginas
Ahora creamos una función para manejar el scraping del contenido del cuerpo de tu lista de URL, tokenizar, limpiar y luego enviar el contenido de vuelta como una lista. Incluiremos cada URL en esta función. Para empezar, crearemos una lista vacía para recopilar todos los enlaces en la URL para que podamos compararlos con la URL que estamos tratando de buscar oportunidades. Obviamente, no queremos considerar si ya hay un enlace en esa página a la URL que se está procesando. Luego, hacemos la llamada HTTP requests a la URL y tomamos el HTML. Luego, creamos el objeto BS4 usando ese HTML. Continuamos nuestra función seleccionando el texto solo en el div con la clase “entry-content clr”. Esto es específico del blog de WordPress que estoy usando para este script. Debes personalizar esto tú mismo. El punto es que solo queremos evaluar el cuerpo principal del contenido de esa página. En este caso, el cuerpo del contenido del blog está en ese div. Usa la herramienta de inspección para encontrar el bloque que alberga tu contenido principal y modifica el código a continuación. Por último, escaneamos ese cuerpo de contenido en busca de enlaces y los almacenamos en la lista blogtext_links que creamos anteriormente. Usaremos eso para comparar con cualquier URL que estemos comparando y si esa URL ya está enlazada, pasamos.
La siguiente parte trata sobre la limpieza y el filtrado del contenido lo suficiente como para que sea útil al comparar. Para empezar, tokenizamos el contenido del cuerpo enviándolo a través de la función nltk.tokenize.word_tokenize(). Esto coloca cada palabra como un elemento en una lista. A continuación, tenemos varias comprensiones de lista. Espero completamente que haya métodos mucho más eficientes e inteligentes, pero esto es lo que se me ocurrió y funciona. Después de la tercera, tenemos una lista de palabras clave decente, pero podemos hacer mucho más. Ahora usaremos la función nltk.pos_tag() para etiquetar cada palabra con su tipo. aka sustantivos verbos adjetivos. etc. Esto crea una lista de listas, por ejemplo [[‘bear’,’NN][‘Obama’,’NNP’]]. Ahora hacemos un par de comprensiones más:
A continuación, reconstruimos la lista y agregamos la URL a la lista para que sepamos a qué página pertenece la lista de palabras clave. Por último, devolvemos la lista de tokens para esa URL y la lista de enlaces en la página.
def scrapeURL(url):
blogtext_links = []
response = requests.get(url).text
soup = BeautifulSoup(response, "html.parser")
bloghtml = soup.find("div", {"class": "entry-content clr"})
blogtext = bloghtml.get_text()
blogtext_links = [a.get('href') for a in bloghtml.findAll('a', href=True)]
text_tokens = nltk.tokenize.word_tokenize(blogtext)
text_tokens = [t for t in text_tokens if not re.match('[" + string.punctuation + "]+', t)]
text_tokens = [t.lower() for t in text_tokens if t not in exwords]
text_tokens = nltk.pos_tag(text_tokens)
text_tokens = [x for x in text_tokens if x[1] in ['NN','NNS','NNP','NNPS']]
text_tokens = [x[0] for x in text_tokens]
text_tokens_clean = []
[text_tokens_clean.append(x) for x in text_tokens if x not in text_tokens_clean]
text_tokens_clean.append(url)
return text_tokens_clean, blogtext_links
Función de limpieza y tokenización de títulos
A continuación, creamos otra función que tokeniza y limpia cada uno de los títulos de las URL. Son muy similares y quizás un usuario veterano de Python podría sugerir un método consolidado, pero al final esto también funciona. La única diferencia real es al final cuando agregamos un carácter “%” arbitrario al final de la URL que coincide con el título. Hago esto para que cuando comparemos la lista de títulos con la lista de texto de la página, no se cancelen debido a la URL coincidente. Necesitamos esos datos de URL como un identificador único para cualquier lista dada.
def scrapetitle(title, url):
text_tokens = nltk.tokenize.word_tokenize(title)
text_tokens = [t for t in text_tokens if not re.match('[" + string.punctuation + "]+', t)]
text_tokens = [t.lower() for t in text_tokens]
text_tokens = [t for t in text_tokens if t not in exwords]
text_tokens = nltk.pos_tag(text_tokens)
text_tokens = [x for x in text_tokens if x[1] in ['NN','NNS','NNP','NNPS']]
text_tokens = [x[0] for x in text_tokens]
text_tokens_clean = []
[text_tokens_clean.append(x) for x in text_tokens if x not in text_tokens_clean]
text_tokens_clean.append(url + "%)
return textTokensClean
Importación de CSV de URLs y títulos
Ahora que las dos funciones que limpian las listas están completas, pasamos al principio del script. Se crea una lista de filtros para filtrar las rutas de página en tu rastreo CSV que no deseas procesar. En mi caso, las páginas de etiquetas y paginación. Solo deseas procesar las páginas en las que deseas encontrar oportunidades de interlinking SEO. Luego, cargamos la lista de URL seleccionando solo las columnas Address y Title del CSV en un dataframe. Luego, usamos esa lista de filtros en la columna Address. Por último, convertimos el dataframe en un objeto de diccionario para facilitar la iteración.
filter = ['/tag/', '/page']
df = pd.read_csv("RC-crawl.csv")[['Address','Title 1']]
df = df[~df['Address'].str.contains('|'.join(filter))].reset_index()
posets df.to_dict()
Procesamiento de texto de páginas
Ahora es el momento de procesar las URL. Configuramos dos listas vacías que albergarán el texto de la página tokenizada y una para los enlaces encontrados en ese contenido. A continuación, recorremos las URL, enviamos la URL para que se procese y devolvemos el texto de la página y la lista de enlaces para esa URL. Luego, esas listas se agregan a sus listas maestras. Hacemos este mismo proceso para los títulos de las URL. La única diferencia es que enviamos la URL correspondiente con el texto del título.
pagetext []
bogtext_links_master []
fokey,valueinposts['Address'].items(): scrapelist,bloglinks=scrapeURL(value) pagetext.append(scrapelist) bogtext_links_master.append(bloglinks)
z=0
pagetitle[]
fkey,valueinposts['Title 1'].items(): pagetitle.append(scrapetitle(value,posts['Address'][z]))
z+=1
Identificación de oportunidades de Interlinking SEO
Aquí tenemos la verdadera esencia del script. Primero, creamos el dataframe vacío que albergará los resultados finales y un contador que se usa para ver si un enlace de blog ya está en una página determinada. Repasaré la siguiente parte paso a paso porque es un poco confusa. En general, estamos comparando cada título con cualquier texto de página dado.
df=pd.DataFrame(columns=['page url','link opps for placement on page url'])
r=0
f iinpagetext:
y=0
fbipagetitle:
if i[-1]+'%'!=b[-1]:
if bool(set(i)&set(b))==True:
b[-1]=b[-1].replace('%','')
if b[-1]notinbogtext_links_master[r]:
f y==0:
df.loc[len(df.index)]=[i[-1],b[-1]]
else:
df['link opps for placement on page url'].iloc[-1]=df['link opps for placement on page url'].iloc[-1]+"@@"+b[-1]
y+=1
r+=1
Exportación de resultados a CSV
El paso final es guardar el dataframe en un archivo CSV para que lo analices y comiences el interlinking. A continuación, se muestra un fragmento de la salida utilizando la lista de URLs. En este punto, tu trabajo apenas ha comenzado. Ahora tienes tu lista de oportunidades de interlinking sugeridas. Ahora es el momento de examinarlas individualmente y ver dónde pueden encajar. No es raro que descartes más de la mitad debido a problemas de contexto. Después de todo, este script no es inteligente, pero al final aún debería ahorrarte algo de tiempo al hacer estas consideraciones manualmente.
df.to_csv("interlink-opps.csv")
¡Y ahí lo tienes! Ahora puedes recortar algo de tiempo en tus tareas de interlinking. Como se mencionó en la introducción, este script es un trabajo en progreso y requiere algunos ajustes para ser útil en ciertas situaciones. Lo más importante es tener contenido diverso, una cantidad limitada de URL y una lista completa de exclusión de palabras.
Los scripts de Python se pueden crear para analizar el contenido del sitio web, identificar palabras clave relevantes y sugerir posibles oportunidades de enlazado interno Esta automatización ayuda a agilizar el proceso de enlazado. Las bibliotecas de procesamiento del lenguaje natural (NLP) como spaCy o NLTK junto con herramientas como BeautifulSoup para el web scraping se utilizan comúnmente en Python para analizar el contenido e identificar palabras clave enlazar. El proceso generalmente implica raspar contenido relevante, extraer palabras clave utilizando técnicas de NLP y luego determinar posibles oportunidades de enlaces internos en función de las palabras clave identificadas.
Considera los aspectos éticos del web scraping, asegúrate de cumplir con los términos de servicio del sitio web y sé consciente de las limitaciones de las herramientas automatizadas. La revisión humana a menudo es necesaria para tomar decisiones precisas.