Opzioni per lo scraping HTML? [chiuso]


406

Sto pensando di provare Beautiful Soup , un pacchetto Python per lo scraping HTML. Ci sono altri pacchetti di scraping HTML che dovrei guardare? Python non è un requisito, in realtà sono interessato a conoscere anche altre lingue.

La storia così lontana:



Il link Tag Soup è morto.
Tapper7,

HtmlUnit è un'implementazione completa del browser Java che non è possibile sezionare in parti (non è possibile scaricare solo una pagina html e raschiarla, scaricherà tutti i file indicati, eseguirà gli script, ecc.). Come tale, non penso che appartenga qui.
Mark Jeronimus il

Stock Java può utilizzare HTML con espressioni XPath, anche se non senza problemi. La parte parser (DocumentBuilder) si soffoca su HTML errato e l'HTML corretto al 100% è in realtà abbastanza raro sul web. Quindi mi piace sostituire il parser con JTidy . Per quanto riguarda XPath, è XPathExpressionpossibile utilizzare quello di Java (che esiste da Java 1.5)
Mark Jeronimus,

Risposte:



44

Nel mondo .NET, raccomando HTML Agility Pack. Non è così semplice come alcune delle opzioni di cui sopra (come HTMLSQL), ma è molto flessibile. Ti consente di duplicare HTML mal formato come se fosse un XML ben formato, quindi puoi usare XPATH o semplicemente scorrere i nodi.

http://www.codeplex.com/htmlagilitypack


2
combinare linq con esso e sembra più simile a HTMLSQL, no?
Benedici Yahu il

3
Combina SharpQuery con esso e diventa proprio come jQuery! code.google.com/p/sharp-query
mpen

1
HTML Agility Pack non riesce a strutturare correttamente il DOM per un numero di documenti HTML che ho provato.
Ash Berlin-Taylor,

37

BeautifulSoup è un ottimo modo per eseguire scraping HTML. Il mio lavoro precedente mi ha fatto fare molti raschietti e mi piacerebbe sapere di BeautifulSoup quando ho iniziato. È come il DOM con molte più opzioni utili ed è molto più pitonico. Se vuoi provare Ruby, hanno portato BeautifulSoup chiamandolo RubyfulSoup ma non è stato aggiornato da un po '.

Altri strumenti utili sono HTMLParser o sgmllib.SGMLParser che fanno parte della libreria Python standard. Funzionano chiamando metodi ogni volta che inserisci / esci da un tag e incontri testo HTML. Sono come Expat se hai familiarità con quello. Queste librerie sono particolarmente utili se stai per analizzare file molto grandi e la creazione di un albero DOM sarebbe lunga e costosa.

Le espressioni regolari non sono molto necessarie. BeautifulSoup gestisce le espressioni regolari, quindi se hai bisogno del loro potere puoi utilizzarlo lì. Dico di andare con BeautifulSoup a meno che tu non abbia bisogno di velocità e un ingombro di memoria più piccolo. Se trovi un parser HTML migliore su Python, fammi sapere.


21

Ho trovato HTMLSQL per essere un modo ridicolmente semplice per schermare. Ci vogliono letteralmente minuti per ottenere risultati con esso.

Le query sono super intuitive, come:

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

Ora ci sono altre alternative che adottano lo stesso approccio.


7
Cordiali saluti, questa è una libreria PHP
Tristan Havelick,

19

La libreria lxml di Python funge da associazione Pythonic per le librerie libxml2 e libxslt. Mi piace in particolare il supporto XPath e la bella stampa della struttura XML in memoria. Supporta anche l'analisi di HTML non funzionante. E non penso che tu possa trovare altre librerie / associazioni Python che analizzano XML più velocemente di lxml.



16

Python ha diverse opzioni per lo scraping HTML oltre a Beatiful Soup. Eccone alcuni altri:

  • meccanizzare : simile al perl WWW:Mechanize. Ti dà un browser come oggetto da ereditare con le pagine web
  • lxml : associazione Python a libwww. Supporta varie opzioni per attraversare e selezionare elementi (ad es. Selezione XPath e CSS)
  • scrapemark : libreria di alto livello che utilizza modelli per estrarre informazioni dall'HTML.
  • pyquery : consente di eseguire jQuery come query su documenti XML.
  • scrapy : un framework di scraping e scansione web di alto livello. Può essere utilizzato per scrivere ragni, per il data mining e per il monitoraggio e test automatici

1
La libreria standard Python ha un parser HTML incorporato ... perché non usarlo? docs.python.org/2.7/library/htmlparser.html
ArtOfWarfare



11

L' utilità templatemaker di Adrian Holovaty (di fama Django ) utilizza un approccio molto interessante: le alimentate varianti della stessa pagina e "impara" dove si trovano i "buchi" per i dati variabili. Non è specifico dell'HTML, quindi sarebbe utile anche per scartare qualsiasi altro contenuto in chiaro. L'ho usato anche per PDF e HTML convertiti in testo normale (rispettivamente con pdftotext e lynx).


come hai fatto a far funzionare templatemaker per grandi pagine HTML? Ho scoperto che si arresta in modo anomalo quando gli do qualcosa di non banale.
hoju,

Suppongo di non avere grandi pagine HTML. Nessun problema archiviato sembra esistere per quel problema su code.google.com/p/templatemaker/issues/list, quindi è probabilmente opportuno inviare un caso di prova lì. Non sembra però che Adrian stia mantenendo la biblioteca. Mi chiedo che cosa usi al giorno d'oggi in EveryBlock poiché sicuramente fanno molto raschiare.
Akaihola,

10

Conosco e amo Screen-Scraper .

Screen-Scraper è uno strumento per l'estrazione di dati da siti Web. Screen-Scraper automatizza:

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

Usi comuni:

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

Tecnico:

* 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

Tre edizioni di screen-scraper:

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

Sfortunatamente nemmeno la versione Basic è FOSS. Sembra solo libero come nella birra.
Andreas Kuckartz,

9

Vorrei prima scoprire se i siti in questione forniscono un server API o feed RSS per accedere ai dati richiesti.


8

Scraping Stack Overflow è particolarmente facile con Scarpe e 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

Un'altra opzione per Perl sarebbe Web :: Scraper che si basa su Ruby Scrapi . In breve, con una sintassi piacevole e concisa, è possibile ottenere un robusto raschietto direttamente nelle strutture di dati.


7

Ho avuto qualche successo con HtmlUnit , in Java. È un framework semplice per la scrittura di unit test sull'interfaccia utente Web, ma ugualmente utile per lo scraping HTML.


puoi anche usarlo per valutare l'esecuzione di JavaScript se mai ne hai bisogno :)
David




5

Uso Hpricot su Ruby. Ad esempio questo è un frammento di codice che utilizzo per recuperare tutti i titoli dei libri dalle sei pagine del mio account HireThings (in quanto non sembrano fornire una sola pagina con queste informazioni):

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. Tutto ciò che precede è l'importazione delle librerie e le impostazioni per il mio proxy.


5

Ho usato molto Beautiful Soup con Python. È molto meglio del controllo delle espressioni regolari, perché funziona come l'uso del DOM , anche se l'HTML è formattato in modo scadente. È possibile trovare rapidamente tag e testo HTML con una sintassi più semplice rispetto alle espressioni regolari. Una volta trovato un elemento, puoi iterare su di esso e sui suoi figli, il che è più utile per comprendere i contenuti nel codice che non con le espressioni regolari. Vorrei che Beautiful Soup esistesse anni fa, quando dovevo fare un sacco di schermate: mi avrebbe risparmiato molto tempo e mal di testa dato che la struttura HTML era così scarsa prima che la gente iniziasse a convalidarla.


5

Sebbene sia stato progettato per i test Web .NET , ho utilizzato il framework WatiN per questo scopo. Dal momento che è basato su DOM, è abbastanza facile catturare HTML, testo o immagini. Recentemente, l'ho usato per scaricare un elenco di collegamenti da una query dello spazio dei nomi MediaWiki Tutte le pagine in un foglio di calcolo Excel. Il seguente frammento di codice VB.NET è piuttosto rozzo, ma funziona.


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

Saresti uno sciocco a non usare il Perl .. Ecco che arrivano le fiamme ..

Osserva i seguenti moduli e ginsu qualsiasi raschiatura intorno.

use LWP
use HTML::TableExtract
use HTML::TreeBuilder
use HTML::Form
use Data::Dumper

3

Ho usato LWP e HTML :: TreeBuilder con Perl e li ho trovati molto utili.

LWP (abbreviazione di libwww-perl) ti consente di connetterti a siti Web e di raschiare l'HTML, puoi ottenere il modulo qui e il libro di O'Reilly sembra essere online qui .

TreeBuilder consente di costruire un albero dall'HTML e la documentazione e l'origine sono disponibili in HTML :: TreeBuilder - Parser che crea un albero di sintassi HTML .

Tuttavia, potrebbe esserci ancora troppo lavoro pesante con qualcosa come questo approccio. Non ho esaminato il modulo Mechanize suggerito da un'altra risposta, quindi potrei farlo.



3

Bene, se vuoi farlo dal lato client usando solo un browser hai jcrawl.com . Dopo aver progettato il servizio di demolizione dall'applicazione Web ( http://www.jcrawl.com/app.html ), devi solo aggiungere lo script generato a una pagina HTML per iniziare a utilizzare / presentare i tuoi dati.

Tutta la logica di scraping avviene sul browser tramite JavaScript. Spero che lo trovi utile. Fai clic su questo link per un esempio dal vivo che estrae le ultime notizie da Yahoo tennis .


2

Probabilmente ne hai già tanto, ma penso che questo sia ciò che stai cercando di fare:

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

Mi piace la funzione ImportXML (URL, XPath) di Google Spreadsheets.

Ripeterà le celle nella colonna se l'espressione XPath restituisce più di un valore.

Puoi avere fino a 50 importxml()funzioni su un foglio di calcolo.

Il plugin Web di RapidMiner è anche abbastanza facile da usare. Può pubblicare post, accettare cookie e impostare l' agente utente .


2

Ho anche avuto un grande successo usando Jaxer + jQuery di Aptana per analizzare le pagine. Non è così veloce o "simile a uno script" in natura, ma i selettori jQuery + JavaScript / DOM reale salvano le pagine più complicate (o non corrette).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.