Opzioni per lo scraping HTML?

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, sono anche interessato a conoscere altre lingue.

La storia così lontana:

  • Pitone
    • Bella zuppa
    • lxml
    • HTQL
    • Scrapy
    • Meccanizzare
  • Rubino
    • nokogiri
    • Hpricot
    • Meccanizzare
    • scrAPI
    • scRUBYt!
    • wombat
    • Watir
  • .NETTO
    • Html Agility Pack
    • WatiN
  • Perl
    • WWW :: Mechanize
    • Web-scraper
  • Giava
    • Zuppa di tag
    • HtmlUnit
    • Web-Harvest
    • jARVEST
    • jsoup
    • Jericho HTML Parser
  • JavaScript
    • richiesta
    • ciao
    • Artoo
    • node-cavaliere
    • phantomjs
  • PHP
    • Goutte
    • htmlSQL
    • Parser DOM HTML HTML semplice
    • PHP Scraping con CURL
  • La maggior parte di loro
    • Screen-scraper

L’equivalente del mondo di Ruby a Beautiful Soup è Hpricot why_the_lucky_stiff .

Nel mondo .NET, raccomando l’HTML Agility Pack. Non è semplice come alcune delle opzioni di cui sopra (come HTMLSQL), ma è molto flessibile. Ti permette di impupare HTML malformato come se fosse un XML ben formato, quindi puoi usare XPATH o semplicemente iterare sui nodes.

http://www.codeplex.com/htmlagilitypack

BeautifulSoup è un ottimo modo per utilizzare lo scraping HTML. Il mio precedente lavoro mi ha fatto fare molti graffi e vorrei 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. Questi funzionano chiamando i metodi ogni volta che si entra / esce da un tag e si incontra un testo html. Sono come Expat se ti è familiare. Queste librerie sono particolarmente utili se si analizzano file di grandi dimensioni 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 andare con BeautifulSoup a meno che non ti serva velocità e un minor ingombro di memoria. Se trovi un parser HTML migliore su Python, fammi sapere.

Ho trovato HTMLSQL come un modo ridicolmente semplice di fare lo screen-screen. Ci vogliono letteralmente minuti per ottenere risultati con esso.

Le query sono superintuitive – come:

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

Ora ci sono altre alternative che adottano lo stesso approccio.

La libreria lxml Python funge da binding Python per le librerie libxml2 e libxslt. Mi piace in particolare il suo supporto XPath e la buona stampa della struttura XML in memoria. Supporta anche l’analisi dell’HT rotto. E non penso che tu possa trovare altre librerie / associazioni Python che analizzano XML più velocemente di lxml.

Per Perl, c’è WWW :: Mechanize.

‘Simple HTML DOM Parser’ è una buona opzione per PHP, se conosci i selettori jQuery o JavaScript, allora ti troverai a casa.

Trovalo qui

C’è anche un post sul blog qui.

Perché nessuno ha ancora menzionato JSOUP per Java? http://jsoup.org/

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

  • mechanize : simile a perl WWW:Mechanize . Ti fornisce un browser come object per interagire con le pagine web
  • lxml : collegamento Python a libwww . Supporta varie opzioni per attraversare e selezionare elementi (ad esempio XPath e selezione CSS)
  • scrapemark : libreria di alto livello che utilizza i modelli per estrarre informazioni da HTML.
  • pyquery : ti permette di creare query jQuery su documenti XML.
  • scrapy : un sistema di raschiamento e web crawling di alto livello. Può essere usato per scrivere spider, per il data mining e per il monitoraggio e test automatici

L’utilità per i templatic di Adrian Holovaty (di fama Django ) usa un approccio molto interessante: le si alimentano con variazioni della stessa pagina e “impara” dove sono i “buchi” per i dati variabili. Non è specifico per l’HTML, quindi sarebbe utile anche per raschiare qualsiasi altro contenuto di testo in chiaro. L’ho usato anche per PDF e HTML convertiti in testo normale (con pdftotext e lynx, rispettivamente).

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

Conosco e amo Screen-Scraper .

Screen-Scraper è uno strumento per estrarre 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. 

Un’altra opzione per Perl sarebbe Web :: Scraper che si basa su Ruby’s Scrapi . In poche parole, con una syntax piacevole e concisa, è ansible ottenere un robusto raschietto direttamente nelle strutture dati.

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

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

Yahoo! È ansible utilizzare il linguaggio di query o YQL insieme a jQuery, AJAX, JSONP per eseguire lo screening delle pagine Web

Un altro strumento per .NET è MhtBuilder

C’è anche questa soluzione: netty HttpClient

Io uso Hpricot su Ruby. Ad esempio questo è uno snippet di codice che uso per recuperare tutti i titoli dei libri dalle sei pagine del mio account HireThings (poiché non sembrano fornire una singola 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 sono le importazioni di librerie e le impostazioni per il mio proxy.

Ho usato Beautiful Soup molto con Python. È molto meglio del controllo delle espressioni regolari, perché funziona come l’utilizzo del DOM , anche se l’HTML non è formattato correttamente. È ansible trovare rapidamente tag HTML e testo con una syntax più semplice rispetto alle espressioni regolari. Una volta trovato un elemento, puoi scorrere su di esso e sui suoi figli, che è più utile per capire il contenuto nel codice di quanto non lo sia con le espressioni regolari. Vorrei che esistesse anni prima la bella zuppa quando dovevo fare molti screenshot – mi avrebbe risparmiato un sacco di tempo e mal di testa poiché la struttura HTML era così scarsa prima che la gente iniziasse a convalidarla.

Sebbene sia stato progettato per il web test di .NET , ho utilizzato il framework WatiN per questo scopo. Poiché è basato su DOM, è piuttosto semplice acquisire HTML, testo o immagini. Recentemente, l’ho usato per scaricare un elenco di collegamenti da una query dello spazio dei nomi di MediaWiki Tutte le pagine in un foglio di calcolo di Excel. Il seguente frazionamento del codice VB.NET è piuttosto grezzo, 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 

Implementazioni dell’algoritmo di parsing HTML5 : html5lib (Python, Ruby), Validator.nu HTML Parser (Java, JavaScript, C ++ in sviluppo), Hubbub (C), Twintsam (C #; imminente).

Saresti un pazzo a non usare Perl .. Ecco che arrivano le fiamme ..

Osso sui seguenti moduli e ginsu tutto intorno.

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

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

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

TreeBuilder ti permette di build un albero da HTML, e la documentazione e l’origine sono disponibili in HTML :: TreeBuilder – Parser che costruisce un albero di syntax HTML .

Potrebbero esserci troppi sollevamenti ancora da fare con qualcosa come questo approccio. Non ho esaminato il modulo Mechanize suggerito da un’altra risposta, quindi potrei farlo.

In Java, puoi usare TagSoup .

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

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

Probabilmente lo hai già fatto, ma penso che questo sia quello 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+)') #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") 

Ho avuto risultati misti in .NET usando SgmlReader che era originariamente avviato da Chris Lovett e che sembra essere stato aggiornato da MindTouch .

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

Ripeterà le celle lungo la colonna se l’espressione XPath restituisce più di un valore.

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

Il plug-in Web di RapidMiner è anche piuttosto facile da usare. Può fare post, accettare cookie e impostare l’ user-agent .

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