Opções para raspagem de HTML? [fechadas]

406

Estou pensando em experimentar o Beautiful Soup , um pacote Python para raspagem de HTML. Existem outros pacotes de raspagem de HTML que eu deveria estar olhando? Python não é um requisito, estou realmente interessado em ouvir sobre outras linguagens também.

A história até agora:

carla
fonte
O link da sopa de etiquetas está morto.
precisa saber é o seguinte
O HtmlUnit é uma implementação completa do navegador Java que não pode ser dissecada em partes (não é possível baixar apenas uma página html e raspe-a, ele fará o download de todos os arquivos referidos, executará scripts etc.). Como tal, acho que não pertence aqui.
Mark Jeronimus 22/03
O Java de estoque pode caminhar HTML com expressões XPath, embora não sem problemas. A parte do analisador (DocumentBuilder) engasga com HTML incorreto e o HTML 100% correto é realmente muito raro na web. Portanto, eu gosto de substituir o analisador pelo JTidy . Quanto ao XPath, o próprio Java XPathExpressionpode ser usado (existente desde o Java 1.5)
Mark Jeronimus 22/03

Respostas:

64

O equivalente mundial do Ruby à Beautiful Soup é o Hpricot do why_the_lucky_stiff .

Joey deVilla
fonte
12
Hoje em dia o pessoal do Ruby mudou para Nokogiri para fazer raspagem.
Mark Thomas
44

No mundo .NET, eu recomendo o HTML Agility Pack. Não é tão simples quanto algumas das opções acima (como HTMLSQL), mas é muito flexível. Ele permite manipular HTML mal formado como se fosse XML bem formado, para que você possa usar XPATH ou apenas iterar sobre nós.

http://www.codeplex.com/htmlagilitypack

Jon Galloway
fonte
2
combinar linq com ele e parece mais com HTMLSQL, não?
Bless Yahu 22/11/2008
3
Combine o SharpQuery com ele, e ele se tornará exatamente como o jQuery! code.google.com/p/sharp-query
mpen
1
O HTML Agility Pack falha ao estruturar corretamente o DOM para vários documentos HTML que eu tentei.
Ash Berlin-Taylor
37

BeautifulSoup é um ótimo caminho a percorrer para a raspagem de HTML. Meu trabalho anterior me fez fazer muitas raspagens e gostaria de saber sobre a BeautifulSoup quando comecei. É como o DOM com muito mais opções úteis e é muito mais pitônico. Se você quiser experimentar o Ruby, eles portaram BeautifulSoup, chamando-o de RubyfulSoup, mas não foi atualizado há algum tempo.

Outras ferramentas úteis são HTMLParser ou sgmllib.SGMLParser, que fazem parte da biblioteca padrão do Python. Eles funcionam chamando métodos sempre que você digita / sai de uma tag e encontra texto html. Eles são como Expat, se você estiver familiarizado com isso. Essas bibliotecas são especialmente úteis se você estiver analisando arquivos muito grandes e a criação de uma árvore DOM seria longa e cara.

Expressões regulares não são muito necessárias. O BeautifulSoup lida com expressões regulares, portanto, se você precisar do poder delas, poderá utilizá-lo lá. Eu digo que vá com BeautifulSoup, a menos que você precise de velocidade e um espaço menor de memória. Se você encontrar um melhor analisador de HTML no Python, me avise.

Cristian
fonte
21

Eu achei o HTMLSQL uma maneira ridiculamente simples de capturar telas . Demora literalmente minutos para obter resultados.

As consultas são super intuitivas - como:

SELECT title from img WHERE $class == 'userpic'

Agora, existem outras alternativas que adotam a mesma abordagem.

programador morto
fonte
7
FYI, esta é uma biblioteca PHP
Tristan Havelick
19

A biblioteca Python lxml atua como uma ligação Pythonic para as bibliotecas libxml2 e libxslt. Gosto particularmente do suporte XPath e da impressão bonita da estrutura XML na memória. Ele também suporta a análise de HTML quebrado. E eu acho que você não pode encontrar outras bibliotecas / ligações Python que analisam o XML mais rapidamente que o lxml.

akaihola
fonte
18

Para Perl, há WWW :: Mechanize.

andrewrk
fonte
16

O Python tem várias opções para raspagem de HTML, além da Beatiful Soup. Aqui estão alguns outros:

  • mecanizar : semelhante ao perl WWW:Mechanize. Oferece a você um objeto semelhante ao navegador para inativar as páginas da web
  • lxml : ligação de Python a libwww. Suporta várias opções para percorrer e selecionar elementos (por exemplo, seleção XPath e CSS)
  • scrapemark : biblioteca de alto nível usando modelos para extrair informações do HTML.
  • pyquery : permite fazer consultas semelhantes a jQuery em documentos XML.
  • scrapy : uma estrutura de raspagem e rastreamento da Web de alto nível. Pode ser usado para escrever aranhas, para mineração de dados e para monitoramento e teste automatizado
filippo
fonte
1
A biblioteca padrão do Python possui um analisador de HTML incorporado ... por que não usar isso? docs.python.org/2.7/library/htmlparser.html
ArtOfWarfare
14

'Simple HTML DOM Parser' é uma boa opção para PHP, se você estiver familiarizado com os seletores jQuery ou JavaScript, você se sentirá em casa.

Encontre aqui

Também há um post sobre isso aqui.

user67627
fonte
1
Eu segundo este. Não é necessário instalar qualquer mod_python, etc no servidor web apenas para fazê-lo funcionar
Brock Woolf
11

O templatemaker utilitário a partir Adrian Holovaty (de Django fama) usa uma abordagem muito interessante: você alimentá-lo variações da mesma página e ele "aprende", onde os "buracos" para dados variáveis são. Como o HTML não é específico, seria bom raspar qualquer outro conteúdo de texto sem formatação. Eu também o usei para PDFs e HTML convertidos em texto sem formatação (com pdftotext e lynx, respectivamente).

akaihola
fonte
como você conseguiu o templatemaker trabalhando para páginas HTML grandes? Eu achei que ele trava quando eu dou algo não trivial.
Hoju
Suponho que não tive grandes páginas HTML. Parece não haver nenhum problema registrado em code.google.com/p/templatemaker/issues/list, portanto, provavelmente é apropriado enviar um caso de teste para ele. Porém, não parece que Adrian esteja mantendo a biblioteca. Eu me pergunto o que ele usa hoje em dia no EveryBlock, já que eles certamente fazem muita raspagem.
akaihola
10

Conheço e amo Screen Scraper .

Screen-Scraper é uma ferramenta para extrair dados de sites. O raspador de tela automatiza:

* Clicking links on websites
* Entering data into forms and submitting
* Iterating through search result pages
* Downloading files (PDF, MS Word, images, etc.)

Usos comuns:

* Download all products, records from a website
* Build a shopping comparison site
* Perform market research
* Integrate or migrate data

Técnico:

* Graphical interface--easy automation
* Cross platform (Linux, Mac, Windows, etc.)
* Integrates with most programming languages (Java, PHP, .NET, ASP, Ruby, etc.)
* Runs on workstations or servers

Três edições do raspador de tela:

* Enterprise: The most feature-rich edition of screen-scraper. All capabilities are enabled.
* Professional: Designed to be capable of handling most common scraping projects.
* Basic: Works great for simple projects, but not nearly as many features as its two older brothers.
raiglstorfer
fonte
Infelizmente, nem mesmo a versão básica é FOSS. Parece apenas ser livre como na cerveja.
precisa saber é o seguinte
9

Gostaria de descobrir primeiro se os sites em questão fornecem um servidor de API ou feeds RSS para acessar os dados necessários.

GateKiller
fonte
8

O estouro da pilha de raspagem é especialmente fácil com o Shoes e o Hpricot .

require 'hpricot'

Shoes.app :title => "Ask Stack Overflow", :width => 370 do
  SO_URL = "http://stackoverflow.com"
  stack do
    stack do
      caption "What is your question?"
      flow do
        @lookup = edit_line "stackoverflow", :width => "-115px"
        button "Ask", :width => "90px" do
          download SO_URL + "/search?s=" + @lookup.text do |s|
            doc = Hpricot(s.response.body)
            @rez.clear()
            (doc/:a).each do |l|
              href = l["href"]
              if href.to_s =~ /\/questions\/[0-9]+/ then
                @rez.append do
                  para(link(l.inner_text) { visit(SO_URL + href) })
                end
              end
            end
            @rez.show()
          end
        end
      end
    end
    stack :margin => 25 do
      background white, :radius => 20
      @rez = stack do
      end
    end
    @rez.hide()
  end
end
Frank Krueger
fonte
8

Outra opção para o Perl seria o Web :: Scraper, que é baseado no Ruby Scrapi . Em poucas palavras, com sintaxe agradável e concisa, você pode obter um raspador robusto diretamente nas estruturas de dados.

Jeff Atwood
fonte
7

Eu tive algum sucesso com o HtmlUnit , em Java. É uma estrutura simples para escrever testes de unidade nas UIs da Web, mas igualmente útil para a raspagem de HTML.

Henry
fonte
você também pode usá-lo para avaliar a execução javascript se você tiver a necessidade :)
David
6

Também existe esta solução: netty HttpClient

jbst
fonte
5

Eu uso o Hpricot no Ruby. Como exemplo, este é um trecho de código que eu uso para recuperar todos os títulos de livros das seis páginas da minha conta HireThings (como eles não parecem fornecer uma única página com essas informações):

pagerange = 1..6
proxy = Net::HTTP::Proxy(proxy, port, user, pwd)
proxy.start('www.hirethings.co.nz') do |http|
  pagerange.each do |page|
    resp, data = http.get "/perth_dotnet?page=#{page}" 
    if resp.class == Net::HTTPOK
      (Hpricot(data)/"h3 a").each { |a| puts a.innerText }
    end
  end
end 

É praticamente completo. Tudo o que vem antes disso são as importações da biblioteca e as configurações do meu proxy.

Wolfbyte
fonte
5

Eu usei bastante a Beautiful Soup com Python. É muito melhor que a verificação de expressões regulares, porque funciona como o DOM , mesmo que o HTML esteja mal formatado. Você pode encontrar rapidamente tags e texto HTML com sintaxe mais simples que as expressões regulares. Depois de encontrar um elemento, é possível iterar sobre ele e seus filhos, o que é mais útil para entender o conteúdo no código do que nas expressões regulares. Eu gostaria que a Beautiful Soup existisse anos atrás, quando eu tive que fazer muitas capturas de tela - isso me pouparia muito tempo e dor de cabeça, já que a estrutura HTML era tão ruim antes que as pessoas começassem a validá-la.

Peter Mortensen
fonte
5

Embora tenha sido projetado para testes na Web .NET , eu tenho usado a estrutura WatiN para esse fim. Como é baseado em DOM, é muito fácil capturar HTML, texto ou imagens. Recentemente, usei-o para despejar uma lista de links de uma consulta de namespace do MediaWiki All Pages em uma planilha do Excel. O seguinte fragmento de código do VB.NET é bastante bruto, mas funciona.


Sub GetLinks(ByVal PagesIE As IE, ByVal MyWorkSheet As Excel.Worksheet)

    Dim PagesLink As Link
    For Each PagesLink In PagesIE.TableBodies(2).Links
        With MyWorkSheet
            .Cells(XLRowCounterInt, 1) = PagesLink.Text
            .Cells(XLRowCounterInt, 2) = PagesLink.Url
        End With
        XLRowCounterInt = XLRowCounterInt + 1
    Next
End Sub
JonnyGold
fonte
3

Você seria um tolo se não usasse o Perl .. Aí vem as chamas ..

Osso nos módulos seguintes e ginsu qualquer arranhão ao redor.

use LWP
use HTML::TableExtract
use HTML::TreeBuilder
use HTML::Form
use Data::Dumper
crojac
fonte
3

Eu usei LWP e HTML :: TreeBuilder com Perl e os achei muito úteis.

O LWP (abreviação de libwww-perl) permite que você se conecte a sites e raspe o HTML. Você pode obter o módulo aqui e o livro O'Reilly parece estar online aqui .

TreeBuilder permite construir uma árvore a partir do HTML, e a documentação e a fonte estão disponíveis em HTML :: TreeBuilder - Analisador que cria uma árvore de sintaxe HTML .

Pode haver muito trabalho pesado ainda a ver com algo como essa abordagem. Não observei o módulo Mecanizar sugerido por outra resposta, por isso posso fazê-lo.

kaybenleroll
fonte
3

Bem, se você quiser fazer isso do lado do cliente usando apenas um navegador, você tem o jcrawl.com . Depois de projetar seu serviço de sucateamento a partir do aplicativo Web ( http://www.jcrawl.com/app.html ), você só precisará adicionar o script gerado a uma página HTML para começar a usar / apresentar seus dados.

Toda a lógica de sucateamento acontece no navegador via JavaScript. Espero que você ache útil. Clique neste link para ver um exemplo ao vivo que extrai as últimas notícias do Yahoo Tennis .

Peter Mortensen
fonte
2

Você provavelmente já tem muito, mas acho que é isso que você está tentando fazer:

from __future__ import with_statement
import re, os

profile = ""

os.system('wget --no-cookies --header "Cookie: soba=(SeCreTCODe)" http://stackoverflow.com/users/30/myProfile.html')
with open("myProfile.html") as f:
    for line in f:
        profile = profile + line
f.close()
p = re.compile('summarycount">(\d+)</div>') #Rep is found here
print p
m = p.search(profile)
print m
print m.group(1)
os.system("espeak \"Rep is at " + m.group(1) + " points\""
os.remove("myProfile.html")
Conceder
fonte
2

Eu tive resultados mistos no .NET usando o SgmlReader, que foi originalmente iniciado por Chris Lovett e parece ter sido atualizado pelo MindTouch .

Shawn Miller
fonte
2

Gosto da função ImportXML (URL, XPath) do Google Spreadsheets.

Ele repetirá as células na coluna se sua expressão XPath retornar mais de um valor.

Você pode ter até 50 importxml()funções em uma planilha.

O plug-in da Web do RapidMiner também é bastante fácil de usar. Ele pode publicar, aceitar cookies e definir o agente do usuário .

Neil McGuigan
fonte
2

Eu também tive muito sucesso usando o Jaxer + jQuery do Aptana para analisar páginas. Não é tão rápido ou "tipo script" por natureza, mas os seletores de jQuery + JavaScript / DOM real são um salva-vidas em páginas mais complicadas (ou malformadas).

kkubasik
fonte