Desenvolvendo um webscraping em Python [resolvido]


(Gabriel Masson) #1

Existe algum projeto open source de webscraping simples, desenvolvido em Python, para estudo?

Há algum tempo venho estudando / pesquisando sobre o assunto, mas não encontro nada pronto à respeito.

Estava pensando em criar um open source com as seguintes Features:

  • Download do HTML de um link especifico
  • Obtém o conteúdo de tags especificas, como por exemplo: < p >, < h1 >
  • Salva os conteúdos obtidos no banco de dados MySQL

E gostaria de ter uma base de como desenvolver isso em Python de uma forma simples.

obs: Meu domínio em Python atualmente é básico


(Elcio Ferreira) #2

Algo assim?

import urllib2

t = urllib2.urlopen('http://www.tableless.com.br/').read()
h3s = t.split('<h3 class="tb-title-3">')[1:]
h3s = [ h3.split('</h3>')[0] for h3 in h3s ]

for i in h3s:
    print i

(Gabriel Masson) #3

o que é esse split .. e o que faz esse [1:] ?

eu fiz um pra estudo usando uma pancada de tutorial gringo mas pelo vist acho que ficou mta coisa, queria entender melhor o porque de cada biblioteca kkk

meu objetivo é fazer um para buscar o conteúdo de qualquer tag no HTML ou até mesmo no XML


(Elcio Ferreira) #4

O split quebra uma string, transformando numa lista. Ele recebe uma string, que é o separador Veja esse exemplo:

>>> "bananas".split("n")
['ba', 'a', 'as']

(Gabriel Masson) #5

shooow, esta me salvando kkkkkk
agora como que faço para ignorar outros "parametros" dentro da tag.. como um class ou id

olha como fiz o código:

    import urllib2
    
    t = urllib2.urlopen('http://www.tableless.com.br/').read()
    
    # TAG para utilizar
    tags = t.split('<a')[1:]
    tags = [ tag.split('</a>')[0] for tag in tags ]
    
    for i in tags:
        print i

a ideia é para utilizar para qualquer tag.. entretanto tudo o que vem depois do < NomeDaTag ... ele imprime

por exemplo:

href="http://tableless.com.br/tablelessconf">Nosso Evento – 2014
href="http://forum.tableless.com.br/">Fórum
href="http://tableless.com.br/o-basico/">Para Iniciantes

o que posso fazer?


(Elcio Ferreira) #6

Tem dois jeitos. O mais fácil agora é, seguindo a mesma lógica:

    import urllib2
    
    t = urllib2.urlopen('http://www.tableless.com.br/').read()
    
    # TAG para utilizar
    tags = t.split('<a')[1:]
    tags = [ tag.split('</a>')[0].split('>',1)[1] for tag in tags ] #Mexi aqui
    
    for i in tags:
        print i

Só é mais fácil nesse caso porque não precisa reescrever o que já temos.

Outro jeito é usar expressões regulares. É mais flexível, mais poderoso, mas tem que estudar um pouco mais para usar.

Agora, se você quer fazer um troço realmente robusto, à prova de HTML mal escrito, aí vai precisar gastar um bocado de tutano. Esse capítulo do Dive Into Python é só sobre isso:

http://www.diveintopython.net/html_processing/index.html


(André Dalcin) #7
#!/usr/bin/python
# -*- coding: utf-8 -*-
#

import re
import urllib

try:
    import urllib.request as req
except:
    pass

sites = 'google yahoo cnn msn microsoft'.split()
pat = re.compile(r'<title>+.*</title>', re.I | re.M)

for s in sites:
    print ('Buscando: {0}'.format(s))

    try:
        u = urllib.urlopen('http://{0}.com'.format(s))
    except:
        u = req.urlopen('http://{0}.com'.format(s))

    text = u.read()
    title = re.findall(pat, str(text))

    print (re.sub(r'(<title>|</title>)', '', title[0], re.I | re.M))

este pedaço de codigo busca dentro das paginas a tag title, quam sabe pode te ajudar!

você pode aprender mais sobre Expressões Regulares aqui neste link


(Gabriel Masson) #8

exatamente o que precisava.. me salvo kkkkk
essa parte mais avançada eu faço mais pra frente, conforme for evoluindo meu conhecimento..
mas já posso ir estudando esse link ai kkkkk


(Gabriel Masson) #9

poxa @dalcinandre, que bacana, esse código faz a busca sem precisar digitar a url, e de varias urls ao mesmo tempo, pow, show de bola, dá pra incrementar mais no projeto, valeu cara!


(André Dalcin) #10

@Gabriel_Masson conte comigo, só me chamar que vamos trocando ideias, que bom que pude ajudar!