El feed es la página en xml donde se ofrece el contenido de nuestros post a los lectores RSS. Podemos utilizar esta información para monitorizar lo que publica nuestra competencia incluso antes de estar indexado en Google.
import random
import requests
import pandas as pd
from bs4 import BeautifulSoup
import xml.etree.ElementTree as ET
import re
google="https://google.es/"
url="https://comercioymarketing.es/feed/"
def GET_UA():
uastrings = ["Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36",\
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36",\
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10) AppleWebKit/600.1.25 (KHTML, like Gecko) Version/8.0 Safari/600.1.25",\
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0",\
"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36",\
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36",\
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/600.1.17 (KHTML, like Gecko) Version/7.1 Safari/537.85.10",\
"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko",\
"Mozilla/5.0 (Windows NT 6.3; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0",\
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.104 Safari/537.36"\
]
return random.choice(uastrings)
#//////////////// EXTRAEMOS DEL FEED LAS URLS ///////////////////////////
r = requests.get(url, headers={'User-Agent': GET_UA()})
data = r.content
root = ET.fromstring(data.decode()) #Convierto de xml a string
enlaces = root.findall('.//item/link')
listaFeed=[]
for e in enlaces:
listaFeed.append(e.text)
#print(e.text)
print(listaFeed)
Cuando tengamos los link de todas las publicaciones podemos comprobar que el contenido esté indexado por Google de forma manual en el buacador: site:https://lapaginaweb.com/post1
O también podemos automatizar el proceso con este otro script en Selenium.
#////////////////////// Comprobamos si está indexada ///////////////////////////
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import Select
import time
def nuevaAccion(listaSite,listaSitio,listaIndex):
# Abrimos el navegador
opts = Options()
opts.add_argument("user-agent=GET_UA()")
driver = webdriver.Chrome( 'chromedriver.exe', chrome_options=opts)
driver.maximize_window()
driver.get(google)
# Saltamos Cookies de Google para seguir con la búsqueda con 5 tabulaciones.
for i in range(4):
ActionChains(driver).key_down(Keys.TAB).key_up(Keys.TAB).perform()
time.sleep(0.5)
ActionChains(driver).key_down(Keys.ENTER).key_up(Keys.ENTER).perform()
# Demora, espera hasta cargar el logo de Google
try:
elemento = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, '//div[@id="lga"]')))
except TimeoutException:
print('La página tardó demasiado en cargarse')
############################## Vuelvo a pasar la lista de resultados
listaFuera=[]
for site in listaSite:
try:
time.sleep(2)
buscar = driver.find_element_by_xpath('.//div[@class="ds"]/input')
buscar.click()
textoSite = 'site:'+site
buscar.send_keys(textoSite)
time.sleep(1)
buscar.send_keys(Keys.ENTER)
html_doc = driver.page_source
soup = BeautifulSoup(html_doc, 'html.parser')
span = soup.find_all('span')
for s in span:
print(s)
empieza = re.findall(r'\<span.*?\>(.*?)\.',str(s)) #Saca texto de Google cuando NO indexa
if empieza == [' no obtuvo ningún resultado']:
sitio=site
print(sitio+" No está indexada")
listaSitio.append(sitio)
listaIndex.append("NO Indexada")
listaFuera.append(site)
except NoSuchElementException:
print("Estamos fuera")
print(site)
break
for fuera in listaFuera: # Todas las URL probadas la sacamos de la lista Site antes de return
listaSite.remove(fuera)
return(listaSite,listaSitio,listaIndex)
listaSitio=[]
listaIndex=[]
while listaFeed != []:
nuevaAccion(listaFeed,listaSitio,listaIndex)
Juande Marín
Profesor de Marketing digital, divulgador de inteligencia artificial y neuroeducación. Especializado en posicionamiento en buscadores y diseño web. Autor de varios libros relacionados con el comercio electrónico y el marketing digital (McGraw Hill, Paraninfo,…) Juande2marin