SlideShare una empresa de Scribd logo
1 de 58
Descargar para leer sin conexión
From Shell to SEO and beyond
Desde la línea de comandos
Ya sea porque no hay otra manera, o porque es la más eficaz,
si trabajas con big data, el terminal aprenderás!
La línea de comandos
01 Los básicos
Hay cuatro o cinco comandos que hacen funcionar el mundo,
y puede que no sea coña…
Ya sea porque no hay otra manera, o porque es la más eficaz,
si trabajas con big data, el terminal aprenderás!
La línea de comandos
Cuatro o cinco comandos son habitualmente utilizados
01 Los básicos
grep
sed
cat
cat
grep
sed
Cuatro o cinco comandos son habitualmente utilizados
01 Los básicos
Ver
el contenido
de un
archivo
grep
sed
Filtrar
usando
regex el
contenido de
un archivo
Cuatro o cinco comandos son habitualmente utilizados
01 Los básicos
cat
Ver
el contenido
de un
archivo
Cuatro o cinco comandos son habitualmente utilizados
sed
Sustituir
patrones en
el contenido
de un
archivo
01 Los básicos
grep
Filtrar
usando
regex el
contenido de
un archivo
cat
Ver
el contenido
de un
archivo
01 cat
cat ejemploFicheroTexto.txt
<?xml version="1.0" encoding="utf-8" ?><transcript><text start="0" dur="0.5"></text><text start="0.5"
dur="2.86">[MÚSICA ELECTRÓNICA]</text>
<text start="3.36" dur="7.21"></text><text start="10.57" dur="2.37">JOHN MUELLER: Bienvenidos todos al
próximo episodio</text><text start="12.94" dur="3.48">de &amp;quot;Search Off the Record&amp;quot;, un
podcast que estamos probando.</text><text start="16.42" dur="2.52">Nuestro plan es hablar un poco sobre lo
que</text><text start="18.94" dur="2.55">sucede en Google detrás de escena</text><text start="21.49"
dur="2.77">y tal vez divertirnos un poco en el camino.</text><text start="24.26" dur="2.45">Mi nombre es
John Mueller, un promotor de búsqueda</text><text start="26.71" dur="3.97">en el equipo de relaciones de
búsqueda aquí en Google en Suiza.</text><text start="30.68" dur="5">Y me acompañan Martin y Gary, que
también están en el equipo.</text><text start="35.68" dur="0.668">MARTÍN: Hola.</text><text start="36.348"
dur="1.042">
JOHN MUELLER: Hola, Martín.</text><text start="37.39" dur="1.08">Hola, Gary.</text><text start="38.47"
dur="1.02">GARY: [NO EN INGLÉS]</text>
<text start="39.49" dur="1.125">JOHN MUELLER: Buenos días.</text><text start="40.615" dur="1.765">Así
que hemos hecho una serie de episodios ahora.</text><text start="42.38" dur="2.45">Y creo que poco a poco
le estamos cogiendo el truco. Sin embargo, se</text><text start="44.83" dur="2.91">siente un poco nuevo y
emocionante</text><text start="47.74" dur="2.722">cada vez, así que eso es genial. ¿</text>
<?xml version="1.0" encoding="utf-8" ?><transcript>
<text start="0" dur="0.5"></text>
<text start="0.5" dur="2.86">MÚSICA ELECTRÓNICA</text>
<text start="3.36" dur="7.21"></text>
<text start="10.57" dur="2.37">JOHN MUELLER: Bienvenidos todos al próximo episodio</text>
<text start="12.94" dur="3.48">de &amp;quot;Search Off the Record&amp;quot;, un podcast que estamos
probando.</text>
<text start="16.42" dur="2.52">Nuestro plan es hablar un poco sobre lo que</text>
<text start="18.94" dur="2.55">sucede en Google detrás de escena</text>
<text start="21.49" dur="2.77">y tal vez divertirnos un poco en el camino.</text>
<text start="24.26" dur="2.45">Mi nombre es John Mueller, un promotor de búsqueda</text>
a
<text start="30.68" dur="5">Y me acompañan Martin y Gary, que también están en el equipo</text>
<text start="35.68" dur="0.668">MARTÍN: Hola.</text>
<text start="36.348" dur="1.042">
JOHN MUELLER: Hola, Martín.</text>
<text start="37.39" dur="1.08">Hola, Gary.</text>
<text start==""38.47" dur="1.02">GARY: [NO EN INGLÉS]</text>
<?xml version="1.0" encoding="utf-8" ?><transcript>
<text start="0" dur="0.5"></text>
<text start="0.5" dur="2.86">MÚSICA ELECTRÓNICA</text>
<text start="3.36" dur="7.21"></text>
<text start="10.57" dur="2.37">JOHN MUELLER: Bienvenidos todos al próximo episodio</text>
<text start="12.94" dur="3.48">de &amp;quot;Search Off the Record&amp;quot;, un podcast que estamos probando.</text>
<text start="16.42" dur="2.52">Nuestro plan es hablar un poco sobre lo que</text>
<text start="18.94" dur="2.55">sucede en Google detrás de escena</text>
<text start="21.49" dur="2.77">y tal vez divertirnos un poco en el camino.</text>
<text start="24.26" dur="2.45">Mi nombre es John Mueller, un promotor de búsqueda</text>
a
<text start="30.68" dur="5">Y me acompañan Martin y Gary, que también están en el equipo</text>
<text start="35.68" dur="0.668">MARTÍN: Hola.</text>
<text start="36.348" dur="1.042">
JOHN MUELLER: Hola, Martín.</text>
<text start="37.39" dur="1.08">Hola, Gary.</text>
<text start==""38.47" dur="1.02">GARY: [NO EN INGLÉS]</text>
01 cat + sed
cat ejemploFicheroTexto.txt |sed 's/<text star/n<text star/g'
02 Los imprescindibles
Su uso básico es “sencillo”, pero son comandos con
muchísimas opciones.
También hay otros comandos que son muy versátiles,
sobretodo para SEOs
La línea de comandos
Su uso básico es “sencillo”, pero son comandos con muchísimas opciones. No te
das cuenta de su valor hasta que los usas de manera recurrente.
02 Los imprescindibles
wget
xargs
curl
Navega
accede a
una URL
El mundo no funcionaría sin ellos.
02 Los imprescindibles
wget
xargs
curl
wget
Navega
accede a
una URL
El mundo no funcionaría sin ellos.
02 Los imprescindibles
Navega
accede a
una URL
curl xargs
Navaja Suiza
Vale para
muchas
cosas.. OjO
puede ser
catastrófico
El mundo no funcionaría sin ellos.
02 Los imprescindibles
wget
Navega
accede a
una URL
Navega
accede a
una URL
curl xargs
02 wget
wget --quiet https://www.booking.com/robots.txt -O -
Robots.txt
02 wget
wget --quiet https://www.booking.com/robots.txt -O -
Robots.txt
02 wget + grep
wget --quiet https://www.booking.com/robots.txt -O -| grep Sitemap
Sitemap: https://www.booking.com/sitembk-airport-index.xml
Sitemap: https://www.booking.com/sitembk-articles-index.xml
Sitemap: https://www.booking.com/sitembk-attractions-index.xml
Sitemap: https://www.booking.com/sitembk-beaches-index.xml
Sitemap: https://www.booking.com/sitembk-beach-holidays-index.xml
Sitemap: https://www.booking.com/sitembk-cars-airport-index.xml
Sitemap: https://www.booking.com/sitembk-cars-city-index.xml
Sitemap: https://www.booking.com/sitembk-cars-country-index.xml
Sitemap: https://www.booking.com/sitembk-cars-region-index.xml
Sitemap: https://www.booking.com/sitembk-city-index.xml
Sitemap: https://www.booking.com/sitembk-city-review-index.xml
Sitemap: https://www.booking.com/sitembk-communities-index.xml
Sitemap: https://www.booking.com/sitembk-country-index.xml
Sitemap: https://www.booking.com/sitembk-country-review-index.xml
Sitemap: https://www.booking.com/sitembk-district-index.xml
Sitemap: https://www.booking.com/sitembk-flights-index.xml
Sitemap: https://www.booking.com/sitembk-flights-priority-index.xml
Sitemap: https://www.booking.com/sitembk-flights-country-index.xml
Sitemap: https://www.booking.com/sitembk-flights-to-region-index.xml
Sitemap: https://www.booking.com/sitembk-flights-to-city-index.xml
Sitemap: https://www.booking.com/sitembk-flights-to-airport-index.xml
Sitemap: https://www.booking.com/sitembk-fraud-index.xml
02 wget + grep + sed
wget -q https://www.booking.com/robots.txt -O - | grep Sitemap | sed 's/Sitemap: //g'
https://www.booking.com/sitembk-airport-index.xml
https://www.booking.com/sitembk-articles-index.xml
https://www.booking.com/sitembk-attractions-index.xml
https://www.booking.com/sitembk-beaches-index.xml
https://www.booking.com/sitembk-beach-holidays-index.xml
https://www.booking.com/sitembk-cars-airport-index.xml
https://www.booking.com/sitembk-cars-city-index.xml
https://www.booking.com/sitembk-cars-country-index.xml
https://www.booking.com/sitembk-cars-region-index.xml
https://www.booking.com/sitembk-city-index.xml
https://www.booking.com/sitembk-city-review-index.xml
https://www.booking.com/sitembk-communities-index.xml
https://www.booking.com/sitembk-country-index.xml
https://www.booking.com/sitembk-country-review-index.xml
https://www.booking.com/sitembk-district-index.xml
https://www.booking.com/sitembk-flights-index.xml
https://www.booking.com/sitembk-flights-priority-index.xml
https://www.booking.com/sitembk-flights-country-index.xml
https://www.booking.com/sitembk-flights-to-region-index.xml
https://www.booking.com/sitembk-flights-to-city-index.xml
https://www.booking.com/sitembk-flights-to-airport-index.xml
https://www.booking.com/sitembk-fraud-index.xml
02 wget + grep + sed
wget -q https://www.booking.com/robots.txt -O - | grep Sitemap | sed 's/Sitemap: //g'
https://www.booking.com/sitembk-airport-index.xml
https://www.booking.com/sitembk-articles-index.xml
https://www.booking.com/sitembk-attractions-index.xml
https://www.booking.com/sitembk-beaches-index.xml
https://www.booking.com/sitembk-beach-holidays-index.xml
https://www.booking.com/sitembk-cars-airport-index.xml
https://www.booking.com/sitembk-cars-city-index.xml
https://www.booking.com/sitembk-cars-country-index.xml
https://www.booking.com/sitembk-cars-region-index.xml
https://www.booking.com/sitembk-city-index.xml
https://www.booking.com/sitembk-city-review-index.xml
https://www.booking.com/sitembk-communities-index.xml
https://www.booking.com/sitembk-country-index.xml
https://www.booking.com/sitembk-country-review-index.xml
https://www.booking.com/sitembk-district-index.xml
https://www.booking.com/sitembk-flights-index.xml
https://www.booking.com/sitembk-flights-priority-index.xml
https://www.booking.com/sitembk-flights-country-index.xml
https://www.booking.com/sitembk-flights-to-region-index.xml
https://www.booking.com/sitembk-flights-to-city-index.xml
https://www.booking.com/sitembk-flights-to-airport-index.xml
https://www.booking.com/sitembk-fraud-index.xml
02 wget
wget https://www.booking.com/sitembk-airport-index.xml -O -
<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.google.com/schemas/sitemap/0.9">
<sitemap><loc>https://www.booking.com/sitembk-airport-en-gb.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
<sitemap><loc>https://www.booking.com/sitembk-airport-ro.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
<sitemap><loc>https://www.booking.com/sitembk-airport-ja.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
<sitemap><loc>https://www.booking.com/sitembk-airport-sl.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
<sitemap><loc>https://www.booking.com/sitembk-airport-hr.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
<sitemap><loc>https://www.booking.com/sitembk-airport-ko.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
<sitemap><loc>https://www.booking.com/sitembk-airport-el.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
<sitemap><loc>https://www.booking.com/sitembk-airport-es-ar.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
<sitemap><loc>https://www.booking.com/sitembk-airport-et.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
<sitemap><loc>https://www.booking.com/sitembk-airport-ca.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
<sitemap><loc>https://www.booking.com/sitembk-airport-de.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
<sitemap><loc>https://www.booking.com/sitembk-airport-lv.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
<sitemap><loc>https://www.booking.com/sitembk-airport-sr.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
<sitemap><loc>https://www.booking.com/sitembk-airport-id.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
<sitemap><loc>https://www.booking.com/sitembk-airport-ar.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
<sitemap><loc>https://www.booking.com/sitembk-airport-no.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
<sitemap><loc>https://www.booking.com/sitembk-airport-he.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
02 wget
wget https://www.booking.com/sitembk-airport-index.xml -O -
<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.google.com/schemas/sitemap/0.9">
<sitemap><loc>https://www.booking.com/sitembk-airport-en-gb.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
<sitemap><loc>https://www.booking.com/sitembk-airport-ro.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
<sitemap><loc>https://www.booking.com/sitembk-airport-ja.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
<sitemap><loc>https://www.booking.com/sitembk-airport-sl.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
<sitemap><loc>https://www.booking.com/sitembk-airport-hr.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
<sitemap><loc>https://www.booking.com/sitembk-airport-ko.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
<sitemap><loc>https://www.booking.com/sitembk-airport-el.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
<sitemap><loc>https://www.booking.com/sitembk-airport-es-ar.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
<sitemap><loc>https://www.booking.com/sitembk-airport-et.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
<sitemap><loc>https://www.booking.com/sitembk-airport-ca.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
<sitemap><loc>https://www.booking.com/sitembk-airport-de.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
<sitemap><loc>https://www.booking.com/sitembk-airport-lv.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
<sitemap><loc>https://www.booking.com/sitembk-airport-sr.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
<sitemap><loc>https://www.booking.com/sitembk-airport-id.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
<sitemap><loc>https://www.booking.com/sitembk-airport-ar.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
<sitemap><loc>https://www.booking.com/sitembk-airport-no.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
<sitemap><loc>https://www.booking.com/sitembk-airport-he.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
02 wget + zcat
wget https://www.booking.com/sitembk-airport-en-gb.0000.xml.gz -O -|zcat
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.google.com/schemas/sitemap/0.9">
<url>
<loc>https://www.booking.com/airport/us/atl.en-gb.html</loc>
<lastmod>2023-06-11</lastmod>
<changefreq>daily</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://www.booking.com/airport/us/ord.en-gb.html</loc>
<lastmod>2023-06-11</lastmod>
<changefreq>daily</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://www.booking.com/airport/us/lax.en-gb.html</loc>
<lastmod>2023-06-11</lastmod>
<changefreq>daily</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://www.booking.com/airport/gb/lhr.en-gb.html</loc>
02 wget + grep + xargs + while
wget -q https://www.booking.com/robots.txt -O - | grep 'Sitemap'|sed 's/Sitemap: //g'|xargs -I{} wget -q -
{} -O - | grep -Eo "https?://[^<]+.*xml.gz" |while read filas; do wget -q $filas -O -|zcat | grep -Eo
"https?://[^<]+">> URLsBooking.txt;done
02 wget + grep + xargs + while
wget -q https://www.booking.com/robots.txt -O - | grep 'Sitemap'|sed 's/Sitemap: //g'|xargs -I{} wget -q -
{} -O - | grep -Eo "https?://[^<]+.*xml.gz" |while read filas; do wget -q $filas -O -|zcat | grep -Eo
"https?://[^<]+">> URLsBooking.txt;done
wget -q https://www.booking.com/robots.txt -O -
| grep 'Sitemap'
|sed 's/Sitemap: //g'
|xargs -I{}
wget -q - {} -O -
| grep -Eo "https?://[^<]+.*xml.gz"
|while read filas;
do wget -q $filas -O -
|zcat
| grep -Eo "https?://[^<]+"
>> URLsBooking.txt;
done
02 wget + grep + xargs + while
177.261.544
URLs
Ni nuestro fiel Screaming Frog
puede con ello
wget -q https://www.booking.com/robots.txt -O - | grep 'Sitemap'|sed 's/Sitemap: //g'|xargs -I{} wget -q -
{} -O - | grep -Eo "https?://[^<]+.*xml.gz" |while read filas; do wget -q $filas -O -|zcat | grep -Eo
"https?://[^<]+">> URLsBooking.txt;done
12 GB
txt de URLs
¿Cómo lo abrirías?
03 Las fuentes de datos
Hay una gran cantidad de fuentes de datos que podemos
usar para muy diversas tareas. Os dejo algunas que creo
útiles para cualquier SEO
No hace falta saber programar, ni instalar pesadas librerías…
Python está sobrevalorado
La línea de comandos
cat KwsInicial.csv
camisetas básicas de manga corta
iphone
iphone 13
vaqueros de corte recto para mujer
motorola edge 20 pro
nokia x20
vivo x60 pro+
realme gt 5g
asus rog phone 5
lenovo legion phone duel 2
zte axon 30 ultra
tcl 20 pro 5g
black shark 4 pro
redmi note 10 pro
vestidos casuales de verano
03 Las fuentes de datos
Datos de APIs
wget -q
'https://db2.keywordsur.fr/keyword_surf
er_keywords?country=ES&keywords=[%22iph
one%2013%22]' --output-document -
{"iphone 13"
:{"categories":[10007,10019,10167,10878,11511,12161,13054,13381,13419],
"competition":1.0,"cpc":0.49,"search_volume":673000,"similar_keywords":[{
"keyword":"el iphone 13"
,"country":"ES","overlapping_pages":9,"search_volume":880,"cpc":0.33},{"
keyword":"precio iphone 13",
"country":"ES","overlapping_pages":7,"search_volume":14800,"cpc":0.16},{
"keyword":"precio del iphone 13",
"country":"ES","overlapping_pages":7,"search_volume":1900,"cpc":0.16},{
"keyword":"apple iphone 13",
"country":"ES","overlapping_pages":6,"search_volume":12100,"cpc":0.51},{
"keyword":"iphone 13 apple",
"country":"ES","overlapping_pages":6,"search_volume":3600,"cpc":0.51},{
"keyword":"oferta iphone 13",
"country":"ES","overlapping_pages":6,"search_volume":2400,"cpc":0.86},{
"keyword":"iphone trece",
"country":"ES","overlapping_pages":6,"search_volume":480,"cpc":0.46},{
"keyword":"iphone 13 precio",
"country":"ES","overlapping_pages":5,"search_volume":22200,"cpc":0.29},{
"keyword":"iphone 13 precios",
"country":"ES","overlapping_pages":5,"search_volume":22200,"cpc":0.17},{
"keyword":"iphone 13: precio",
"country":"ES","overlapping_pages":5,"search_volume":22200,"cpc":0.17}]}
https://db2.keywordsur.fr/keyword_surfer_keywords?country=ES&keywords=[%22iphone%2013%22]
03 Las fuentes de datos
Datos de APIs → Keywordsur
cat KwsInicial.csv|
xargs -I{} wget -q
'https://db2.keywordsur.fr/keyword_surf
er_keywords?country=ES&keywords=[%22{}%
22]' --output-document - |
jq>>outTextFile.txt
03 Las fuentes de datos
Datos de APIs → Keywordsur
cat KwsInicial.csv |sed 's/ /+/g'|while read
palabra;do sqlCH "select kw,vol as
Volume,arrayJoin(rel).1 RelatedKW,arrayJoin(rel).2
VolumeRelatedKw from (select
kw,vol,arrayMap(x->(x.1,x.4),todo.2.5) as rel from
(select arrayJoin(arrayZip(keys,values)) as todo,
todo.1 as kw,todo.2.4 vol
,arrayZip(arrayMap(x->x.1,todo.2.5)
,arrayMap(x->x.3,todo.2.5)) as resto from ( select
arrayMap(x -> x.1, JSONExtractKeysAndValues(html,
'String')) as keys, arrayMap(x -> x.2,
JSONExtractKeysAndValues(html,
'Tuple(Array(UInt64), Float64, Float64,
UInt64,Array(Tuple(String,UInt64,UInt64,Float64)))'
)) as values FROM
url(concat('http://db2.keywordsur.fr/keyword_surfer
_keywords?country=ES&keywords=[%22',replaceRegexpAl
l(normalizeUTF8NFD(lowerUTF8('$palabra')), 'pM',
''),'%22]'), JSONAsString, 'html String')))) order
by Volume desc,VolumeRelatedKw desc FORMAT
Pretty";done
03 Las fuentes de datos
Datos de APIs → Keywordsur
wget -q
'https://v7.authoritas.com/api/v3/visib
ility-explorer/ranking/keywords/es_es?d
omains%5B%5D=openai.com'
--output-document -
{"total":1000,"items":[{"openai.com":{"potentialVisibilityScoreInc":0,"searchVol
ume":4400,"cpc":16,"universalRank":1,"visibilityIndex":1485.97998046875,"kw
ResultTypes":{"related_search":8,"location":1,"people_also_ask":4,"video":3,"k
nowledge_graph":1,"organic":98},"userIntent":{"informational":33,"research":3
3,"transactional":33},"fullUrl":"openai.com/research/whisper","domain":"open
ai.com","keyword":"whisper","resultType":"organic","visibilityIndexShare":0.45
75653271691231,"universalRankDeltas":0},"potentialVisibilityScoreInc":0,"sea
rchVolume":4400,"cpc":16,"universalRank":1,"visibilityIndex":1485.979980468
75,"kwResultTypes":{"related_search":8,"location":1,"people_also_ask":4,"vid
eo":3,"knowledge_graph":1,"organic":98},"userIntent":{"informational":33,"rese
arch":33,"transactional":33},"fullUrl":"openai.com/research/whisper","domain"
:"openai.com","keyword":"whisper","resultType":"organic","visibilityIndexShare
":0.4575653271691231},{"openai.com":{"potentialVisibilityScoreInc":98.59999
84741211,"searchVolume":2900,"cpc":0,"universalRank":3,"visibilityIndex":37
0.1499938964844,"kwResultTypes":{"news":2,"navigation":1,"see_results_ab
out":2,"location":1,"people_also_ask":4,"video":4,"knowledge_graph":1,"organi
c":96},"userIntent":{"informational":33},"fullUrl":"openai.com/product/gpt-4","d
omain":"openai.com","keyword":"g p
t","resultType":"organic","visibilityIndexShare":0.11397717686981691},"potenti
alVisibilityScoreInc":98.5999984741211,"searchVolume":2900,"cpc":0,"univer
salRank":3,"visibilityIndex":370.1499938964844,"kwResultTypes":{"news":2,"n
avigation":1,"see_results_about":2,"location":1,"people_also_ask":4,"video":4,"
knowledge_graph":1,"organic":96},"userIntent":{"informational":33},"fullUrl":"op
enai.com/product/gpt-4","domain":"openai.com","keyword":"g p
https://v7.authoritas.com/api/v3/visibility-explorer/ranking/keywords/es_es?domains%5B%5D=openai.com
03 Las fuentes de datos
Datos de APIs → Authoritas
wget -q
'https://v7.authoritas.com/api/v3/visib
ility-explorer/ranking/keywords/es_es?d
omains%5B%5D=openai.com'
--output-document -
{ "openai.com": {
"potentialVisibilityScoreInc": 0,
"searchVolume": 4400,
"cpc": 16,
"universalRank": 1,
"visibilityIndex": 1485.97998046875,
"kwResultTypes": {
"related_search": 8,
"location": 1,
"people_also_ask": 4,
"video": 3,
"knowledge_graph": 1,
"organic": 98},
"userIntent": {
"informational": 33,
"research": 33,
"transactional": 33 },
"fullUrl": "openai.com/research/whisper",
"domain": "openai.com",
"keyword": "whisper",
"resultType": "organic",
"visibilityIndexShare": 0.4575653271691231,
https://v7.authoritas.com/api/v3/visibility-explorer/ranking/keywords/es_es?domains%5B%5D=openai.com
03 Las fuentes de datos
Datos de APIs → Authoritas
https://majestic.com/charts/v2/backlink
s-discovery-chart/chat.openai.com/?w=82
5&h=300&IndexDataSource=F
https://majestic.com/charts/v2/backlinks-discovery-chart/chat.openai.com/?w=825&h=300&IndexDataSource=F
03 Las fuentes de datos
Datos de APIs → Majestic
cat KwsInicial|sed 's/ /+/g'|xargs -P11
-I{} curl -s -w "n"
"https://completion.amazon.co.uk/api/2017/su
ggestions?prefix={}&suffix=&session-id=260-6
261272-2261010&customer-id=A2HLNXM8V9BK5Z&re
quest-id=65EXKVSV12216V211E18&page-type=Gate
way&lop=es_ES&site-variant=mobile&client-inf
o =
amazon-search-ui&mid=A1RKKUPIHCS9HS&alias=ap
s&event=onLoad&limit=141&suggestion-type=KEY
WORD&suggestion-type=WIDGET&_=1589523257903"
|grep -e '^{"alias"'|sed -E
's/"shuffled":false}(.*)?$/"shuffled":false
}/g'
's/"shuffled":false}(.*)?$
/"s
huffled":false}/g'
{"alias":"aps","prefix":
"iphone 13","suffix":"","suggestions":[{"suggType":"KeywordSuggestion","type":
"KEYWORD","value":"iphone 13"
,"refTag":"nb_sb_ss_ts-doa-p_1_9","candidateSources":"local","strategyId":"ts-doa-p","strategyApiTy
pe":"RANK","prior":0.0,"ghost":false,"help":false},{"suggType":"KeywordSuggestion","type":
"KEYWORD","value":"iphone 13 pro max"
,"refTag":"nb_sb_ss_ts-doa-p_2_9","candidateSources":"local","strategyId":"ts-doa-p","strategyApiTy
pe":"RANK","prior":0.0,"ghost":false,"help":false},{"suggType":"KeywordSuggestion","type":
"KEYWORD","value":"iphone 13 pro"
,"refTag":"nb_sb_ss_ts-doa-p_3_9","candidateSources":"local","strategyId":"ts-doa-p","strategyApiTy
pe":"RANK","prior":0.0,"ghost":false,"help":false},{"suggType":"KeywordSuggestion","type":
"KEYWORD","value":"iphone 13 mini"
,"refTag":"nb_sb_ss_ts-doa-p_4_9","candidateSources":"local","strategyId":"ts-doa-p","strategyApiTy
pe":"RANK","prior":0.0,"ghost":false,"help":false},{"suggType":"KeywordSuggestion","type":
"KEYWORD","value":"iphone 13 reacondicionado"
,"refTag":"nb_sb_ss_ts-doa-p_5_9","candidateSources":"local","strategyId":"ts-doa-p","strategyApiTy
pe":"RANK","prior":0.0,"ghost":false,"help":false},{"suggType":"KeywordSuggestion","type":
"KEYWORD","value":"iphone 13 case"
,"refTag":"nb_sb_ss_ts-doa-p_6_9","candidateSources":"local","strategyId":"ts-doa-p","strategyApiTy
pe":"RANK","prior":0.0,"ghost":false,"help":false},{"suggType":"KeywordSuggestion","type":
"KEYWORD","value":"iphone 13 pro max 256gb"
,"refTag":"nb_sb_ss_ts-doa-p_7_9","candidateSources":"local","strategyId":"ts-doa-p","strategyApiTy
pe":"RANK","prior":0.0,"ghost":false,"help":false},{"suggType":"KeywordSuggestion","type":
"KEYWORD","value":"iphone 13 mini reacondicionado"
,"refTag":"nb_sb_ss_ts-doa-p_8_9","candidateSources":"local","strategyId":"ts-doa-p","strategyApiTy
pe":"RANK","prior":0.0,"ghost":false,"help":false},{"suggType":"KeywordSuggestion","type":
"KEYWORD","value":"iphone 13 pro case"
,"refTag":"nb_sb_ss_ts-doa-p_9_9","candidateSources":"local","strategyId":"ts-doa-p","strategyApiTy
pe":"RANK","prior":0.0,"ghost":false,"help":false},{"suggType":"KeywordSuggestion","type":
"KEYWORD","value":"iphone 13 256gb"
https://completion.amazon.co.uk/api/2017/suggestions?prefix=iphone+13&suffix=&session-id…
03 Las fuentes de datos
Datos de APIs → Amazon
KWs iniciales
"kw","Volume","RelatedKW","VolumeRelatedKw"
"iphone 13",673000,"iphone 13 precio",22200
"iphone 13",673000,"iphone 13 precios",22200
"iphone 13",673000,"iphone 13: precio",22200
"iphone 13",673000,"precio iphone 13",14800
"iphone 13",673000,"apple iphone 13",12100
"iphone 13",673000,"iphone 13 apple",3600
"iphone 13",673000,"oferta iphone 13",2400
"iphone 13",673000,"precio del iphone 13",1900
"iphone 13",673000,"el iphone 13",880
"iphone 13",673000,"iphone trece",480
"kw","Volume","RelatedKW","VolumeRelatedKw"
"iphone",246000,"iphone iphone",246000
Relacionadas
Amazon
En paralelo
Volumen de
búsqueda
03 Las fuentes de datos
Datos de APIs
xargs -P100 -I{}
Para los más vagos o los menos atrevidos, tranquilos,
aquí dejo estos ejemplos, además, ya formateados en
Google Sheets :)
Datos de las APIs en Sheets
https://docs.google.com/spreadsheets/d/1Lsw0flyKa6gX0O-8Stnzi8MJcYrLfUG-CZytKT6QmJc/edit#gid=1056179876
Keyword Surfer
● Kws relacionadas
● Volumen de búsqueda
Authoritas Amazon
● Kws relacionadas
● Alta disponibilidad
● Datos de dominios
● ¿Actualizada?
Existen multitud de programas y scripts que se pueden
ejecutar desde el terminal.
Además de comandos de Linux
Existen multitud de programas y scripts que se pueden
ejecutar desde el terminal.
Además de comandos de Linux
04 Caso práctico
Usaremos yt-dlp para crear un buscador de
contenido dentro de una lista de vídeos
04 Caso práctico
yt-dlp hace casi cualquier cosa con los vídeos de YouTube
Obtenemos el id de la lista de reproducción
04 URL + transcripción de un vídeo
yt-dlp --flat-playlist
PLKoqnv2vTMUMxMs2PdBlDULqybdlPZxrk -j | jq
-r .url>>SORVideos.txt
Obtenemos la lista de vídeos
https://www.youtube.com/watch?v=AyeD6Y_fLdk
https://www.youtube.com/watch?v=92jciJsXtx0
https://www.youtube.com/watch?v=Jm51YBz1jwY
https://www.youtube.com/watch?v=rBjeB3HCT-M
https://www.youtube.com/watch?v=SOyeNx80fKY
https://www.youtube.com/watch?v=xxk2zfPSEP4
https://www.youtube.com/watch?v=NnWuKmXm85w
…
04 URL + transcripción de un vídeo
yt-dlp --flat-playlist
PLKoqnv2vTMUMxMs2PdBlDULqybdlPZxrk -j | jq
-r .url>>SORVideos.txt
Obtenemos la lista de vídeos
https://www.youtube.com/watch?v=AyeD6Y_fLdk
https://www.youtube.com/watch?v=92jciJsXtx0
https://www.youtube.com/watch?v=Jm51YBz1jwY
https://www.youtube.com/watch?v=rBjeB3HCT-M
https://www.youtube.com/watch?v=SOyeNx80fKY
https://www.youtube.com/watch?v=xxk2zfPSEP4
https://www.youtube.com/watch?v=NnWuKmXm85w
…
04 URL + transcripción de un vídeo
yt-dlp --flat-playlist
PLKoqnv2vTMUMxMs2PdBlDULqybdlPZxrk -j | jq
-r .url>>SORVideos.txt
Obtenemos la lista de vídeos
https://www.youtube.com/watch?v=AyeD6Y_fLdk
https://www.youtube.com/watch?v=92jciJsXtx0
https://www.youtube.com/watch?v=Jm51YBz1jwY
https://www.youtube.com/watch?v=rBjeB3HCT-M
https://www.youtube.com/watch?v=SOyeNx80fKY
https://www.youtube.com/watch?v=xxk2zfPSEP4
https://www.youtube.com/watch?v=NnWuKmXm85w
…
04 URL + transcripción de un vídeo
yt-dlp --flat-playlist
PLKoqnv2vTMUMxMs2PdBlDULqybdlPZxrk -j | jq
-r .url>>SORVideos.txt
Obtenemos la lista de vídeos
yt-dlp --list-subs
https://www.youtube.com/watch?v=AyeD6Y_fLdk
Obtenemos lista de subtítulos
https://www.youtube.com/watch?v=AyeD6Y_fLdk
https://www.youtube.com/watch?v=92jciJsXtx0
https://www.youtube.com/watch?v=Jm51YBz1jwY
https://www.youtube.com/watch?v=rBjeB3HCT-M
https://www.youtube.com/watch?v=SOyeNx80fKY
https://www.youtube.com/watch?v=xxk2zfPSEP4
https://www.youtube.com/watch?v=NnWuKmXm85w
…
04 URL + transcripción de un vídeo
yt-dlp --flat-playlist
PLKoqnv2vTMUMxMs2PdBlDULqybdlPZxrk -j | jq
-r .url>>SORVideos.txt
Obtenemos la lista de vídeos
yt-dlp --list-subs
https://www.youtube.com/watch?v=AyeD6Y_fLdk
Obtenemos lista de subtítulos …
sl Slovenian vtt, ttml, srv3, srv2, srv1, json3
so Somali vtt, ttml, srv3, srv2, srv1, json3
st Southern Sotho vtt, ttml, srv3, srv2, srv1, json3
es Spanish vtt, ttml, srv3, srv2, srv1, json3
su Sundanese vtt, ttml, srv3, srv2, srv1, json3
sw Swahili vtt, ttml, srv3, srv2, srv1, json3
sv Swedish vtt, ttml, srv3, srv2, srv1, json3
tg Tajik vtt, ttml, srv3, srv2, srv1, json3
…
https://www.youtube.com/watch?v=D3JKwXiO6B4
https://www.youtube.com/watch?v=CSanSWZV_ik
https://www.youtube.com/watch?v=PUbNfPJRCsY
https://www.youtube.com/watch?v=RZAtINoMVJE
https://www.youtube.com/watch?v=MGS9Y42bcO0
https://www.youtube.com/watch?v=Egx9ymxcXnw
https://www.youtube.com/watch?v=MRtua44JqqA
…
{ "openai.com": {
"potentialVisibilityScoreInc": 0,
"searchVolume": 4400,
"cpc": 16,
"universalRank": 1,
"visibilityIndex": 1485.97998046875,
"kwResultTypes": {
"related_search": 8,
"location": 1,
"people_also_ask": 4,
"video": 3,
"knowledge_graph": 1,
"organic": 98},
"userIntent": {
"informational": 33,
"research": 33,
"transactional": 33 },
"fullUrl": "openai.com/research/whisper",
"domain": "openai.com",
"keyword": "whisper",
"resultType": "organic",
"visibilityIndexShare": 0.4575653271691231,
"universalRankDeltas": 0
}
yt-dlp
--no-abort-on-error
--write-auto-sub
--sub-lang es
--sub-format srv1
--write-description
--skip-download
-o ./"%(id)s---%(title)s"
https://www.youtube.com/watch?v=AyeD6Y_fLdk
<?xml version="1.0" encoding="utf-8" ?><transcript><text start="3.06"
dur="6.949">[Música]</text><text start="10.16" dur="4.96">hola y
bienvenidos a otro episodio de</text><text start="13.019"
dur="3.501">búsqueda del registro, un podcast que</text><text start="15.12"
dur="3.84">les llega del equipo de búsqueda de Google en el que
se</text><text start="16.52" dur="4.599">habla de todo lo relacionado con la
búsqueda y se</text><text start="18.96" dur="4.38">divierten en el
proceso. Me llamo Martin</text><text start="21.119" dur="4.08">y hoy me
acompañan John y Gary</text><text start="23.34" dur="3.42">de el equipo
de relaciones de búsqueda del que</text><text start="25.199"
dur="3.84">también formo parte</text><text start="26.76" dur="4.98">también
gracias a todos los que nos escuchan,</text><text start="29.039"
dur="4.501">acabamos de pasar nuestros 2 millones de</text><text
start="31.74" dur="3.36">descargas marcadas con este podcast
y</text><text start="33.54" dur="3.9">estamos muy entusiasmados con eso
y</text><text start="35.1" dur="4.74">gracias a todos por su</text><text
start="37.44" dur="4.2">atención continua y todos los comentarios. que
estamos</text><text start="39.84" dur="4.62">recibiendo para nuestro
podcast, esto ha</text><text start="41.64" dur="5.52">sido muy apreciado,
está bien,</text><text start="44.46" dur="5.939">hablando de comentarios
hoy, me gustaría</text><text start="47.16" dur="6.899">hablar con ustedes,
dos personas maravillosas aquí</text><text start="50.399" dur="6.18">en
esta configuración de grabación, Gary y John,</text>
cat AyeD6Y_fLd…………srv1
04 Transcripción de un vídeo
* Debe ir todo en una línea
cat SORVideos.txt |
xargs -I{} bash -c 'yt-dlp --no-abort-on-error
--write-auto-sub --sub-lang es-orig --sub-format
srv1 --write-description --skip-download -o
./"%(id)s---%(title)s" {}’
9.282
transcripciones
5 minutos
9.282
transcripciones
125 minutos
En paralelo 100 hilos Simple
cat SORVideos.txt |
xargs -P100 -I{} bash -c 'yt-dlp
--no-abort-on-error --write-auto-sub --sub-lang
es-orig --sub-format srv1 --write-description
--skip-download -o ./"%(id)s---%(title)s" {}’
04 Transcripciones de todos los vídeos
https://www.youtube.com/watch?v=D3JKwXiO6B4
https://www.youtube.com/watch?v=CSanSWZV_ik
https://www.youtube.com/watch?v=PUbNfPJRCsY
https://www.youtube.com/watch?v=RZAtINoMVJE
https://www.youtube.com/watch?v=MGS9Y42bcO0
https://www.youtube.com/watch?v=Egx9ymxcXnw
https://www.youtube.com/watch?v=MRtua44JqqA
…
sed -i -E
's/(<text ([^>]+)>)([A-Z])/n13/g'
cat AyeD6Y_fLd…………srv1
04 Información útil a extraer
URLs de vídeos
Guardar en BBDD
Embeddings
del texto
"kw","Volume","RelatedKW","VolumeRelatedKw"
"iphone 13",673000,"iphone 13 precio",22200
"iphone 13",673000,"iphone 13 precios",22200
"iphone 13",673000,"iphone 13: precio",22200
"iphone 13",673000,"precio iphone 13",14800
"iphone 13",673000,"apple iphone 13",12100
"iphone 13",673000,"iphone 13 apple",3600
"iphone 13",673000,"oferta iphone 13",2400
"iphone 13",673000,"precio del iphone 13",1900
"iphone 13",673000,"el iphone 13",880
"iphone 13",673000,"iphone trece",480
"kw","Volume","RelatedKW","VolumeRelatedKw"
"iphone",246000,"iphone iphone",246000
Extraer texto
y tiempos
04 Flujo de procesos
<?xml version="1.0" encoding="utf-8" ?><transcript>
<text start="0" dur="0.5"></text>
<text start="0.5" dur="2.86">MÚSICA ELECTRÓNICA</text>
<text start="3.36" dur="7.21"></text>
<text start="10.57" dur="2.37">JOHN MUELLER: Bienvenidos todos al próximo episodio</text>
<text start="12.94" dur="3.48">de &amp;quot;Search Off the Record&amp;quot;, un podcast que estamos
probando.</text>
<text start="16.42" dur="2.52">Nuestro plan es hablar un poco sobre lo que</text>
<text start="18.94" dur="2.55">sucede en Google detrás de escena</text>
<text start="21.49" dur="2.77">y tal vez divertirnos un poco en el camino.</text>
<text start="24.26" dur="2.45">Mi nombre es John Mueller, un promotor de búsqueda</text>
a
<text start="30.68" dur="5">Y me acompañan Martin y Gary, que también están en el equipo</text>
<text start="35.68" dur="0.668">MARTÍN: Hola.</text>
<text start="36.348" dur="1.042">
JOHN MUELLER: Hola, Martín.</text>
<text start="37.39" dur="1.08">Hola, Gary.</text>
<text start==""38.47" dur="1.02">GARY: [NO EN INGLÉS]</text>
#!/usr/bin/python3
import sys
import json
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
for size in sys.stdin:
# Collect a batch of inputs to process at once
texts = []
for row in range(0, int(size)):
texts.append(sys.stdin.readline())
# Run the model and obtain vectors
embeddings = model.encode(texts)
# Output the vectors
for vector in embeddings:
print(json.dumps(vector.tolist()))
sys.stdout.flush()
04 Python
embeddings_Bert.py
<?xml version="1.0" encoding="utf-8" ?><transcript>
<text start="0" dur="0.5"></text>
<text start="0.5" dur="2.86">MÚSICA ELECTRÓNICA</text>
<text start="3.36" dur="7.21"></text>
<text start="10.57" dur="2.37">JOHN MUELLER: Bienvenidos todos al próximo episodio</text>
<text start="12.94" dur="3.48">de &amp;quot;Search Off the Record&amp;quot;, un podcast que estamos
probando.</text>
<text start="16.42" dur="2.52">Nuestro plan es hablar un poco sobre lo que</text>
<text start="18.94" dur="2.55">sucede en Google detrás de escena</text>
<text start="21.49" dur="2.77">y tal vez divertirnos un poco en el camino.</text>
<text start="24.26" dur="2.45">Mi nombre es John Mueller, un promotor de búsqueda</text>
a
<text start="30.68" dur="5">Y me acompañan Martin y Gary, que también están en el equipo</text>
<text start="35.68" dur="0.668">MARTÍN: Hola.</text>
<text start="36.348" dur="1.042">
JOHN MUELLER: Hola, Martín.</text>
<text start="37.39" dur="1.08">Hola, Gary.</text>
<text start==""38.47" dur="1.02">GARY: [NO EN INGLÉS]</text>
<functions>
<function>
<type>executable_pool</type>
<name>embeddingsBert</name>
<return_type>Array(Float32)</return_type>
<argument>
<type>String</type>
</argument>
<format>TabSeparated</format>
<command>embeddings_Bert.py</command>
<command_read_timeout>1000000</command_read_timeout>
</function>
</functions>
04 Base de Datos (ClickHouse)
configuración de la Base de Datos
<?xml version="1.0" encoding="utf-8" ?><transcript>
<text start="0" dur="0.5"></text>
<text start="0.5" dur="2.86">MÚSICA ELECTRÓNICA</text>
<text start="3.36" dur="7.21"></text>
<text start="10.57" dur="2.37">JOHN MUELLER: Bienvenidos todos al próximo episodio</text>
<text start="12.94" dur="3.48">de &amp;quot;Search Off the Record&amp;quot;, un podcast que estamos
probando.</text>
<text start="16.42" dur="2.52">Nuestro plan es hablar un poco sobre lo que</text>
<text start="18.94" dur="2.55">sucede en Google detrás de escena</text>
<text start="21.49" dur="2.77">y tal vez divertirnos un poco en el camino.</text>
<text start="24.26" dur="2.45">Mi nombre es John Mueller, un promotor de búsqueda</text>
a
<text start="30.68" dur="5">Y me acompañan Martin y Gary, que también están en el equipo</text>
<text start="35.68" dur="0.668">MARTÍN: Hola.</text>
<text start="36.348" dur="1.042">
JOHN MUELLER: Hola, Martín.</text>
<text start="37.39" dur="1.08">Hola, Gary.</text>
<text start==""38.47" dur="1.02">GARY: [NO EN INGLÉS]</text>
04 Base de Datos (ClickHouse)
configuración de la Base de Datos
SELECT embeddingsBert('HOLA Seonthebeach!
Estoy creando un buscador de vídeos')
RESULTS
—-------------------------------------------------------------------------------------------------------------------------------------
[0.025904791,-0.008754695,0.0024956395,-0.13338439,0.01864505,0.05029957,-0.009]
—-------------------------------------------------------------------------------------------------------------------------------------
1 row in set. Elapsed: 0.018 sec.
<?xml version="1.0" encoding="utf-8" ?><transcript>
<text start="0" dur="0.5"></text>
<text start="0.5" dur="2.86">MÚSICA ELECTRÓNICA</text>
<text start="3.36" dur="7.21"></text>
<text start="10.57" dur="2.37">JOHN MUELLER: Bienvenidos todos al próximo episodio</text>
<text start="12.94" dur="3.48">de &amp;quot;Search Off the Record&amp;quot;, un podcast que estamos
probando.</text>
<text start="16.42" dur="2.52">Nuestro plan es hablar un poco sobre lo que</text>
<text start="18.94" dur="2.55">sucede en Google detrás de escena</text>
<text start="21.49" dur="2.77">y tal vez divertirnos un poco en el camino.</text>
<text start="24.26" dur="2.45">Mi nombre es John Mueller, un promotor de búsqueda</text>
a
<text start="30.68" dur="5">Y me acompañan Martin y Gary, que también están en el equipo</text>
<text start="35.68" dur="0.668">MARTÍN: Hola.</text>
<text start="36.348" dur="1.042">
JOHN MUELLER: Hola, Martín.</text>
<text start="37.39" dur="1.08">Hola, Gary.</text>
<text start==""38.47" dur="1.02">GARY: [NO EN INGLÉS]</text>
CREATE TABLE Trantor.SearchOfftheRecord
(
`fecha` Date,
`fichero` String,
`texto` String,
`linea` String,
`duracion` Float32,
`comienza` Array(String),
`tiempo` String,
`vector` Array(Float32)
)
ENGINE = MergeTree
ORDER BY fecha
SETTINGS index_granularity = 8192
04 Base de Datos (ClickHouse)
configuración de la Base de Datos
Usuario busca
Extrae cuando
comienza
Embedding la
consultaz
04 Proceso para resolver la búsqueda
Devuelve URL
enlazando al
momento exacto
¿Los más
similares? (KNN)
04 Búsqueda semántica (ClickHouse)
configuración de la Base de Datos
WITH embeddingsBert('problemas por renderizar javascript') AS txtBusqueda
SELECT
url,
tiempo,
L2SquaredDistance(vector, txtBusqueda) AS distancia,
countSubstrings(texto, ' ') + 1 AS palabras,
texto,
contexto
FROM
(
SELECT
concat('https://www.youtube.com/', fichero, '&t=', replaceRegexpAll(tiempo, '..*', ''), 's') AS url,
texto,
neighbor(texto, 4) AS vecino4,
neighbor(texto, 3) AS vecino3,
neighbor(texto, 2) AS vecino2,
neighbor(texto, 1) AS vecino1,
concat(texto, vecino1, vecino2, vecino3, vecino4) AS contexto,
vector,
tiempo
FROM default.YtGSCVector
)
WHERE palabras > 2
ORDER BY distancia ASC
04 Enlace al momento en el vídeo
04 Enlace al momento en el vídeo
04
En breve, interface web…
¡Fin!
17 de junio 2023

Más contenido relacionado

La actualidad más candente

Beyond the Basics – 5 Google Business Profile elements you might not know abo...
Beyond the Basics – 5 Google Business Profile elements you might not know abo...Beyond the Basics – 5 Google Business Profile elements you might not know abo...
Beyond the Basics – 5 Google Business Profile elements you might not know abo...Claire Carlile Marketing
 
How to categorise 100K search queries in 15 minutes - MeasureFest
How to categorise 100K search queries in 15 minutes - MeasureFestHow to categorise 100K search queries in 15 minutes - MeasureFest
How to categorise 100K search queries in 15 minutes - MeasureFestRichard Lawrence
 
EAT: Have We Been Looking At It Backwards
EAT: Have We Been Looking At It BackwardsEAT: Have We Been Looking At It Backwards
EAT: Have We Been Looking At It BackwardsEdwardZiubrzynski1
 
Cómo analizar enlazado interno en un proyecto SEO #TerritorioDSM #TeritorioTr...
Cómo analizar enlazado interno en un proyecto SEO #TerritorioDSM #TeritorioTr...Cómo analizar enlazado interno en un proyecto SEO #TerritorioDSM #TeritorioTr...
Cómo analizar enlazado interno en un proyecto SEO #TerritorioDSM #TeritorioTr...MJ Cachón Yáñez
 
7 Ways Not to Fail at International SEO
7 Ways Not to Fail at International SEO7 Ways Not to Fail at International SEO
7 Ways Not to Fail at International SEOAleyda Solís
 
How to Automatically Subcategorise Your Website Automatically With Python
How to Automatically Subcategorise Your Website Automatically With PythonHow to Automatically Subcategorise Your Website Automatically With Python
How to Automatically Subcategorise Your Website Automatically With Pythonsearchsolved
 
Python For SEO specialists and Content Marketing - Hand in Hand
Python For SEO specialists and Content Marketing - Hand in HandPython For SEO specialists and Content Marketing - Hand in Hand
Python For SEO specialists and Content Marketing - Hand in HandDido Grigorov
 
Turning A Neglected YouTube Channel into a Traffic Generation Machine
Turning A Neglected YouTube Channel into a Traffic Generation MachineTurning A Neglected YouTube Channel into a Traffic Generation Machine
Turning A Neglected YouTube Channel into a Traffic Generation MachinePhil Nottingham
 
Why Scaling (Great) Content Is So Bloody Hard
Why Scaling (Great) Content Is So Bloody HardWhy Scaling (Great) Content Is So Bloody Hard
Why Scaling (Great) Content Is So Bloody HardJoshuaHardwickAhrefs
 
BrightonSEO April 2023 Similar AI: Automation recipes for SEO success
BrightonSEO April 2023 Similar AI: Automation recipes for SEO successBrightonSEO April 2023 Similar AI: Automation recipes for SEO success
BrightonSEO April 2023 Similar AI: Automation recipes for SEO successDylan Fuler
 
Expediente Xpath #SEOnderground 2021
Expediente Xpath  #SEOnderground 2021Expediente Xpath  #SEOnderground 2021
Expediente Xpath #SEOnderground 2021MJ Cachón Yáñez
 
Hreflang tags: everything you need to know to start implementing them
Hreflang tags: everything you need to know to start implementing themHreflang tags: everything you need to know to start implementing them
Hreflang tags: everything you need to know to start implementing themSara Moccand-Sayegh
 
Kleecks - AI-Martech as a game changer-DEF.pdf
Kleecks - AI-Martech as a game changer-DEF.pdfKleecks - AI-Martech as a game changer-DEF.pdf
Kleecks - AI-Martech as a game changer-DEF.pdfKleecks
 
Beth Barnham Schema Auditing BrightonSEO Slides.pptx
Beth Barnham Schema Auditing BrightonSEO Slides.pptxBeth Barnham Schema Auditing BrightonSEO Slides.pptx
Beth Barnham Schema Auditing BrightonSEO Slides.pptxBethBarnham1
 
BrightonSEO - Master Crawl Budget Optimization for Enterprise Websites
BrightonSEO - Master Crawl Budget Optimization for Enterprise WebsitesBrightonSEO - Master Crawl Budget Optimization for Enterprise Websites
BrightonSEO - Master Crawl Budget Optimization for Enterprise WebsitesManick Bhan
 
Holistic Search - Developing An Organic First Strategy
Holistic Search - Developing An Organic First StrategyHolistic Search - Developing An Organic First Strategy
Holistic Search - Developing An Organic First StrategyArpunBhuhi
 
How To EAT Links.pptx
How To EAT Links.pptxHow To EAT Links.pptx
How To EAT Links.pptxDixon Jones
 
Google Discover Optimisation with Google Web Stories
Google Discover Optimisation with Google Web StoriesGoogle Discover Optimisation with Google Web Stories
Google Discover Optimisation with Google Web StoriesFelipe Bazon
 
Claves SEO para Ecommerce #RMC22
Claves SEO para Ecommerce  #RMC22Claves SEO para Ecommerce  #RMC22
Claves SEO para Ecommerce #RMC22MJ Cachón Yáñez
 
Canonicalization for SEO BrightonSEO April 2023 Patrick Stox
Canonicalization for SEO BrightonSEO April 2023 Patrick StoxCanonicalization for SEO BrightonSEO April 2023 Patrick Stox
Canonicalization for SEO BrightonSEO April 2023 Patrick StoxAhrefs
 

La actualidad más candente (20)

Beyond the Basics – 5 Google Business Profile elements you might not know abo...
Beyond the Basics – 5 Google Business Profile elements you might not know abo...Beyond the Basics – 5 Google Business Profile elements you might not know abo...
Beyond the Basics – 5 Google Business Profile elements you might not know abo...
 
How to categorise 100K search queries in 15 minutes - MeasureFest
How to categorise 100K search queries in 15 minutes - MeasureFestHow to categorise 100K search queries in 15 minutes - MeasureFest
How to categorise 100K search queries in 15 minutes - MeasureFest
 
EAT: Have We Been Looking At It Backwards
EAT: Have We Been Looking At It BackwardsEAT: Have We Been Looking At It Backwards
EAT: Have We Been Looking At It Backwards
 
Cómo analizar enlazado interno en un proyecto SEO #TerritorioDSM #TeritorioTr...
Cómo analizar enlazado interno en un proyecto SEO #TerritorioDSM #TeritorioTr...Cómo analizar enlazado interno en un proyecto SEO #TerritorioDSM #TeritorioTr...
Cómo analizar enlazado interno en un proyecto SEO #TerritorioDSM #TeritorioTr...
 
7 Ways Not to Fail at International SEO
7 Ways Not to Fail at International SEO7 Ways Not to Fail at International SEO
7 Ways Not to Fail at International SEO
 
How to Automatically Subcategorise Your Website Automatically With Python
How to Automatically Subcategorise Your Website Automatically With PythonHow to Automatically Subcategorise Your Website Automatically With Python
How to Automatically Subcategorise Your Website Automatically With Python
 
Python For SEO specialists and Content Marketing - Hand in Hand
Python For SEO specialists and Content Marketing - Hand in HandPython For SEO specialists and Content Marketing - Hand in Hand
Python For SEO specialists and Content Marketing - Hand in Hand
 
Turning A Neglected YouTube Channel into a Traffic Generation Machine
Turning A Neglected YouTube Channel into a Traffic Generation MachineTurning A Neglected YouTube Channel into a Traffic Generation Machine
Turning A Neglected YouTube Channel into a Traffic Generation Machine
 
Why Scaling (Great) Content Is So Bloody Hard
Why Scaling (Great) Content Is So Bloody HardWhy Scaling (Great) Content Is So Bloody Hard
Why Scaling (Great) Content Is So Bloody Hard
 
BrightonSEO April 2023 Similar AI: Automation recipes for SEO success
BrightonSEO April 2023 Similar AI: Automation recipes for SEO successBrightonSEO April 2023 Similar AI: Automation recipes for SEO success
BrightonSEO April 2023 Similar AI: Automation recipes for SEO success
 
Expediente Xpath #SEOnderground 2021
Expediente Xpath  #SEOnderground 2021Expediente Xpath  #SEOnderground 2021
Expediente Xpath #SEOnderground 2021
 
Hreflang tags: everything you need to know to start implementing them
Hreflang tags: everything you need to know to start implementing themHreflang tags: everything you need to know to start implementing them
Hreflang tags: everything you need to know to start implementing them
 
Kleecks - AI-Martech as a game changer-DEF.pdf
Kleecks - AI-Martech as a game changer-DEF.pdfKleecks - AI-Martech as a game changer-DEF.pdf
Kleecks - AI-Martech as a game changer-DEF.pdf
 
Beth Barnham Schema Auditing BrightonSEO Slides.pptx
Beth Barnham Schema Auditing BrightonSEO Slides.pptxBeth Barnham Schema Auditing BrightonSEO Slides.pptx
Beth Barnham Schema Auditing BrightonSEO Slides.pptx
 
BrightonSEO - Master Crawl Budget Optimization for Enterprise Websites
BrightonSEO - Master Crawl Budget Optimization for Enterprise WebsitesBrightonSEO - Master Crawl Budget Optimization for Enterprise Websites
BrightonSEO - Master Crawl Budget Optimization for Enterprise Websites
 
Holistic Search - Developing An Organic First Strategy
Holistic Search - Developing An Organic First StrategyHolistic Search - Developing An Organic First Strategy
Holistic Search - Developing An Organic First Strategy
 
How To EAT Links.pptx
How To EAT Links.pptxHow To EAT Links.pptx
How To EAT Links.pptx
 
Google Discover Optimisation with Google Web Stories
Google Discover Optimisation with Google Web StoriesGoogle Discover Optimisation with Google Web Stories
Google Discover Optimisation with Google Web Stories
 
Claves SEO para Ecommerce #RMC22
Claves SEO para Ecommerce  #RMC22Claves SEO para Ecommerce  #RMC22
Claves SEO para Ecommerce #RMC22
 
Canonicalization for SEO BrightonSEO April 2023 Patrick Stox
Canonicalization for SEO BrightonSEO April 2023 Patrick StoxCanonicalization for SEO BrightonSEO April 2023 Patrick Stox
Canonicalization for SEO BrightonSEO April 2023 Patrick Stox
 

Más de Lino Uruñuela

Agrupa y vencerás - SEO técnico
Agrupa y vencerás - SEO técnicoAgrupa y vencerás - SEO técnico
Agrupa y vencerás - SEO técnicoLino Uruñuela
 
Google Search Console - el dato de Schrödinger
Google Search Console - el dato de  SchrödingerGoogle Search Console - el dato de  Schrödinger
Google Search Console - el dato de SchrödingerLino Uruñuela
 
Que no te den dato por liebre - enpresadigitala 2022
Que no te den dato por liebre - enpresadigitala 2022Que no te den dato por liebre - enpresadigitala 2022
Que no te den dato por liebre - enpresadigitala 2022Lino Uruñuela
 
Obtener un listado de keywords en base a su potencial SEO (Google Search Cons...
Obtener un listado de keywords en base a su potencial SEO (Google Search Cons...Obtener un listado de keywords en base a su potencial SEO (Google Search Cons...
Obtener un listado de keywords en base a su potencial SEO (Google Search Cons...Lino Uruñuela
 
Search Console, descifrando las cifras
Search Console, descifrando las cifrasSearch Console, descifrando las cifras
Search Console, descifrando las cifrasLino Uruñuela
 
Seo Técnico - Del mito al dato - Seonthebeach 2018
Seo Técnico - Del mito al dato - Seonthebeach 2018Seo Técnico - Del mito al dato - Seonthebeach 2018
Seo Técnico - Del mito al dato - Seonthebeach 2018Lino Uruñuela
 
eShow 2017 SEO grandes webs - Lino urunuela
eShow 2017 SEO grandes webs - Lino urunuelaeShow 2017 SEO grandes webs - Lino urunuela
eShow 2017 SEO grandes webs - Lino urunuelaLino Uruñuela
 
Optimiza tu crawl budget se onthebeach 2017
Optimiza tu crawl budget   se onthebeach 2017Optimiza tu crawl budget   se onthebeach 2017
Optimiza tu crawl budget se onthebeach 2017Lino Uruñuela
 
Cómo hacer una migración y no morir en el intento
Cómo hacer una migración y no morir en el intentoCómo hacer una migración y no morir en el intento
Cómo hacer una migración y no morir en el intentoLino Uruñuela
 
Seo Logs y Big Data, Lino Uruñuela en Seonthebeach 2016
Seo Logs y Big Data, Lino Uruñuela en Seonthebeach 2016Seo Logs y Big Data, Lino Uruñuela en Seonthebeach 2016
Seo Logs y Big Data, Lino Uruñuela en Seonthebeach 2016Lino Uruñuela
 
SEO para periodistas por Lino Uruñuela (2008)
SEO para periodistas por Lino Uruñuela (2008)SEO para periodistas por Lino Uruñuela (2008)
SEO para periodistas por Lino Uruñuela (2008)Lino Uruñuela
 
Monitorizar GoogleBot usando Google Analytics por Lino Uruñuela
Monitorizar GoogleBot usando Google Analytics por Lino UruñuelaMonitorizar GoogleBot usando Google Analytics por Lino Uruñuela
Monitorizar GoogleBot usando Google Analytics por Lino UruñuelaLino Uruñuela
 

Más de Lino Uruñuela (13)

Agrupa y vencerás - SEO técnico
Agrupa y vencerás - SEO técnicoAgrupa y vencerás - SEO técnico
Agrupa y vencerás - SEO técnico
 
Google Search Console - el dato de Schrödinger
Google Search Console - el dato de  SchrödingerGoogle Search Console - el dato de  Schrödinger
Google Search Console - el dato de Schrödinger
 
Que no te den dato por liebre - enpresadigitala 2022
Que no te den dato por liebre - enpresadigitala 2022Que no te den dato por liebre - enpresadigitala 2022
Que no te den dato por liebre - enpresadigitala 2022
 
SeoQL: SQL para SEO
SeoQL: SQL para SEOSeoQL: SQL para SEO
SeoQL: SQL para SEO
 
Obtener un listado de keywords en base a su potencial SEO (Google Search Cons...
Obtener un listado de keywords en base a su potencial SEO (Google Search Cons...Obtener un listado de keywords en base a su potencial SEO (Google Search Cons...
Obtener un listado de keywords en base a su potencial SEO (Google Search Cons...
 
Search Console, descifrando las cifras
Search Console, descifrando las cifrasSearch Console, descifrando las cifras
Search Console, descifrando las cifras
 
Seo Técnico - Del mito al dato - Seonthebeach 2018
Seo Técnico - Del mito al dato - Seonthebeach 2018Seo Técnico - Del mito al dato - Seonthebeach 2018
Seo Técnico - Del mito al dato - Seonthebeach 2018
 
eShow 2017 SEO grandes webs - Lino urunuela
eShow 2017 SEO grandes webs - Lino urunuelaeShow 2017 SEO grandes webs - Lino urunuela
eShow 2017 SEO grandes webs - Lino urunuela
 
Optimiza tu crawl budget se onthebeach 2017
Optimiza tu crawl budget   se onthebeach 2017Optimiza tu crawl budget   se onthebeach 2017
Optimiza tu crawl budget se onthebeach 2017
 
Cómo hacer una migración y no morir en el intento
Cómo hacer una migración y no morir en el intentoCómo hacer una migración y no morir en el intento
Cómo hacer una migración y no morir en el intento
 
Seo Logs y Big Data, Lino Uruñuela en Seonthebeach 2016
Seo Logs y Big Data, Lino Uruñuela en Seonthebeach 2016Seo Logs y Big Data, Lino Uruñuela en Seonthebeach 2016
Seo Logs y Big Data, Lino Uruñuela en Seonthebeach 2016
 
SEO para periodistas por Lino Uruñuela (2008)
SEO para periodistas por Lino Uruñuela (2008)SEO para periodistas por Lino Uruñuela (2008)
SEO para periodistas por Lino Uruñuela (2008)
 
Monitorizar GoogleBot usando Google Analytics por Lino Uruñuela
Monitorizar GoogleBot usando Google Analytics por Lino UruñuelaMonitorizar GoogleBot usando Google Analytics por Lino Uruñuela
Monitorizar GoogleBot usando Google Analytics por Lino Uruñuela
 

Último

actividad.06_crea_un_recurso_multimedia_M01_S03_M01.ppsx
actividad.06_crea_un_recurso_multimedia_M01_S03_M01.ppsxactividad.06_crea_un_recurso_multimedia_M01_S03_M01.ppsx
actividad.06_crea_un_recurso_multimedia_M01_S03_M01.ppsx241532171
 
Historia de la Medicina y bases para desarrollo de ella
Historia de la Medicina y bases para desarrollo de ellaHistoria de la Medicina y bases para desarrollo de ella
Historia de la Medicina y bases para desarrollo de ellajuancamilo3111391
 
CamposGarcia_MariaMagdalena_M1S3AI6.pptx
CamposGarcia_MariaMagdalena_M1S3AI6.pptxCamposGarcia_MariaMagdalena_M1S3AI6.pptx
CamposGarcia_MariaMagdalena_M1S3AI6.pptx241518192
 
COMPETENCIAS CIUDADANASadadadadadadada .pdf
COMPETENCIAS CIUDADANASadadadadadadada .pdfCOMPETENCIAS CIUDADANASadadadadadadada .pdf
COMPETENCIAS CIUDADANASadadadadadadada .pdfOscarBlas6
 
2º SOY LECTOR PART 2- MD EDUCATIVO (6).pdf
2º SOY LECTOR PART 2- MD  EDUCATIVO (6).pdf2º SOY LECTOR PART 2- MD  EDUCATIVO (6).pdf
2º SOY LECTOR PART 2- MD EDUCATIVO (6).pdfFernandaHernandez312615
 
locomotas v siclo.ppt de ingenieria de minas
locomotas v siclo.ppt de ingenieria de minaslocomotas v siclo.ppt de ingenieria de minas
locomotas v siclo.ppt de ingenieria de minasMirkaCBauer
 
Producto académico 03 - Habilidades Comunicativas.pptx
Producto académico 03 - Habilidades Comunicativas.pptxProducto académico 03 - Habilidades Comunicativas.pptx
Producto académico 03 - Habilidades Comunicativas.pptx46828205
 
FLUIDEZ-Teatro-Leido-4to-Grado-El-leon-y-el-raton- (1).pdf
FLUIDEZ-Teatro-Leido-4to-Grado-El-leon-y-el-raton- (1).pdfFLUIDEZ-Teatro-Leido-4to-Grado-El-leon-y-el-raton- (1).pdf
FLUIDEZ-Teatro-Leido-4to-Grado-El-leon-y-el-raton- (1).pdfYuriFuentesMartinez2
 
PRIMARIA 1. RESUELVE PROBLEMAS DE FORMA MOVIMIENTO Y LOCALIZACIÓN 2 (2).pptx
PRIMARIA 1. RESUELVE PROBLEMAS DE FORMA MOVIMIENTO Y LOCALIZACIÓN 2 (2).pptxPRIMARIA 1. RESUELVE PROBLEMAS DE FORMA MOVIMIENTO Y LOCALIZACIÓN 2 (2).pptx
PRIMARIA 1. RESUELVE PROBLEMAS DE FORMA MOVIMIENTO Y LOCALIZACIÓN 2 (2).pptxRodriguezLucero
 
Institucion educativa la esperanza sede la magdalena
Institucion educativa la esperanza sede la magdalenaInstitucion educativa la esperanza sede la magdalena
Institucion educativa la esperanza sede la magdalenadanielaerazok
 
MODELO CARACTERIZACION DE PROCESOS SENA.
MODELO CARACTERIZACION DE PROCESOS SENA.MODELO CARACTERIZACION DE PROCESOS SENA.
MODELO CARACTERIZACION DE PROCESOS SENA.imejia2411
 
INSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENA
INSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENAINSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENA
INSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENAdanielaerazok
 
rodriguez_DelAngel_MariaGPE_M1S3AL6.pptx
rodriguez_DelAngel_MariaGPE_M1S3AL6.pptxrodriguez_DelAngel_MariaGPE_M1S3AL6.pptx
rodriguez_DelAngel_MariaGPE_M1S3AL6.pptxssuser61dda7
 
institucion educativa la esperanza sede magdalena
institucion educativa la esperanza sede magdalenainstitucion educativa la esperanza sede magdalena
institucion educativa la esperanza sede magdalenajuniorcuellargomez
 
libro de Ciencias Sociales_6to grado.pdf
libro de Ciencias Sociales_6to grado.pdflibro de Ciencias Sociales_6to grado.pdf
libro de Ciencias Sociales_6to grado.pdfFAUSTODANILOCRUZCAST
 
3Mayo2023 Taller construcción de Prototipos.pptx
3Mayo2023 Taller construcción de Prototipos.pptx3Mayo2023 Taller construcción de Prototipos.pptx
3Mayo2023 Taller construcción de Prototipos.pptxadso2024sena
 
Buscadores, SEM SEO: el desafío de ser visto en la web
Buscadores, SEM SEO: el desafío de ser visto en la webBuscadores, SEM SEO: el desafío de ser visto en la web
Buscadores, SEM SEO: el desafío de ser visto en la webDecaunlz
 
El uso de las tic en la vida continúa , ambiente positivo y negativo.
El uso de las tic  en la vida continúa , ambiente positivo y negativo.El uso de las tic  en la vida continúa , ambiente positivo y negativo.
El uso de las tic en la vida continúa , ambiente positivo y negativo.ayalayenifer617
 

Último (18)

actividad.06_crea_un_recurso_multimedia_M01_S03_M01.ppsx
actividad.06_crea_un_recurso_multimedia_M01_S03_M01.ppsxactividad.06_crea_un_recurso_multimedia_M01_S03_M01.ppsx
actividad.06_crea_un_recurso_multimedia_M01_S03_M01.ppsx
 
Historia de la Medicina y bases para desarrollo de ella
Historia de la Medicina y bases para desarrollo de ellaHistoria de la Medicina y bases para desarrollo de ella
Historia de la Medicina y bases para desarrollo de ella
 
CamposGarcia_MariaMagdalena_M1S3AI6.pptx
CamposGarcia_MariaMagdalena_M1S3AI6.pptxCamposGarcia_MariaMagdalena_M1S3AI6.pptx
CamposGarcia_MariaMagdalena_M1S3AI6.pptx
 
COMPETENCIAS CIUDADANASadadadadadadada .pdf
COMPETENCIAS CIUDADANASadadadadadadada .pdfCOMPETENCIAS CIUDADANASadadadadadadada .pdf
COMPETENCIAS CIUDADANASadadadadadadada .pdf
 
2º SOY LECTOR PART 2- MD EDUCATIVO (6).pdf
2º SOY LECTOR PART 2- MD  EDUCATIVO (6).pdf2º SOY LECTOR PART 2- MD  EDUCATIVO (6).pdf
2º SOY LECTOR PART 2- MD EDUCATIVO (6).pdf
 
locomotas v siclo.ppt de ingenieria de minas
locomotas v siclo.ppt de ingenieria de minaslocomotas v siclo.ppt de ingenieria de minas
locomotas v siclo.ppt de ingenieria de minas
 
Producto académico 03 - Habilidades Comunicativas.pptx
Producto académico 03 - Habilidades Comunicativas.pptxProducto académico 03 - Habilidades Comunicativas.pptx
Producto académico 03 - Habilidades Comunicativas.pptx
 
FLUIDEZ-Teatro-Leido-4to-Grado-El-leon-y-el-raton- (1).pdf
FLUIDEZ-Teatro-Leido-4to-Grado-El-leon-y-el-raton- (1).pdfFLUIDEZ-Teatro-Leido-4to-Grado-El-leon-y-el-raton- (1).pdf
FLUIDEZ-Teatro-Leido-4to-Grado-El-leon-y-el-raton- (1).pdf
 
PRIMARIA 1. RESUELVE PROBLEMAS DE FORMA MOVIMIENTO Y LOCALIZACIÓN 2 (2).pptx
PRIMARIA 1. RESUELVE PROBLEMAS DE FORMA MOVIMIENTO Y LOCALIZACIÓN 2 (2).pptxPRIMARIA 1. RESUELVE PROBLEMAS DE FORMA MOVIMIENTO Y LOCALIZACIÓN 2 (2).pptx
PRIMARIA 1. RESUELVE PROBLEMAS DE FORMA MOVIMIENTO Y LOCALIZACIÓN 2 (2).pptx
 
Institucion educativa la esperanza sede la magdalena
Institucion educativa la esperanza sede la magdalenaInstitucion educativa la esperanza sede la magdalena
Institucion educativa la esperanza sede la magdalena
 
MODELO CARACTERIZACION DE PROCESOS SENA.
MODELO CARACTERIZACION DE PROCESOS SENA.MODELO CARACTERIZACION DE PROCESOS SENA.
MODELO CARACTERIZACION DE PROCESOS SENA.
 
INSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENA
INSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENAINSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENA
INSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENA
 
rodriguez_DelAngel_MariaGPE_M1S3AL6.pptx
rodriguez_DelAngel_MariaGPE_M1S3AL6.pptxrodriguez_DelAngel_MariaGPE_M1S3AL6.pptx
rodriguez_DelAngel_MariaGPE_M1S3AL6.pptx
 
institucion educativa la esperanza sede magdalena
institucion educativa la esperanza sede magdalenainstitucion educativa la esperanza sede magdalena
institucion educativa la esperanza sede magdalena
 
libro de Ciencias Sociales_6to grado.pdf
libro de Ciencias Sociales_6to grado.pdflibro de Ciencias Sociales_6to grado.pdf
libro de Ciencias Sociales_6to grado.pdf
 
3Mayo2023 Taller construcción de Prototipos.pptx
3Mayo2023 Taller construcción de Prototipos.pptx3Mayo2023 Taller construcción de Prototipos.pptx
3Mayo2023 Taller construcción de Prototipos.pptx
 
Buscadores, SEM SEO: el desafío de ser visto en la web
Buscadores, SEM SEO: el desafío de ser visto en la webBuscadores, SEM SEO: el desafío de ser visto en la web
Buscadores, SEM SEO: el desafío de ser visto en la web
 
El uso de las tic en la vida continúa , ambiente positivo y negativo.
El uso de las tic  en la vida continúa , ambiente positivo y negativo.El uso de las tic  en la vida continúa , ambiente positivo y negativo.
El uso de las tic en la vida continúa , ambiente positivo y negativo.
 

SEO desde la línea de comandos

  • 1. From Shell to SEO and beyond Desde la línea de comandos
  • 2. Ya sea porque no hay otra manera, o porque es la más eficaz, si trabajas con big data, el terminal aprenderás! La línea de comandos
  • 3. 01 Los básicos Hay cuatro o cinco comandos que hacen funcionar el mundo, y puede que no sea coña… Ya sea porque no hay otra manera, o porque es la más eficaz, si trabajas con big data, el terminal aprenderás! La línea de comandos
  • 4. Cuatro o cinco comandos son habitualmente utilizados 01 Los básicos grep sed cat
  • 5. cat grep sed Cuatro o cinco comandos son habitualmente utilizados 01 Los básicos Ver el contenido de un archivo
  • 6. grep sed Filtrar usando regex el contenido de un archivo Cuatro o cinco comandos son habitualmente utilizados 01 Los básicos cat Ver el contenido de un archivo
  • 7. Cuatro o cinco comandos son habitualmente utilizados sed Sustituir patrones en el contenido de un archivo 01 Los básicos grep Filtrar usando regex el contenido de un archivo cat Ver el contenido de un archivo
  • 8. 01 cat cat ejemploFicheroTexto.txt <?xml version="1.0" encoding="utf-8" ?><transcript><text start="0" dur="0.5"></text><text start="0.5" dur="2.86">[MÚSICA ELECTRÓNICA]</text> <text start="3.36" dur="7.21"></text><text start="10.57" dur="2.37">JOHN MUELLER: Bienvenidos todos al próximo episodio</text><text start="12.94" dur="3.48">de &amp;quot;Search Off the Record&amp;quot;, un podcast que estamos probando.</text><text start="16.42" dur="2.52">Nuestro plan es hablar un poco sobre lo que</text><text start="18.94" dur="2.55">sucede en Google detrás de escena</text><text start="21.49" dur="2.77">y tal vez divertirnos un poco en el camino.</text><text start="24.26" dur="2.45">Mi nombre es John Mueller, un promotor de búsqueda</text><text start="26.71" dur="3.97">en el equipo de relaciones de búsqueda aquí en Google en Suiza.</text><text start="30.68" dur="5">Y me acompañan Martin y Gary, que también están en el equipo.</text><text start="35.68" dur="0.668">MARTÍN: Hola.</text><text start="36.348" dur="1.042"> JOHN MUELLER: Hola, Martín.</text><text start="37.39" dur="1.08">Hola, Gary.</text><text start="38.47" dur="1.02">GARY: [NO EN INGLÉS]</text> <text start="39.49" dur="1.125">JOHN MUELLER: Buenos días.</text><text start="40.615" dur="1.765">Así que hemos hecho una serie de episodios ahora.</text><text start="42.38" dur="2.45">Y creo que poco a poco le estamos cogiendo el truco. Sin embargo, se</text><text start="44.83" dur="2.91">siente un poco nuevo y emocionante</text><text start="47.74" dur="2.722">cada vez, así que eso es genial. ¿</text>
  • 9. <?xml version="1.0" encoding="utf-8" ?><transcript> <text start="0" dur="0.5"></text> <text start="0.5" dur="2.86">MÚSICA ELECTRÓNICA</text> <text start="3.36" dur="7.21"></text> <text start="10.57" dur="2.37">JOHN MUELLER: Bienvenidos todos al próximo episodio</text> <text start="12.94" dur="3.48">de &amp;quot;Search Off the Record&amp;quot;, un podcast que estamos probando.</text> <text start="16.42" dur="2.52">Nuestro plan es hablar un poco sobre lo que</text> <text start="18.94" dur="2.55">sucede en Google detrás de escena</text> <text start="21.49" dur="2.77">y tal vez divertirnos un poco en el camino.</text> <text start="24.26" dur="2.45">Mi nombre es John Mueller, un promotor de búsqueda</text> a <text start="30.68" dur="5">Y me acompañan Martin y Gary, que también están en el equipo</text> <text start="35.68" dur="0.668">MARTÍN: Hola.</text> <text start="36.348" dur="1.042"> JOHN MUELLER: Hola, Martín.</text> <text start="37.39" dur="1.08">Hola, Gary.</text> <text start==""38.47" dur="1.02">GARY: [NO EN INGLÉS]</text> <?xml version="1.0" encoding="utf-8" ?><transcript> <text start="0" dur="0.5"></text> <text start="0.5" dur="2.86">MÚSICA ELECTRÓNICA</text> <text start="3.36" dur="7.21"></text> <text start="10.57" dur="2.37">JOHN MUELLER: Bienvenidos todos al próximo episodio</text> <text start="12.94" dur="3.48">de &amp;quot;Search Off the Record&amp;quot;, un podcast que estamos probando.</text> <text start="16.42" dur="2.52">Nuestro plan es hablar un poco sobre lo que</text> <text start="18.94" dur="2.55">sucede en Google detrás de escena</text> <text start="21.49" dur="2.77">y tal vez divertirnos un poco en el camino.</text> <text start="24.26" dur="2.45">Mi nombre es John Mueller, un promotor de búsqueda</text> a <text start="30.68" dur="5">Y me acompañan Martin y Gary, que también están en el equipo</text> <text start="35.68" dur="0.668">MARTÍN: Hola.</text> <text start="36.348" dur="1.042"> JOHN MUELLER: Hola, Martín.</text> <text start="37.39" dur="1.08">Hola, Gary.</text> <text start==""38.47" dur="1.02">GARY: [NO EN INGLÉS]</text> 01 cat + sed cat ejemploFicheroTexto.txt |sed 's/<text star/n<text star/g'
  • 10. 02 Los imprescindibles Su uso básico es “sencillo”, pero son comandos con muchísimas opciones. También hay otros comandos que son muy versátiles, sobretodo para SEOs La línea de comandos
  • 11. Su uso básico es “sencillo”, pero son comandos con muchísimas opciones. No te das cuenta de su valor hasta que los usas de manera recurrente. 02 Los imprescindibles wget xargs curl
  • 12. Navega accede a una URL El mundo no funcionaría sin ellos. 02 Los imprescindibles wget xargs curl
  • 13. wget Navega accede a una URL El mundo no funcionaría sin ellos. 02 Los imprescindibles Navega accede a una URL curl xargs
  • 14. Navaja Suiza Vale para muchas cosas.. OjO puede ser catastrófico El mundo no funcionaría sin ellos. 02 Los imprescindibles wget Navega accede a una URL Navega accede a una URL curl xargs
  • 15. 02 wget wget --quiet https://www.booking.com/robots.txt -O - Robots.txt
  • 16. 02 wget wget --quiet https://www.booking.com/robots.txt -O - Robots.txt
  • 17. 02 wget + grep wget --quiet https://www.booking.com/robots.txt -O -| grep Sitemap Sitemap: https://www.booking.com/sitembk-airport-index.xml Sitemap: https://www.booking.com/sitembk-articles-index.xml Sitemap: https://www.booking.com/sitembk-attractions-index.xml Sitemap: https://www.booking.com/sitembk-beaches-index.xml Sitemap: https://www.booking.com/sitembk-beach-holidays-index.xml Sitemap: https://www.booking.com/sitembk-cars-airport-index.xml Sitemap: https://www.booking.com/sitembk-cars-city-index.xml Sitemap: https://www.booking.com/sitembk-cars-country-index.xml Sitemap: https://www.booking.com/sitembk-cars-region-index.xml Sitemap: https://www.booking.com/sitembk-city-index.xml Sitemap: https://www.booking.com/sitembk-city-review-index.xml Sitemap: https://www.booking.com/sitembk-communities-index.xml Sitemap: https://www.booking.com/sitembk-country-index.xml Sitemap: https://www.booking.com/sitembk-country-review-index.xml Sitemap: https://www.booking.com/sitembk-district-index.xml Sitemap: https://www.booking.com/sitembk-flights-index.xml Sitemap: https://www.booking.com/sitembk-flights-priority-index.xml Sitemap: https://www.booking.com/sitembk-flights-country-index.xml Sitemap: https://www.booking.com/sitembk-flights-to-region-index.xml Sitemap: https://www.booking.com/sitembk-flights-to-city-index.xml Sitemap: https://www.booking.com/sitembk-flights-to-airport-index.xml Sitemap: https://www.booking.com/sitembk-fraud-index.xml
  • 18. 02 wget + grep + sed wget -q https://www.booking.com/robots.txt -O - | grep Sitemap | sed 's/Sitemap: //g' https://www.booking.com/sitembk-airport-index.xml https://www.booking.com/sitembk-articles-index.xml https://www.booking.com/sitembk-attractions-index.xml https://www.booking.com/sitembk-beaches-index.xml https://www.booking.com/sitembk-beach-holidays-index.xml https://www.booking.com/sitembk-cars-airport-index.xml https://www.booking.com/sitembk-cars-city-index.xml https://www.booking.com/sitembk-cars-country-index.xml https://www.booking.com/sitembk-cars-region-index.xml https://www.booking.com/sitembk-city-index.xml https://www.booking.com/sitembk-city-review-index.xml https://www.booking.com/sitembk-communities-index.xml https://www.booking.com/sitembk-country-index.xml https://www.booking.com/sitembk-country-review-index.xml https://www.booking.com/sitembk-district-index.xml https://www.booking.com/sitembk-flights-index.xml https://www.booking.com/sitembk-flights-priority-index.xml https://www.booking.com/sitembk-flights-country-index.xml https://www.booking.com/sitembk-flights-to-region-index.xml https://www.booking.com/sitembk-flights-to-city-index.xml https://www.booking.com/sitembk-flights-to-airport-index.xml https://www.booking.com/sitembk-fraud-index.xml
  • 19. 02 wget + grep + sed wget -q https://www.booking.com/robots.txt -O - | grep Sitemap | sed 's/Sitemap: //g' https://www.booking.com/sitembk-airport-index.xml https://www.booking.com/sitembk-articles-index.xml https://www.booking.com/sitembk-attractions-index.xml https://www.booking.com/sitembk-beaches-index.xml https://www.booking.com/sitembk-beach-holidays-index.xml https://www.booking.com/sitembk-cars-airport-index.xml https://www.booking.com/sitembk-cars-city-index.xml https://www.booking.com/sitembk-cars-country-index.xml https://www.booking.com/sitembk-cars-region-index.xml https://www.booking.com/sitembk-city-index.xml https://www.booking.com/sitembk-city-review-index.xml https://www.booking.com/sitembk-communities-index.xml https://www.booking.com/sitembk-country-index.xml https://www.booking.com/sitembk-country-review-index.xml https://www.booking.com/sitembk-district-index.xml https://www.booking.com/sitembk-flights-index.xml https://www.booking.com/sitembk-flights-priority-index.xml https://www.booking.com/sitembk-flights-country-index.xml https://www.booking.com/sitembk-flights-to-region-index.xml https://www.booking.com/sitembk-flights-to-city-index.xml https://www.booking.com/sitembk-flights-to-airport-index.xml https://www.booking.com/sitembk-fraud-index.xml
  • 20. 02 wget wget https://www.booking.com/sitembk-airport-index.xml -O - <?xml version="1.0" encoding="UTF-8"?> <sitemapindex xmlns="http://www.google.com/schemas/sitemap/0.9"> <sitemap><loc>https://www.booking.com/sitembk-airport-en-gb.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap> <sitemap><loc>https://www.booking.com/sitembk-airport-ro.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap> <sitemap><loc>https://www.booking.com/sitembk-airport-ja.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap> <sitemap><loc>https://www.booking.com/sitembk-airport-sl.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap> <sitemap><loc>https://www.booking.com/sitembk-airport-hr.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap> <sitemap><loc>https://www.booking.com/sitembk-airport-ko.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap> <sitemap><loc>https://www.booking.com/sitembk-airport-el.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap> <sitemap><loc>https://www.booking.com/sitembk-airport-es-ar.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap> <sitemap><loc>https://www.booking.com/sitembk-airport-et.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap> <sitemap><loc>https://www.booking.com/sitembk-airport-ca.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap> <sitemap><loc>https://www.booking.com/sitembk-airport-de.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap> <sitemap><loc>https://www.booking.com/sitembk-airport-lv.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap> <sitemap><loc>https://www.booking.com/sitembk-airport-sr.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap> <sitemap><loc>https://www.booking.com/sitembk-airport-id.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap> <sitemap><loc>https://www.booking.com/sitembk-airport-ar.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap> <sitemap><loc>https://www.booking.com/sitembk-airport-no.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap> <sitemap><loc>https://www.booking.com/sitembk-airport-he.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
  • 21. 02 wget wget https://www.booking.com/sitembk-airport-index.xml -O - <?xml version="1.0" encoding="UTF-8"?> <sitemapindex xmlns="http://www.google.com/schemas/sitemap/0.9"> <sitemap><loc>https://www.booking.com/sitembk-airport-en-gb.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap> <sitemap><loc>https://www.booking.com/sitembk-airport-ro.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap> <sitemap><loc>https://www.booking.com/sitembk-airport-ja.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap> <sitemap><loc>https://www.booking.com/sitembk-airport-sl.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap> <sitemap><loc>https://www.booking.com/sitembk-airport-hr.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap> <sitemap><loc>https://www.booking.com/sitembk-airport-ko.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap> <sitemap><loc>https://www.booking.com/sitembk-airport-el.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap> <sitemap><loc>https://www.booking.com/sitembk-airport-es-ar.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap> <sitemap><loc>https://www.booking.com/sitembk-airport-et.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap> <sitemap><loc>https://www.booking.com/sitembk-airport-ca.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap> <sitemap><loc>https://www.booking.com/sitembk-airport-de.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap> <sitemap><loc>https://www.booking.com/sitembk-airport-lv.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap> <sitemap><loc>https://www.booking.com/sitembk-airport-sr.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap> <sitemap><loc>https://www.booking.com/sitembk-airport-id.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap> <sitemap><loc>https://www.booking.com/sitembk-airport-ar.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap> <sitemap><loc>https://www.booking.com/sitembk-airport-no.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap> <sitemap><loc>https://www.booking.com/sitembk-airport-he.0000.xml.gz</loc><lastmod>2023-06-06</lastmod></sitemap>
  • 22. 02 wget + zcat wget https://www.booking.com/sitembk-airport-en-gb.0000.xml.gz -O -|zcat <?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.google.com/schemas/sitemap/0.9"> <url> <loc>https://www.booking.com/airport/us/atl.en-gb.html</loc> <lastmod>2023-06-11</lastmod> <changefreq>daily</changefreq> <priority>0.6</priority> </url> <url> <loc>https://www.booking.com/airport/us/ord.en-gb.html</loc> <lastmod>2023-06-11</lastmod> <changefreq>daily</changefreq> <priority>0.6</priority> </url> <url> <loc>https://www.booking.com/airport/us/lax.en-gb.html</loc> <lastmod>2023-06-11</lastmod> <changefreq>daily</changefreq> <priority>0.6</priority> </url> <url> <loc>https://www.booking.com/airport/gb/lhr.en-gb.html</loc>
  • 23. 02 wget + grep + xargs + while wget -q https://www.booking.com/robots.txt -O - | grep 'Sitemap'|sed 's/Sitemap: //g'|xargs -I{} wget -q - {} -O - | grep -Eo "https?://[^<]+.*xml.gz" |while read filas; do wget -q $filas -O -|zcat | grep -Eo "https?://[^<]+">> URLsBooking.txt;done
  • 24. 02 wget + grep + xargs + while wget -q https://www.booking.com/robots.txt -O - | grep 'Sitemap'|sed 's/Sitemap: //g'|xargs -I{} wget -q - {} -O - | grep -Eo "https?://[^<]+.*xml.gz" |while read filas; do wget -q $filas -O -|zcat | grep -Eo "https?://[^<]+">> URLsBooking.txt;done wget -q https://www.booking.com/robots.txt -O - | grep 'Sitemap' |sed 's/Sitemap: //g' |xargs -I{} wget -q - {} -O - | grep -Eo "https?://[^<]+.*xml.gz" |while read filas; do wget -q $filas -O - |zcat | grep -Eo "https?://[^<]+" >> URLsBooking.txt; done
  • 25. 02 wget + grep + xargs + while 177.261.544 URLs Ni nuestro fiel Screaming Frog puede con ello wget -q https://www.booking.com/robots.txt -O - | grep 'Sitemap'|sed 's/Sitemap: //g'|xargs -I{} wget -q - {} -O - | grep -Eo "https?://[^<]+.*xml.gz" |while read filas; do wget -q $filas -O -|zcat | grep -Eo "https?://[^<]+">> URLsBooking.txt;done 12 GB txt de URLs ¿Cómo lo abrirías?
  • 26. 03 Las fuentes de datos Hay una gran cantidad de fuentes de datos que podemos usar para muy diversas tareas. Os dejo algunas que creo útiles para cualquier SEO No hace falta saber programar, ni instalar pesadas librerías… Python está sobrevalorado La línea de comandos
  • 27. cat KwsInicial.csv camisetas básicas de manga corta iphone iphone 13 vaqueros de corte recto para mujer motorola edge 20 pro nokia x20 vivo x60 pro+ realme gt 5g asus rog phone 5 lenovo legion phone duel 2 zte axon 30 ultra tcl 20 pro 5g black shark 4 pro redmi note 10 pro vestidos casuales de verano 03 Las fuentes de datos Datos de APIs
  • 28. wget -q 'https://db2.keywordsur.fr/keyword_surf er_keywords?country=ES&keywords=[%22iph one%2013%22]' --output-document - {"iphone 13" :{"categories":[10007,10019,10167,10878,11511,12161,13054,13381,13419], "competition":1.0,"cpc":0.49,"search_volume":673000,"similar_keywords":[{ "keyword":"el iphone 13" ,"country":"ES","overlapping_pages":9,"search_volume":880,"cpc":0.33},{" keyword":"precio iphone 13", "country":"ES","overlapping_pages":7,"search_volume":14800,"cpc":0.16},{ "keyword":"precio del iphone 13", "country":"ES","overlapping_pages":7,"search_volume":1900,"cpc":0.16},{ "keyword":"apple iphone 13", "country":"ES","overlapping_pages":6,"search_volume":12100,"cpc":0.51},{ "keyword":"iphone 13 apple", "country":"ES","overlapping_pages":6,"search_volume":3600,"cpc":0.51},{ "keyword":"oferta iphone 13", "country":"ES","overlapping_pages":6,"search_volume":2400,"cpc":0.86},{ "keyword":"iphone trece", "country":"ES","overlapping_pages":6,"search_volume":480,"cpc":0.46},{ "keyword":"iphone 13 precio", "country":"ES","overlapping_pages":5,"search_volume":22200,"cpc":0.29},{ "keyword":"iphone 13 precios", "country":"ES","overlapping_pages":5,"search_volume":22200,"cpc":0.17},{ "keyword":"iphone 13: precio", "country":"ES","overlapping_pages":5,"search_volume":22200,"cpc":0.17}]} https://db2.keywordsur.fr/keyword_surfer_keywords?country=ES&keywords=[%22iphone%2013%22] 03 Las fuentes de datos Datos de APIs → Keywordsur
  • 29. cat KwsInicial.csv| xargs -I{} wget -q 'https://db2.keywordsur.fr/keyword_surf er_keywords?country=ES&keywords=[%22{}% 22]' --output-document - | jq>>outTextFile.txt 03 Las fuentes de datos Datos de APIs → Keywordsur
  • 30. cat KwsInicial.csv |sed 's/ /+/g'|while read palabra;do sqlCH "select kw,vol as Volume,arrayJoin(rel).1 RelatedKW,arrayJoin(rel).2 VolumeRelatedKw from (select kw,vol,arrayMap(x->(x.1,x.4),todo.2.5) as rel from (select arrayJoin(arrayZip(keys,values)) as todo, todo.1 as kw,todo.2.4 vol ,arrayZip(arrayMap(x->x.1,todo.2.5) ,arrayMap(x->x.3,todo.2.5)) as resto from ( select arrayMap(x -> x.1, JSONExtractKeysAndValues(html, 'String')) as keys, arrayMap(x -> x.2, JSONExtractKeysAndValues(html, 'Tuple(Array(UInt64), Float64, Float64, UInt64,Array(Tuple(String,UInt64,UInt64,Float64)))' )) as values FROM url(concat('http://db2.keywordsur.fr/keyword_surfer _keywords?country=ES&keywords=[%22',replaceRegexpAl l(normalizeUTF8NFD(lowerUTF8('$palabra')), 'pM', ''),'%22]'), JSONAsString, 'html String')))) order by Volume desc,VolumeRelatedKw desc FORMAT Pretty";done 03 Las fuentes de datos Datos de APIs → Keywordsur
  • 31. wget -q 'https://v7.authoritas.com/api/v3/visib ility-explorer/ranking/keywords/es_es?d omains%5B%5D=openai.com' --output-document - {"total":1000,"items":[{"openai.com":{"potentialVisibilityScoreInc":0,"searchVol ume":4400,"cpc":16,"universalRank":1,"visibilityIndex":1485.97998046875,"kw ResultTypes":{"related_search":8,"location":1,"people_also_ask":4,"video":3,"k nowledge_graph":1,"organic":98},"userIntent":{"informational":33,"research":3 3,"transactional":33},"fullUrl":"openai.com/research/whisper","domain":"open ai.com","keyword":"whisper","resultType":"organic","visibilityIndexShare":0.45 75653271691231,"universalRankDeltas":0},"potentialVisibilityScoreInc":0,"sea rchVolume":4400,"cpc":16,"universalRank":1,"visibilityIndex":1485.979980468 75,"kwResultTypes":{"related_search":8,"location":1,"people_also_ask":4,"vid eo":3,"knowledge_graph":1,"organic":98},"userIntent":{"informational":33,"rese arch":33,"transactional":33},"fullUrl":"openai.com/research/whisper","domain" :"openai.com","keyword":"whisper","resultType":"organic","visibilityIndexShare ":0.4575653271691231},{"openai.com":{"potentialVisibilityScoreInc":98.59999 84741211,"searchVolume":2900,"cpc":0,"universalRank":3,"visibilityIndex":37 0.1499938964844,"kwResultTypes":{"news":2,"navigation":1,"see_results_ab out":2,"location":1,"people_also_ask":4,"video":4,"knowledge_graph":1,"organi c":96},"userIntent":{"informational":33},"fullUrl":"openai.com/product/gpt-4","d omain":"openai.com","keyword":"g p t","resultType":"organic","visibilityIndexShare":0.11397717686981691},"potenti alVisibilityScoreInc":98.5999984741211,"searchVolume":2900,"cpc":0,"univer salRank":3,"visibilityIndex":370.1499938964844,"kwResultTypes":{"news":2,"n avigation":1,"see_results_about":2,"location":1,"people_also_ask":4,"video":4," knowledge_graph":1,"organic":96},"userIntent":{"informational":33},"fullUrl":"op enai.com/product/gpt-4","domain":"openai.com","keyword":"g p https://v7.authoritas.com/api/v3/visibility-explorer/ranking/keywords/es_es?domains%5B%5D=openai.com 03 Las fuentes de datos Datos de APIs → Authoritas
  • 32. wget -q 'https://v7.authoritas.com/api/v3/visib ility-explorer/ranking/keywords/es_es?d omains%5B%5D=openai.com' --output-document - { "openai.com": { "potentialVisibilityScoreInc": 0, "searchVolume": 4400, "cpc": 16, "universalRank": 1, "visibilityIndex": 1485.97998046875, "kwResultTypes": { "related_search": 8, "location": 1, "people_also_ask": 4, "video": 3, "knowledge_graph": 1, "organic": 98}, "userIntent": { "informational": 33, "research": 33, "transactional": 33 }, "fullUrl": "openai.com/research/whisper", "domain": "openai.com", "keyword": "whisper", "resultType": "organic", "visibilityIndexShare": 0.4575653271691231, https://v7.authoritas.com/api/v3/visibility-explorer/ranking/keywords/es_es?domains%5B%5D=openai.com 03 Las fuentes de datos Datos de APIs → Authoritas
  • 34. cat KwsInicial|sed 's/ /+/g'|xargs -P11 -I{} curl -s -w "n" "https://completion.amazon.co.uk/api/2017/su ggestions?prefix={}&suffix=&session-id=260-6 261272-2261010&customer-id=A2HLNXM8V9BK5Z&re quest-id=65EXKVSV12216V211E18&page-type=Gate way&lop=es_ES&site-variant=mobile&client-inf o = amazon-search-ui&mid=A1RKKUPIHCS9HS&alias=ap s&event=onLoad&limit=141&suggestion-type=KEY WORD&suggestion-type=WIDGET&_=1589523257903" |grep -e '^{"alias"'|sed -E 's/"shuffled":false}(.*)?$/"shuffled":false }/g' 's/"shuffled":false}(.*)?$ /"s huffled":false}/g' {"alias":"aps","prefix": "iphone 13","suffix":"","suggestions":[{"suggType":"KeywordSuggestion","type": "KEYWORD","value":"iphone 13" ,"refTag":"nb_sb_ss_ts-doa-p_1_9","candidateSources":"local","strategyId":"ts-doa-p","strategyApiTy pe":"RANK","prior":0.0,"ghost":false,"help":false},{"suggType":"KeywordSuggestion","type": "KEYWORD","value":"iphone 13 pro max" ,"refTag":"nb_sb_ss_ts-doa-p_2_9","candidateSources":"local","strategyId":"ts-doa-p","strategyApiTy pe":"RANK","prior":0.0,"ghost":false,"help":false},{"suggType":"KeywordSuggestion","type": "KEYWORD","value":"iphone 13 pro" ,"refTag":"nb_sb_ss_ts-doa-p_3_9","candidateSources":"local","strategyId":"ts-doa-p","strategyApiTy pe":"RANK","prior":0.0,"ghost":false,"help":false},{"suggType":"KeywordSuggestion","type": "KEYWORD","value":"iphone 13 mini" ,"refTag":"nb_sb_ss_ts-doa-p_4_9","candidateSources":"local","strategyId":"ts-doa-p","strategyApiTy pe":"RANK","prior":0.0,"ghost":false,"help":false},{"suggType":"KeywordSuggestion","type": "KEYWORD","value":"iphone 13 reacondicionado" ,"refTag":"nb_sb_ss_ts-doa-p_5_9","candidateSources":"local","strategyId":"ts-doa-p","strategyApiTy pe":"RANK","prior":0.0,"ghost":false,"help":false},{"suggType":"KeywordSuggestion","type": "KEYWORD","value":"iphone 13 case" ,"refTag":"nb_sb_ss_ts-doa-p_6_9","candidateSources":"local","strategyId":"ts-doa-p","strategyApiTy pe":"RANK","prior":0.0,"ghost":false,"help":false},{"suggType":"KeywordSuggestion","type": "KEYWORD","value":"iphone 13 pro max 256gb" ,"refTag":"nb_sb_ss_ts-doa-p_7_9","candidateSources":"local","strategyId":"ts-doa-p","strategyApiTy pe":"RANK","prior":0.0,"ghost":false,"help":false},{"suggType":"KeywordSuggestion","type": "KEYWORD","value":"iphone 13 mini reacondicionado" ,"refTag":"nb_sb_ss_ts-doa-p_8_9","candidateSources":"local","strategyId":"ts-doa-p","strategyApiTy pe":"RANK","prior":0.0,"ghost":false,"help":false},{"suggType":"KeywordSuggestion","type": "KEYWORD","value":"iphone 13 pro case" ,"refTag":"nb_sb_ss_ts-doa-p_9_9","candidateSources":"local","strategyId":"ts-doa-p","strategyApiTy pe":"RANK","prior":0.0,"ghost":false,"help":false},{"suggType":"KeywordSuggestion","type": "KEYWORD","value":"iphone 13 256gb" https://completion.amazon.co.uk/api/2017/suggestions?prefix=iphone+13&suffix=&session-id… 03 Las fuentes de datos Datos de APIs → Amazon
  • 35. KWs iniciales "kw","Volume","RelatedKW","VolumeRelatedKw" "iphone 13",673000,"iphone 13 precio",22200 "iphone 13",673000,"iphone 13 precios",22200 "iphone 13",673000,"iphone 13: precio",22200 "iphone 13",673000,"precio iphone 13",14800 "iphone 13",673000,"apple iphone 13",12100 "iphone 13",673000,"iphone 13 apple",3600 "iphone 13",673000,"oferta iphone 13",2400 "iphone 13",673000,"precio del iphone 13",1900 "iphone 13",673000,"el iphone 13",880 "iphone 13",673000,"iphone trece",480 "kw","Volume","RelatedKW","VolumeRelatedKw" "iphone",246000,"iphone iphone",246000 Relacionadas Amazon En paralelo Volumen de búsqueda 03 Las fuentes de datos Datos de APIs xargs -P100 -I{}
  • 36. Para los más vagos o los menos atrevidos, tranquilos, aquí dejo estos ejemplos, además, ya formateados en Google Sheets :) Datos de las APIs en Sheets https://docs.google.com/spreadsheets/d/1Lsw0flyKa6gX0O-8Stnzi8MJcYrLfUG-CZytKT6QmJc/edit#gid=1056179876 Keyword Surfer ● Kws relacionadas ● Volumen de búsqueda Authoritas Amazon ● Kws relacionadas ● Alta disponibilidad ● Datos de dominios ● ¿Actualizada?
  • 37. Existen multitud de programas y scripts que se pueden ejecutar desde el terminal. Además de comandos de Linux
  • 38. Existen multitud de programas y scripts que se pueden ejecutar desde el terminal. Además de comandos de Linux 04 Caso práctico Usaremos yt-dlp para crear un buscador de contenido dentro de una lista de vídeos
  • 39. 04 Caso práctico yt-dlp hace casi cualquier cosa con los vídeos de YouTube Obtenemos el id de la lista de reproducción
  • 40. 04 URL + transcripción de un vídeo yt-dlp --flat-playlist PLKoqnv2vTMUMxMs2PdBlDULqybdlPZxrk -j | jq -r .url>>SORVideos.txt Obtenemos la lista de vídeos
  • 43. https://www.youtube.com/watch?v=AyeD6Y_fLdk https://www.youtube.com/watch?v=92jciJsXtx0 https://www.youtube.com/watch?v=Jm51YBz1jwY https://www.youtube.com/watch?v=rBjeB3HCT-M https://www.youtube.com/watch?v=SOyeNx80fKY https://www.youtube.com/watch?v=xxk2zfPSEP4 https://www.youtube.com/watch?v=NnWuKmXm85w … 04 URL + transcripción de un vídeo yt-dlp --flat-playlist PLKoqnv2vTMUMxMs2PdBlDULqybdlPZxrk -j | jq -r .url>>SORVideos.txt Obtenemos la lista de vídeos yt-dlp --list-subs https://www.youtube.com/watch?v=AyeD6Y_fLdk Obtenemos lista de subtítulos
  • 44. https://www.youtube.com/watch?v=AyeD6Y_fLdk https://www.youtube.com/watch?v=92jciJsXtx0 https://www.youtube.com/watch?v=Jm51YBz1jwY https://www.youtube.com/watch?v=rBjeB3HCT-M https://www.youtube.com/watch?v=SOyeNx80fKY https://www.youtube.com/watch?v=xxk2zfPSEP4 https://www.youtube.com/watch?v=NnWuKmXm85w … 04 URL + transcripción de un vídeo yt-dlp --flat-playlist PLKoqnv2vTMUMxMs2PdBlDULqybdlPZxrk -j | jq -r .url>>SORVideos.txt Obtenemos la lista de vídeos yt-dlp --list-subs https://www.youtube.com/watch?v=AyeD6Y_fLdk Obtenemos lista de subtítulos … sl Slovenian vtt, ttml, srv3, srv2, srv1, json3 so Somali vtt, ttml, srv3, srv2, srv1, json3 st Southern Sotho vtt, ttml, srv3, srv2, srv1, json3 es Spanish vtt, ttml, srv3, srv2, srv1, json3 su Sundanese vtt, ttml, srv3, srv2, srv1, json3 sw Swahili vtt, ttml, srv3, srv2, srv1, json3 sv Swedish vtt, ttml, srv3, srv2, srv1, json3 tg Tajik vtt, ttml, srv3, srv2, srv1, json3 …
  • 45. https://www.youtube.com/watch?v=D3JKwXiO6B4 https://www.youtube.com/watch?v=CSanSWZV_ik https://www.youtube.com/watch?v=PUbNfPJRCsY https://www.youtube.com/watch?v=RZAtINoMVJE https://www.youtube.com/watch?v=MGS9Y42bcO0 https://www.youtube.com/watch?v=Egx9ymxcXnw https://www.youtube.com/watch?v=MRtua44JqqA … { "openai.com": { "potentialVisibilityScoreInc": 0, "searchVolume": 4400, "cpc": 16, "universalRank": 1, "visibilityIndex": 1485.97998046875, "kwResultTypes": { "related_search": 8, "location": 1, "people_also_ask": 4, "video": 3, "knowledge_graph": 1, "organic": 98}, "userIntent": { "informational": 33, "research": 33, "transactional": 33 }, "fullUrl": "openai.com/research/whisper", "domain": "openai.com", "keyword": "whisper", "resultType": "organic", "visibilityIndexShare": 0.4575653271691231, "universalRankDeltas": 0 } yt-dlp --no-abort-on-error --write-auto-sub --sub-lang es --sub-format srv1 --write-description --skip-download -o ./"%(id)s---%(title)s" https://www.youtube.com/watch?v=AyeD6Y_fLdk <?xml version="1.0" encoding="utf-8" ?><transcript><text start="3.06" dur="6.949">[Música]</text><text start="10.16" dur="4.96">hola y bienvenidos a otro episodio de</text><text start="13.019" dur="3.501">búsqueda del registro, un podcast que</text><text start="15.12" dur="3.84">les llega del equipo de búsqueda de Google en el que se</text><text start="16.52" dur="4.599">habla de todo lo relacionado con la búsqueda y se</text><text start="18.96" dur="4.38">divierten en el proceso. Me llamo Martin</text><text start="21.119" dur="4.08">y hoy me acompañan John y Gary</text><text start="23.34" dur="3.42">de el equipo de relaciones de búsqueda del que</text><text start="25.199" dur="3.84">también formo parte</text><text start="26.76" dur="4.98">también gracias a todos los que nos escuchan,</text><text start="29.039" dur="4.501">acabamos de pasar nuestros 2 millones de</text><text start="31.74" dur="3.36">descargas marcadas con este podcast y</text><text start="33.54" dur="3.9">estamos muy entusiasmados con eso y</text><text start="35.1" dur="4.74">gracias a todos por su</text><text start="37.44" dur="4.2">atención continua y todos los comentarios. que estamos</text><text start="39.84" dur="4.62">recibiendo para nuestro podcast, esto ha</text><text start="41.64" dur="5.52">sido muy apreciado, está bien,</text><text start="44.46" dur="5.939">hablando de comentarios hoy, me gustaría</text><text start="47.16" dur="6.899">hablar con ustedes, dos personas maravillosas aquí</text><text start="50.399" dur="6.18">en esta configuración de grabación, Gary y John,</text> cat AyeD6Y_fLd…………srv1 04 Transcripción de un vídeo * Debe ir todo en una línea
  • 46. cat SORVideos.txt | xargs -I{} bash -c 'yt-dlp --no-abort-on-error --write-auto-sub --sub-lang es-orig --sub-format srv1 --write-description --skip-download -o ./"%(id)s---%(title)s" {}’ 9.282 transcripciones 5 minutos 9.282 transcripciones 125 minutos En paralelo 100 hilos Simple cat SORVideos.txt | xargs -P100 -I{} bash -c 'yt-dlp --no-abort-on-error --write-auto-sub --sub-lang es-orig --sub-format srv1 --write-description --skip-download -o ./"%(id)s---%(title)s" {}’ 04 Transcripciones de todos los vídeos
  • 48. URLs de vídeos Guardar en BBDD Embeddings del texto "kw","Volume","RelatedKW","VolumeRelatedKw" "iphone 13",673000,"iphone 13 precio",22200 "iphone 13",673000,"iphone 13 precios",22200 "iphone 13",673000,"iphone 13: precio",22200 "iphone 13",673000,"precio iphone 13",14800 "iphone 13",673000,"apple iphone 13",12100 "iphone 13",673000,"iphone 13 apple",3600 "iphone 13",673000,"oferta iphone 13",2400 "iphone 13",673000,"precio del iphone 13",1900 "iphone 13",673000,"el iphone 13",880 "iphone 13",673000,"iphone trece",480 "kw","Volume","RelatedKW","VolumeRelatedKw" "iphone",246000,"iphone iphone",246000 Extraer texto y tiempos 04 Flujo de procesos
  • 49. <?xml version="1.0" encoding="utf-8" ?><transcript> <text start="0" dur="0.5"></text> <text start="0.5" dur="2.86">MÚSICA ELECTRÓNICA</text> <text start="3.36" dur="7.21"></text> <text start="10.57" dur="2.37">JOHN MUELLER: Bienvenidos todos al próximo episodio</text> <text start="12.94" dur="3.48">de &amp;quot;Search Off the Record&amp;quot;, un podcast que estamos probando.</text> <text start="16.42" dur="2.52">Nuestro plan es hablar un poco sobre lo que</text> <text start="18.94" dur="2.55">sucede en Google detrás de escena</text> <text start="21.49" dur="2.77">y tal vez divertirnos un poco en el camino.</text> <text start="24.26" dur="2.45">Mi nombre es John Mueller, un promotor de búsqueda</text> a <text start="30.68" dur="5">Y me acompañan Martin y Gary, que también están en el equipo</text> <text start="35.68" dur="0.668">MARTÍN: Hola.</text> <text start="36.348" dur="1.042"> JOHN MUELLER: Hola, Martín.</text> <text start="37.39" dur="1.08">Hola, Gary.</text> <text start==""38.47" dur="1.02">GARY: [NO EN INGLÉS]</text> #!/usr/bin/python3 import sys import json from sentence_transformers import SentenceTransformer model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2') for size in sys.stdin: # Collect a batch of inputs to process at once texts = [] for row in range(0, int(size)): texts.append(sys.stdin.readline()) # Run the model and obtain vectors embeddings = model.encode(texts) # Output the vectors for vector in embeddings: print(json.dumps(vector.tolist())) sys.stdout.flush() 04 Python embeddings_Bert.py
  • 50. <?xml version="1.0" encoding="utf-8" ?><transcript> <text start="0" dur="0.5"></text> <text start="0.5" dur="2.86">MÚSICA ELECTRÓNICA</text> <text start="3.36" dur="7.21"></text> <text start="10.57" dur="2.37">JOHN MUELLER: Bienvenidos todos al próximo episodio</text> <text start="12.94" dur="3.48">de &amp;quot;Search Off the Record&amp;quot;, un podcast que estamos probando.</text> <text start="16.42" dur="2.52">Nuestro plan es hablar un poco sobre lo que</text> <text start="18.94" dur="2.55">sucede en Google detrás de escena</text> <text start="21.49" dur="2.77">y tal vez divertirnos un poco en el camino.</text> <text start="24.26" dur="2.45">Mi nombre es John Mueller, un promotor de búsqueda</text> a <text start="30.68" dur="5">Y me acompañan Martin y Gary, que también están en el equipo</text> <text start="35.68" dur="0.668">MARTÍN: Hola.</text> <text start="36.348" dur="1.042"> JOHN MUELLER: Hola, Martín.</text> <text start="37.39" dur="1.08">Hola, Gary.</text> <text start==""38.47" dur="1.02">GARY: [NO EN INGLÉS]</text> <functions> <function> <type>executable_pool</type> <name>embeddingsBert</name> <return_type>Array(Float32)</return_type> <argument> <type>String</type> </argument> <format>TabSeparated</format> <command>embeddings_Bert.py</command> <command_read_timeout>1000000</command_read_timeout> </function> </functions> 04 Base de Datos (ClickHouse) configuración de la Base de Datos
  • 51. <?xml version="1.0" encoding="utf-8" ?><transcript> <text start="0" dur="0.5"></text> <text start="0.5" dur="2.86">MÚSICA ELECTRÓNICA</text> <text start="3.36" dur="7.21"></text> <text start="10.57" dur="2.37">JOHN MUELLER: Bienvenidos todos al próximo episodio</text> <text start="12.94" dur="3.48">de &amp;quot;Search Off the Record&amp;quot;, un podcast que estamos probando.</text> <text start="16.42" dur="2.52">Nuestro plan es hablar un poco sobre lo que</text> <text start="18.94" dur="2.55">sucede en Google detrás de escena</text> <text start="21.49" dur="2.77">y tal vez divertirnos un poco en el camino.</text> <text start="24.26" dur="2.45">Mi nombre es John Mueller, un promotor de búsqueda</text> a <text start="30.68" dur="5">Y me acompañan Martin y Gary, que también están en el equipo</text> <text start="35.68" dur="0.668">MARTÍN: Hola.</text> <text start="36.348" dur="1.042"> JOHN MUELLER: Hola, Martín.</text> <text start="37.39" dur="1.08">Hola, Gary.</text> <text start==""38.47" dur="1.02">GARY: [NO EN INGLÉS]</text> 04 Base de Datos (ClickHouse) configuración de la Base de Datos SELECT embeddingsBert('HOLA Seonthebeach! Estoy creando un buscador de vídeos') RESULTS —------------------------------------------------------------------------------------------------------------------------------------- [0.025904791,-0.008754695,0.0024956395,-0.13338439,0.01864505,0.05029957,-0.009] —------------------------------------------------------------------------------------------------------------------------------------- 1 row in set. Elapsed: 0.018 sec.
  • 52. <?xml version="1.0" encoding="utf-8" ?><transcript> <text start="0" dur="0.5"></text> <text start="0.5" dur="2.86">MÚSICA ELECTRÓNICA</text> <text start="3.36" dur="7.21"></text> <text start="10.57" dur="2.37">JOHN MUELLER: Bienvenidos todos al próximo episodio</text> <text start="12.94" dur="3.48">de &amp;quot;Search Off the Record&amp;quot;, un podcast que estamos probando.</text> <text start="16.42" dur="2.52">Nuestro plan es hablar un poco sobre lo que</text> <text start="18.94" dur="2.55">sucede en Google detrás de escena</text> <text start="21.49" dur="2.77">y tal vez divertirnos un poco en el camino.</text> <text start="24.26" dur="2.45">Mi nombre es John Mueller, un promotor de búsqueda</text> a <text start="30.68" dur="5">Y me acompañan Martin y Gary, que también están en el equipo</text> <text start="35.68" dur="0.668">MARTÍN: Hola.</text> <text start="36.348" dur="1.042"> JOHN MUELLER: Hola, Martín.</text> <text start="37.39" dur="1.08">Hola, Gary.</text> <text start==""38.47" dur="1.02">GARY: [NO EN INGLÉS]</text> CREATE TABLE Trantor.SearchOfftheRecord ( `fecha` Date, `fichero` String, `texto` String, `linea` String, `duracion` Float32, `comienza` Array(String), `tiempo` String, `vector` Array(Float32) ) ENGINE = MergeTree ORDER BY fecha SETTINGS index_granularity = 8192 04 Base de Datos (ClickHouse) configuración de la Base de Datos
  • 53. Usuario busca Extrae cuando comienza Embedding la consultaz 04 Proceso para resolver la búsqueda Devuelve URL enlazando al momento exacto ¿Los más similares? (KNN)
  • 54. 04 Búsqueda semántica (ClickHouse) configuración de la Base de Datos WITH embeddingsBert('problemas por renderizar javascript') AS txtBusqueda SELECT url, tiempo, L2SquaredDistance(vector, txtBusqueda) AS distancia, countSubstrings(texto, ' ') + 1 AS palabras, texto, contexto FROM ( SELECT concat('https://www.youtube.com/', fichero, '&t=', replaceRegexpAll(tiempo, '..*', ''), 's') AS url, texto, neighbor(texto, 4) AS vecino4, neighbor(texto, 3) AS vecino3, neighbor(texto, 2) AS vecino2, neighbor(texto, 1) AS vecino1, concat(texto, vecino1, vecino2, vecino3, vecino4) AS contexto, vector, tiempo FROM default.YtGSCVector ) WHERE palabras > 2 ORDER BY distancia ASC
  • 55. 04 Enlace al momento en el vídeo
  • 56. 04 Enlace al momento en el vídeo