File size: 5,846 Bytes
b6e91ad 13ef407 b6e91ad afb444f 95e1110 bd146a7 c856f52 1e8381d 12de023 1e8381d 12de023 1e8381d b6e91ad 12de023 1143967 12de023 95529e7 b6e91ad 1e8381d b6e91ad 12de023 b6e91ad 12de023 bd146a7 95e1110 95529e7 95e1110 bd146a7 12de023 bd146a7 1143967 12de023 95e1110 984bb90 ac82f88 b6e91ad 95e1110 b6e91ad 95e1110 13ef407 95e1110 ac82f88 95e1110 1e8381d | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 | from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import WebDriverException
from bs4 import BeautifulSoup
import time
import random
# Genera un User Agent aleatorio
def generate_random_user_agent():
browsers = {
"Chrome": range(70, 115),
"Firefox": range(60, 110),
"Safari": ["13.1", "14.0", "15.0", "16.0", "17.0"],
"Edge": range(80, 105),
"Opera": range(50, 90),
"Brave": range(1, 40),
"Vivaldi": range(2, 6),
"UC Browser": [f"13.{v}" for v in range(0, 21)]
}
operating_systems = [
"Windows NT 10.0; Win64; x64", "Windows NT 11.0; Win64; x64",
"Macintosh; Intel Mac OS X 10_15_7", "X11; Linux x86_64",
"Linux; Android 12; Pixel 5", "iPhone; CPU iPhone OS 16_2 like Mac OS X"
]
architectures = ["x86", "x86_64", "ARM", "ARM64"]
languages = ["en-US", "en-GB", "es-ES", "fr-FR", "de-DE", "it-IT", "pt-BR", "ru-RU", "zh-CN", "ja-JP", "ko-KR"]
browser, version_range = random.choice(list(browsers.items()))
version = random.choice(version_range)
os_version = random.choice(operating_systems)
architecture = random.choice(architectures)
language = random.choice(languages)
return f"Mozilla/5.0 ({os_version}; {architecture}; {language}) AppleWebKit/537.36 (KHTML, like Gecko) {browser}/{version} Safari/537.36"
# Generar un tamaño de ventana aleatorio
def get_random_window_size():
window_sizes = [
(1920, 1080), (1366, 768), (1440, 900), (1536, 864), (1280, 800), (1280, 720), (1024, 768)
]
return random.choice(window_sizes)
# Generar cabeceras HTTP aleatorias
def generate_random_headers():
languages = ["es-ES,es;q=0.9", "en-US,en;q=0.9", "fr-FR,fr;q=0.9", "de-DE,de;q=0.9"]
accept = ["text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"application/json,text/html;q=0.9"]
return {
'accept-language': random.choice(languages),
'accept': random.choice(accept)
}
# Simular scroll en la página
def simulate_scroll(driver):
scroll_pause_time = random.uniform(1, 3)
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(scroll_pause_time)
def extract_data(user_input, mode):
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
# Usa un User Agent aleatorio para cada petición
options.add_argument(f"user-agent={generate_random_user_agent()}")
# Generar cabeceras HTTP aleatorias
headers = generate_random_headers()
options.add_argument(f"accept-language={headers['accept-language']}")
options.add_argument(f"accept={headers['accept']}")
wd = None
try:
wd = webdriver.Chrome(options=options)
window_size = get_random_window_size()
wd.set_window_size(window_size[0], window_size[1]) # Ajusta el tamaño de la ventana aleatoriamente
# Construir la URL de búsqueda
url_busqueda = f"https://app.neilpatel.com/es/traffic_analyzer/keywords?domain={user_input}&lang=es&locId=2724&mode={mode}"
wd.get(url_busqueda)
# Simular scroll en la página
simulate_scroll(wd)
# Espera aleatoria para simular el comportamiento humano
time.sleep(random.uniform(4, 6)) # Espera más larga para simular un comportamiento humano
# Obtener el contenido de la página
page_content = wd.page_source
# Borrar cookies después de cargar la página
wd.delete_all_cookies()
except WebDriverException as e:
return []
finally:
if wd:
wd.quit()
# Parsear el HTML
soup = BeautifulSoup(page_content, 'html.parser')
# Buscar el div con id="root"
root_div = soup.find('div', id='root')
if not root_div:
return []
# Imprimir el contenido del div con id="root"
print(root_div.prettify())
# Extraer el texto plano dentro del div
texto_plano = root_div.get_text(separator='\n', strip=True)
# Buscar la palabra clave específica "Última actualización" y descartar todo lo anterior
keyword = "Última actualización"
index = texto_plano.find(keyword)
if index != -1:
texto_plano = texto_plano[index + len(keyword):].strip()
# Eliminar todas las líneas que contienen la palabra "Búsquedas"
lineas = texto_plano.split('\n')
lineas_filtradas = [linea for linea in lineas if "Búsquedas" not in linea]
# Eliminar todo lo que vaya después de la primera línea que incluya "ACTUALIZA A PRO"
for i, linea in enumerate(lineas_filtradas):
if "ACTUALIZA A PRO" in linea:
lineas_filtradas = lineas_filtradas[:i]
break
# Función para parsear el texto en el formato deseado
def parsear_texto(lineas):
datos_parseados = []
for i in range(0, len(lineas), 7):
if i + 6 < len(lineas):
palabra_clave = lineas[i]
url = lineas[i + 1]
volumen = lineas[i + 2]
posicion = lineas[i + 3]
visitas = lineas[i + 4]
sd = lineas[i + 5]
ultima_actualizacion = lineas[i + 6]
datos_parseados.append({
"Palabras clave": palabra_clave,
"URL": url,
"Volumen": volumen,
"Posición": posicion,
"Visitas": visitas,
"SD": sd,
"Última actualización": ultima_actualizacion
})
return datos_parseados
# Parsear el texto filtrado
datos_parseados = parsear_texto(lineas_filtradas)
return datos_parseados
|