Motor Busqueda Unidad 1 Teoria

20
Construir un motor de búsqueda. Extrayendo el primer enlace. Como empezar – tu primer programa - Rastreador web Un rastreador web es un programa que recoge el contenido de la web. Un rastreador web encontrará las páginas web partiendo de una página semilla y seguirá los enlaces para encontrar otras páginas, y así sucesivamente, siguiendo los enlaces hasta que se hayan encontrado muchas páginas web. Este es el proceso que un rastreador web sigue: Iniciar desde una página preseleccionada, que llamaremos pagina “semilla”. Extraer todos los enlaces en esa página. (Esto es lo primero que aprenderemos.) Seguir cada uno de estos enlaces para encontrar nuevas páginas. Extraer todos los enlaces de todas las nuevas páginas encontradas. Seguir cada uno de estos enlaces para encontrar nuevas páginas. Extraer todos los enlaces de todas las nuevas páginas encontradas. ... Se mantiene el procedimiento en el tiempo mientras haya nuevas páginas que encontrar, o hasta que es detenido. Lo primero que haremos será escribir un programa para extraer el primer enlace de una página web dada. Posteriormente, encontraremos la manera de extraer todos los enlaces de una página web. Para a continuación, ver cómo mantener el rastreo sobre muchas páginas.

Transcript of Motor Busqueda Unidad 1 Teoria

Construir un motor de búsqueda.

Extrayendo el primer enlace. Como empezar – tu primer programa -

Rastreador web

Un rastreador web es un programa que recoge el contenido de la web. Un rastreador

web encontrará las páginas web partiendo de una página semilla y seguirá los enlaces

para encontrar otras páginas, y así sucesivamente, siguiendo los enlaces hasta que se

hayan encontrado muchas páginas web.

Este es el proceso que un rastreador web sigue:

Iniciar desde una página preseleccionada, que llamaremos pagina “semilla”.

Extraer todos los enlaces en esa página. (Esto es lo primero que

aprenderemos.)

Seguir cada uno de estos enlaces para encontrar nuevas páginas.

Extraer todos los enlaces de todas las nuevas páginas encontradas.

Seguir cada uno de estos enlaces para encontrar nuevas páginas.

Extraer todos los enlaces de todas las nuevas páginas encontradas.

...

Se mantiene el procedimiento en el tiempo mientras haya nuevas páginas que

encontrar, o hasta que es detenido.

Lo primero que haremos será escribir un programa para extraer el primer enlace de

una página web dada. Posteriormente, encontraremos la manera de extraer todos los

enlaces de una página web. Para a continuación, ver cómo mantener el rastreo sobre

muchas páginas.

Construir un motor de búsqueda.

Empecemos con un pequeño Quiz:

Quiz 1:

Escriba un programa Python que imprima el número de minutos en siete semanas.

Respuesta:

¿Por qué debemos aprender nuevos lenguajes, como Python, para programar

ordenadores, en lugar de utilizar los lenguajes naturales como el inglés o mandarín?

Hay muchas razones por las que un lenguaje como Python es mejor para escribir

programas que un lenguaje natural como el inglés. Un problema con los lenguajes

naturales es que son ambiguos. Por lo tanto, no todo el mundo va a interpretar la

misma frase de la misma manera. Para programar ordenadores, es importante que

sepamos exactamente lo que nuestros programas significan y de que el equipo va a

ejecutarlos con el significado que se pretendía. Otro problema con los lenguajes

naturales es que son muy detallados. Decir algo con el nivel de precisión necesario

para que un ordenador pueda seguirlo mecánicamente requeriría una gran cantidad de

trabajo. Queremos que los programas sean cortos, para que sean más fáciles de

escribir, leer y entender.

Gramática

En comparación con un lenguaje natural, los lenguajes de programación se adhieren a

una estructura gramatical estricta. En Inglés, incluso si una frase se escribe o habla

mal, todavía puede ser entendida con la ayuda del contexto o de otras pistas. Por otro

lado, en un lenguaje de programación como Python, el código debe coincidir con la

gramática del lenguaje exactamente. El intérprete de Python no tiene idea de qué

hacer con una entrada que no esté en el lenguaje Python, por lo que producirá un

error.

print 7 * 7 * 24 * 60

Construir un motor de búsqueda.

Reglas básicas de la gramática inglesa:

Sentence → Subject Verb Object

Subject → Noun

Object → Noun

Verb → Eat

Verb → Like

Noun → I

Noun → Python

Noun → Cookies

Cuando la gramática del lenguaje de programación no se sigue a rajatabla, el

intérprete devolverá un mensaje SyntaxError. Esto significa que la estructura del

código es inconsistente con las reglas del lenguaje de programación.

Forma Backus-Naur

La notación que se utiliza para describir la gramática, se conoce como Forma Backus-

Naur. Fue introducida en 1950 por John Backus, el principal diseñador del lenguaje de

programación Fortran en IBM.

El propósito de la Forma Backus-Naur es describir un lenguaje de programación de una

manera sencilla y concisa. La estructura de esta forma es:

La sustitución puede ser cualquier secuencia de cero o más no-terminales o

terminales.

Los terminales nunca aparecen en el lado izquierdo de una regla. Una vez que llegue a

un terminal no hay nada que pueda reemplazarlo. He aquí un ejemplo que muestra

cómo derivar una frase siguiendo las reglas de sustitución:

<Non-Terminal> → reemplazo

Construir un motor de búsqueda.

- Sentence → Subject Verb Object

→ Noun Verb Object

→ I Verb Object

→ I Like Object

→ I Like Noun

→ I Like Python

Hagamos otro Quiz.

Quiz 2:

¿Cuál de estas oraciones pueden ser producidas a partir de esta gramática, empezando

en Sentence?

o a. Python Eat Cookies

o b. Python Eat Python

o c. I Like Eat

Respuesta: a & b, siguen las reglas

Construir un motor de búsqueda.

Expresiones en Python:

Una expresión es algo que tiene un valor.

Estos son algunos ejemplos de expresiones en Python:

Aquí está una de las reglas de la gramática de Python para hacer expresiones:

La Expresión no-terminal que aparece en el lado izquierdo puede ser reemplazada por

una Expresión, seguida por un Operador, seguido por otra Expresión. Por ejemplo,

1 + 1 es: Expresión Operador Expresión.

¡Lo interesante de esta regla es que tiene Expresión en los lados izquierdo y derecho!

Esto parece circular, y sería, salvo que también existan otras reglas para Expresión que

no incluyan Expresión en el lado derecho.

Este es un ejemplo de una definición recursiva. Para hacer una buena definición

recursiva se necesitan al menos dos reglas:

1. Una regla que define algo en términos de sí mismo.

Expresión → Expresión Operador Expresión

2. Una regla que define esa cosa en términos de algo que ya sabemos.

Expresión → Número

Las definiciones recursivas son una idea muy poderosa en informática. Nos permiten

definir muchísimas cosas con unas cuantas reglas sencillas.

Estas son algunas de las reglas gramaticales de Python para expresiones aritméticas:

Expresión → Expresión Operador Expresión

Expresión → Número

Operador → +

Operador → *

Número → 0, 1, ...

3

1 + 1

7 * 7 * 24 * 60

Expresión → Expresión Operador Expresión

Construir un motor de búsqueda.

Aquí hay un ejemplo de derivación usando esta gramática:

Expresión → Expresión Operador Expresión

→ Expresión + Expresión

→ Expresión + Número

→ Expresión + 1

→ Expresión Operador Expresión + 1

→ Número Operador Expresión + 1

→ 2 Operador Expresión + 1

→ 2 * Expresión + 1

→ 2 * Expresión Operador Expresión + 1

→ 2 * Número Operador Expresión + 1

→ 2 * 3 Operador Expresión + 1

→ 2 * 3 * Expresión + 1

→ 2 * 3 * Número + 1

→ 2 * 3 * 3 + 1

Tenemos que añadir una regla más a nuestra gramática de Expresión para ser capaz de

producir todas las Expresiones que hemos utilizado hasta ahora:

Expresión → (Expresión)

Quiz 3: Expresiones Python

¿Cuál son Expresiones válidas de Python que se pueden producir a partir de Expresión?

Puede haber más de una.

a.3

b. ((3)

c. (1 * (2 * (3 * 4)))

d. + 33

e. (((7)))

Construir un motor de búsqueda.

Respuesta:

a. válido

b. no es válido, no se sigue la regla, Expresión -> (Expresión), tiene que tener () a

la derecha y a la izquierda

c. c. válido

d. no válido, no sigue Expresión -> Expresión Operador Expresión

e. válido, paréntesis anidados válidos, pero innecesarios

Sigamos adelante.

Empecemos con un Quiz.

Quiz 4: Velocidad de la Luz

Escribir código Python para imprimir hasta dónde viaja la luz en centímetros después

de un nanosegundo usando el operador de multiplicación.

La velocidad de la luz es 299792458 metros por segundo.

Un metro es 100 centímetros.

Un nanosegundo es una mil millonésima parte (1/1000000000) de segundo.

¿Por qué calcular esto? ¡Porque la distancia que la luz viaja en un nanosegundo

realmente importa en la informática! Un equipo típico de hoy ejecuta miles de

millones de pasos por segundo. El procesador que estoy usando es un procesador de

2,7 Ghz. GHz significa Gigahertz, o sea mil millones de ciclos por segundo. Así que, el

ordenador ejecuta 2700000000 ciclos por segundo.

Podemos entender que cada ciclo es equivalente a la ejecución de trozo muy pequeño

de una instrucción.

Respuesta:

>>> print 299792458 * 100 * 1.0/1000000000

29.9792458

Construir un motor de búsqueda.

Quiz 5: Variables

Teniendo en cuenta las variables que se definen a continuación, escribir código Python

que imprima la distancia, en metros, que la luz viaja en un ciclo del procesador.

Calcular dividiendo la velocidad de la luz por el número de ciclos por segundo.

Respuesta:

Quiz 6:

¿Cuál es el valor de segundos después de ejecutar este código?:

a. 0 b. 60 c. 120 d. Error

speed_of_light = 299792458 # metros por segundo

cycles_per_second = 27000000000. # 2.7 GHz

speed_of_light = 299792458 # meters per second

cycles_per_second = 27000000000. # 2.7GHz

print speed_of_light/ cycles_per_second

0.111034243704

minutos = minutos + 1

segundos = minutos * 60

Construir un motor de búsqueda.

Strings

Una cadena (string) es una secuencia de caracteres entre comillas, ya sean simples o dobles.

El único requisito es que la cadena debe empezar y terminar con el mismo tipo de comilla.

Esto le permite incluir comillas dentro de comillas como un carácter de la cadena.

Indexando Strings

Al hecho de seleccionar subcadenas de una cadena, se le llama indexación. Se utilizan

los corchetes [] para especificar qué parte de la cadena se desea seleccionar:

Por ejemplo, si tenemos el string 'universidad' y queremos seleccionar el carácter en la

posición cero (es decir, el primer carácter), escribiremos:

Las posiciones de una cadena se numeran empezando por 0, por lo que esta se evalúa

como 'u'.

'I am a string!'

"I prefer double quotes!"

"I'm happy I started with a double quote!"

<cadena> [<expresión>]

'universidad'[0]

'universidad'[0]

'u'

'universidad'[1 + 1]

'i'

nombre = 'Lupi'

nombre[0]

'L'

Construir un motor de búsqueda.

Cuando se utilizan números negativos en el índice, Python empieza a contar a partir

del final de la cadena:

O

Cuando intentas indexar un carácter en una posición donde no hay, Python produce un

IndexError lo que indica que el índice está fuera de rango:

nombre = 'Lupi'

print nombre[-1]

'i'

nombre='Lupi'

print nombre[-2]

'p'

nombre = 'Lupi'

print nombre[4]

IndexError: string index out of range

Construir un motor de búsqueda.

Quiz 6: mismo valor

Dada la variable,

¿Cuáles de estos pares tienen exactamente el mismo valor?

a. s[3], s[1+1+1]

b. s[0], (s+s)[0] c. s[0] + s[1], s[0+1] d. s[1], (s + 'ity') [1] e. s[-1], (s + s)[-1]

Respuesta:

a, b y e. Para c, la primera expresión es una cadena de dos caracteres, la segunda es la

cadena de un carácter de la letra en la posición 1. Para d, los resultados son los mismos

sólo si el valor de s contiene al menos dos caracteres. Por ejemplo, si s = 'a', la primera

expresión produce un error de indexación y la segunda expresión da salida 'i'.

Seleccionando Subcadenas

Se puede seleccionar una subcadena a partir de una cadena mediante la designación

de una posición inicial y una posición final. Python lee las posiciones empezando en 0,

por lo que la cadena 'universidad' tiene 11 caracteres, hay 11 posiciones: 0,1 ... 10,

con 'u' en la posición 0.

s = '<any string>'

<string>[<expression>] → un string de un carácter.

<string>[<start expression>:<stop expression>] → un string que es una subcadena del

string

Construir un motor de búsqueda.

Ejemplos

MIS NOTAS: INDEXAR CADENAS VACIAS

Al indexar una cadena que es vacía (es decir, cadena = ""), se aplican las siguientes reglas: donde # es un número cualquiera

word = 'assume'

print word[3]

'u'

print word[4:6]

'me'

print word[4:]

'me'

print word[:2]

'as'

print word[:]

'assume'

print cadena [#] -> produciría un ERROR

print cadena [:] -> produciría "" no es un error!

print cadena [#: #] -> produciría "" no es un error!

print cadena [- #: - #] -> produciría "" no es un error!

print cadena [#: - #] -> produciría "" no es un error!

print cadena [0:0] -> produciría "" no es un error!

Construir un motor de búsqueda.

Quiz 7:

Escriba el código Python que imprime Universidad (con una U mayúscula), teniendo en

cuenta la definición:

Respuesta:

Quiz 8:

Para cualquier string,

¿Cuáles de estas respuestas es siempre equivalente a s?

a. s[:]

b. s + s[0:-1 +1]

c. s[0:]

d. s[:-1]

e. s[:3] + s[3:]

Respuesta:

a, b, c, y e.

print 'U' + s[2: ]

Universidad

s= '<any string>'

s = 'auniversidad'

Construir un motor de búsqueda.

Encontrar subcadenas en cadenas

El método find es una operación o método incorporado siempre por Python, que opera

en strings. La salida de find es la posición de la cadena en la que se encuentra la

subcadena especificada.

.find()

Si la subcadena no se encuentra en cualquier parte de la cadena de búsqueda,

entonces la salida será -1.

Ejemplos

pythagoras = 'There is geometry in the humming of the strings, there is music in the spacing of the spheres. '

print pythagoras.find('string')

40

print pythagoras[40:]

'strings, there is music in the spacing of the spheres.'

print pythagoras.find('T')

0

print pythagoras.find('sphere')

86

print pythagoras[86:]

spheres.

print pythagoras.find('algebra')

-1

Construir un motor de búsqueda.

Quiz 9:

¿Cuál evalúa a -1?:

a. 'test'.find('t')

b. "test".find('st') c. "Test".find('te') d. 'west'.find('test')

Respuesta: c y d.

Quiz 10:

Para cualquier string

¿Cuál de las siguientes siempre será 0?

a. s.find(s)

b. s.find('s')

c. 's'.find('s')

d. s.find(' ')

e. s.find(s + '!!!') +1

Respuesta:

a. sí, no importa el valor de la cadena s, siempre vamos a encontrar s al principio de sí

misma.

b. no, la primera letra tiene que ser ‘s’

c. yes

d. yes

e. yes – la parte s.find(s + '!!!') siempre evalúa a -1, ya que nunca puedes encontrar un

string más largo que s en s. Sumándole 1 tendremos 0.

s = '<any string>'

Construir un motor de búsqueda.

Find con números

Además de pasar una cadena que queramos encontrar, también se puede pasar un

número:

find ( , )

Dicho número, es la posición en la cadena de búsqueda donde find comenzará a

buscar la cadena requerida. La salida es un número que nos dará la posición de la

primera aparición de la cadena buscada después de la posición de entrada (o justo en

esa posición). Si no existe la salida es -1

Por ejemplo:

ndanton = "De l'audace, encore de l'audace, toujours de l'audace."

print danton.find('audace')

5

print danton.find('audace', 0)

5

print danton.find('audace', 5)

5

print danton.find('audace', 6)

25

print danton.find('audace', 25)

25

print danton.find('audace', 48)

-1

Construir un motor de búsqueda.

Quiz 11: Find con números

Para s y t variables de tipo string, y i cualquier número.

¿Cuál de estas opciones es equivalente a s.find(t,i)?:

a. s[i: ].find(t) b. s.find(t)[ :i] c. s[i: ].find(t) + i d. s[i: ].find(t[i: ])

Respuesta:

¡Ninguna de las anteriores son equivalentes! Esta era una pregunta difícil. La opción c

es casi equivalente, excepto para el caso en que t no se encuentra en s [i:], y la salida

de la búsqueda será -1.

Extrayendo Enlaces:

Una página web es en realidad una larga cadena de caracteres. El navegador muestra

la página web de una manera que parece más atractiva que la simple cadena de

caracteres. Nosotros podemos ver la cadena de caracteres para cualquier página web

en el navegador. La forma de hacerlo depende del navegador que se esté utilizando.

Para Chrome y Firefox, hacer clic derecho en cualquier parte de la página que no sea

un enlace y seleccionar " Ver código fuente de la página". Para Internet Explorer, hacer

clic derecho y seleccione "Ver código fuente".

s = '<any string>'

t = '<any string>'

i = <any number>

Construir un motor de búsqueda.

Para nuestro rastreador web, lo importante es encontrar los enlaces a otras páginas

web en la página. Podemos encontrar esos vínculos mediante la búsqueda de las

etiquetas HTML que coincidan con esta estructura:

Por ejemplo, este es un enlace a la página anterior:

<a href="<url>">

<a href=http://xkcd.com/353/ />

Construir un motor de búsqueda.

Para construir nuestro rastreador, para cada página web queremos encontrar todos los

enlaces en dicha página. Queremos mantener esa información y seguir cada enlace

para encontrar más contenido en la web. Para esta unidad, vamos a hacer el primer

paso, que consiste en extraer la URL del primer enlace de la página. En la Unidad 2,

vamos a ver la forma de seguir adelante para obtener todos los destinos de los

enlaces, y en la Unidad 3, veremos cómo mantener control de los enlaces para poder

rastrear las páginas de destino. Por ahora, nuestro objetivo es coger el texto de

una Web y encontrar el primer enlace en dicho texto. Podemos hacer esto mediante

la búsqueda de la etiqueta de anclaje, <a href = ", y luego extraer de esa etiqueta la

URL que se encuentra entre las comillas dobles. Asumiremos que el contenido de la

página web está en una variable, page.

Quiz 12: Extraer Enlaces

Escribir código Python que asigne a la variable url, un string que sea el valor del enlace

que aparezca en la primera etiqueta de anclaje en el string contenido en la variable

page.

Recordemos

page= contenido página web

Usar

start_link=page.find(‘< a href = ‘)

Respuesta:

Para extraer la URL, necesitamos encontrar las comillas iniciales y finales y luego

extraer la sub-cadena de caracteres entre ellas.

Paso 1:

start_quote = page.find(' " ', start_link)

Construir un motor de búsqueda.

Paso 2:

Paso 3:

end_quote = page.find (' " ', start_quote + 1)

url = page[start_quote +1 : end_quote]