Personal Website

My Web: MindEchoes.com

Monday, November 21, 2011

Descargar Archivos random de Wikipedia

Este es un script que acabo de hacer porque tenemos que conseguir más de 5000 articulos para un trabajo de la facultad, donde tenemos que implementar un motor de busqueda sobre documentos, y para conseguir la base de documentos y con cierto formato que sea parseable que mejor que wikipedia.
Entonces para poder bajar una buena cantidad de documentos hice (seguramente podría mejorarse):



# -*- coding: utf-8 *-*

import os
import random
import urllib

from BeautifulSoup import BeautifulSoup


class Browser(urllib.FancyURLopener):
    version = ('Mozilla/5.0 (Windows; U; Windows NT 5.1; it; '
               'rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11')


def read_page(link):
    browser = Browser()
    page = browser.open(link)
    return page.read()


AZ = [chr(c) for c in xrange(65, 91)]
az = [chr(c) for c in xrange(97, 123)]

#http://es.wikipedia.org/wiki/Wikipedia:%C3%8Dndice_alfab%C3%A9tico
combinations = [unicode(pageA + pagea) for pageA in AZ for pagea in az]
combinations += [unicode(pageA + pageA) for pageA in AZ for pagea in AZ]

path_save = '/home/gato/Desktop/wiki'
base_url = 'http://es.wikipedia.org/wiki/Especial:Todas'
wiki_url = 'http://es.wikipedia.org'

for page in combinations:
    print 'COMBINATION:', page
    url = os.path.join(base_url, page)
    soup = soup = BeautifulSoup(read_page(url))
    links = soup.findAll('a', {"class": "mw-redirect"})
    length = len(links) - 1
    indexes = [random.randint(0, length) for i in xrange(8)]
    indexes = list(set(indexes))
    for index in indexes:
        filename = os.path.basename(links[index]['href']) + '.html'
        wiki_page = wiki_url + links[index]['href']
        print wiki_page
        content = read_page(wiki_page)
        with open(os.path.join(path_save, filename), 'w') as f:
            f.write(content)
        print 'Saved:', filename

2 comments:

juancarlospaco said...

Por que le truchas la identificacion del Browser diciendo que sos un MS Windows?

Igual yo le agregaria un sleep() para no ser tan DDOSesco

Diego Sarmentero said...

Porque si no creas ese Browser trucho y lo intentas leer solo con urllib falla, igual que las busquedas en google, etc.
Te tiran una pagina de error en lugar del html correcto.

Y si le pongo sleep no termino de bajar mas los 8000 documentos que necesito para mi trabajo :P