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:



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:



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


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.


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.


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.



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

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



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).


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.

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.


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

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.


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.


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




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.


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.


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


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

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.



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 .


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")


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 .


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).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.