Optionen für HTML-Scraping? [geschlossen]


406

Ich denke an Beautiful Soup , ein Python-Paket für HTML-Scraping. Gibt es andere HTML-Scraping-Pakete, die ich mir ansehen sollte? Python ist keine Voraussetzung, ich bin eigentlich daran interessiert, auch über andere Sprachen zu hören.

Die Geschichte bisher:



Tag Soup Link ist tot.
Tapper7

HtmlUnit ist eine vollständige Java-Browser-Implementierung, die Sie nicht in Teile zerlegen können (Sie können nicht nur eine HTML-Seite herunterladen und kratzen, sondern alle verwiesenen Dateien herunterladen, Skripte ausführen usw.). Als solches glaube ich nicht, dass es hierher gehört.
Mark Jeronimus

Stock Java kann HTML mit XPath-Ausdrücken ausführen, allerdings nicht ohne Probleme. Der Parser-Teil (DocumentBuilder) drosselt falsches HTML, und 100% korrektes HTML ist im Web eigentlich ziemlich selten. Deshalb möchte ich den Parser durch JTidy ersetzen . Für XPath kann Java XPathExpressionverwendet werden (das seit Java 1.5 existiert)
Mark Jeronimus

Antworten:



44

In der .NET-Welt empfehle ich das HTML Agility Pack. Nicht annähernd so einfach wie einige der oben genannten Optionen (wie HTMLSQL), aber sehr flexibel. Sie können schlecht geformtes HTML so manipulieren, als wäre es gut geformtes XML, sodass Sie XPATH verwenden oder einfach über Knoten iterieren können.

http://www.codeplex.com/htmlagilitypack


2
Kombiniere Linq damit und es scheint eher wie HTMLSQL, nein?
Segne Yahu

3
Kombinieren Sie SharpQuery damit und es wird genau wie jQuery! code.google.com/p/sharp-query
mpen

1
HTML Agility Pack strukturiert das DOM für eine Reihe von HTML-Dokumenten, die ich ausprobiert habe, nicht korrekt.
Ash Berlin-Taylor

37

BeautifulSoup ist eine großartige Möglichkeit, HTML-Scraping durchzuführen. Bei meinem vorherigen Job habe ich viel geschabt und ich wünschte, ich wüsste etwas über BeautifulSoup, als ich anfing. Es ist wie das DOM mit viel nützlicheren Optionen und viel pythonischer. Wenn Sie Ruby ausprobieren möchten, haben sie BeautifulSoup portiert und es RubyfulSoup genannt, aber es wurde seit einiger Zeit nicht mehr aktualisiert.

Andere nützliche Tools sind HTMLParser oder sgmllib.SGMLParser, die Teil der Standard-Python-Bibliothek sind. Diese funktionieren, indem Methoden jedes Mal aufgerufen werden, wenn Sie ein Tag eingeben / beenden und auf HTML-Text stoßen. Sie sind wie Expat, wenn Sie damit vertraut sind. Diese Bibliotheken sind besonders nützlich, wenn Sie sehr große Dateien analysieren möchten und das Erstellen eines DOM-Baums langwierig und teuer wäre.

Reguläre Ausdrücke sind nicht sehr notwendig. BeautifulSoup verarbeitet reguläre Ausdrücke. Wenn Sie ihre Leistung benötigen, können Sie sie dort verwenden. Ich sage, gehen Sie mit BeautifulSoup, es sei denn, Sie benötigen Geschwindigkeit und einen geringeren Speicherbedarf. Wenn Sie einen besseren HTML-Parser für Python finden, lassen Sie es mich wissen.


21

Ich fand, dass HTMLSQL eine lächerlich einfache Möglichkeit ist, Bildschirmkratzer zu erstellen. Es dauert buchstäblich Minuten, um Ergebnisse zu erzielen.

Die Abfragen sind sehr intuitiv - wie:

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

Es gibt jetzt einige andere Alternativen, die den gleichen Ansatz verfolgen.



19

Die Python- lxml- Bibliothek fungiert als Pythonic-Bindung für die Bibliotheken libxml2 und libxslt. Ich mag besonders die XPath-Unterstützung und das hübsche Drucken der speicherinternen XML-Struktur. Es unterstützt auch das Parsen von defektem HTML. Und ich glaube nicht, dass Sie andere Python-Bibliotheken / -Bindungen finden können, die XML schneller analysieren als lxml.



16

Python bietet neben Beatiful Soup mehrere Optionen für HTML-Scraping. Hier sind einige andere:

  • mechanisieren : ähnlich wie Perl WWW:Mechanize. Gibt Ihnen ein browserähnliches Objekt, mit dem Sie mit Webseiten inaktiv werden können
  • lxml : Python-Bindung an libwww. Unterstützt verschiedene Optionen zum Durchlaufen und Auswählen von Elementen (z. B. XPath- und CSS-Auswahl)
  • Scrapemark : Bibliothek auf hoher Ebene, die Vorlagen zum Extrahieren von Informationen aus HTML verwendet.
  • pyquery : Ermöglicht das Erstellen von jQuery-ähnlichen Abfragen für XML-Dokumente.
  • Scrapy : Ein High-Level-Framework für Scraping und Webcrawling. Es kann zum Schreiben von Spinnen, zum Data Mining sowie zur Überwachung und automatisierten Prüfung verwendet werden

1
Die Python Standard Library verfügt über einen integrierten HTML-Parser. Warum nicht einfach diesen verwenden? docs.python.org/2.7/library/htmlparser.html
ArtOfWarfare



11

Das Templatemaker- Dienstprogramm von Adrian Holovaty (von Django ) verwendet einen sehr interessanten Ansatz: Sie geben Variationen derselben Seite ein und "lernen", wo sich die "Löcher" für variable Daten befinden. Es ist nicht HTML-spezifisch, daher eignet es sich auch zum Scrapen anderer Klartextinhalte. Ich habe es auch für PDFs und HTML verwendet, die in Klartext konvertiert wurden (mit pdftotext bzw. lynx).


Wie haben Sie Templatemaker dazu gebracht, für große HTML-Seiten zu arbeiten? Ich fand es stürzt ab, wenn ich ihm etwas nicht Triviales gebe.
Hoju

Ich hatte wohl keine großen HTML-Seiten. Für dieses Problem scheinen unter code.google.com/p/templatemaker/issues/list keine eingereichten Probleme vorhanden zu sein. Daher ist es wahrscheinlich angebracht, dort einen Testfall zu senden. Es sieht jedoch nicht so aus, als würde Adrian die Bibliothek unterhalten. Ich frage mich, was er heutzutage bei EveryBlock verwendet, da sie sicherlich viel kratzen.
Akaihola

10

Ich kenne und liebe Screen-Scraper .

Screen-Scraper ist ein Tool zum Extrahieren von Daten von Websites. Screen-Scraper automatisiert:

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

Allgemeine Verwendungen:

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

Technisch:

* 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

Drei Ausgaben von 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.

Leider ist nicht einmal die Basisversion FOSS. Es scheint nur frei zu sein wie bei Bier.
Andreas Kuckartz

9

Ich würde zuerst herausfinden, ob die fraglichen Sites einen API-Server oder RSS-Feeds für den Zugriff auf die von Ihnen benötigten Daten bereitstellen.


8

Der Überlauf von Scraping Stack ist mit Schuhen und Hpricot besonders einfach .

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


7

Ich habe einige Erfolge mit HtmlUnit in Java erzielt . Es ist ein einfaches Framework zum Schreiben von Komponententests auf Web-Benutzeroberflächen, aber ebenso nützlich für das HTML-Scraping.


Sie können es auch verwenden, um die Ausführung von Javascript zu bewerten, wenn Sie jemals die Notwendigkeit haben :)
David




5

Ich benutze Hpricot auf Ruby. Als Beispiel ist dies ein Codeausschnitt, mit dem ich alle Buchtitel von den sechs Seiten meines HireThings-Kontos abrufe (da sie anscheinend keine einzige Seite mit diesen Informationen enthalten):

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 

Es ist ziemlich vollständig. Alles, was davor kommt, sind Bibliotheksimporte und die Einstellungen für meinen Proxy.


5

Ich habe Beautiful Soup viel mit Python verwendet. Es ist viel besser als die Überprüfung regulärer Ausdrücke, da es wie die Verwendung des DOM funktioniert , auch wenn der HTML-Code schlecht formatiert ist. Sie können schnell HTML-Tags und Text mit einfacherer Syntax als reguläre Ausdrücke finden. Sobald Sie ein Element gefunden haben, können Sie es und seine untergeordneten Elemente durchlaufen. Dies ist für das Verständnis des Inhalts im Code nützlicher als bei regulären Ausdrücken. Ich wünschte, Beautiful Soup existierte vor Jahren, als ich viel Screenscraping durchführen musste - es hätte mir viel Zeit und Kopfschmerzen gespart, da die HTML-Struktur so schlecht war, bevor die Leute damit begannen, sie zu validieren.


5

Obwohl es für .NET - Webtests entwickelt wurde , habe ich zu diesem Zweck das WatiN- Framework verwendet. Da es DOM-basiert ist, ist es ziemlich einfach, HTML, Text oder Bilder zu erfassen. Kürzlich habe ich damit eine Liste von Links aus einer MediaWiki All Pages-Namespace-Abfrage in eine Excel-Tabelle geschrieben. Die folgende VB.NET- Code-Verwaltung ist ziemlich grob, funktioniert aber.


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

Du wärst ein Dummkopf, wenn du Perl nicht benutzt. Hier kommen die Flammen.

Bone up auf den folgenden Modulen und ginsu alle Kratzer herum.

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

3

Ich habe LWP und HTML :: TreeBuilder mit Perl verwendet und fand sie sehr nützlich.

Mit LWP (kurz für libwww-perl) können Sie eine Verbindung zu Websites herstellen und den HTML-Code kratzen. Sie können das Modul hier und das O'Reilly-Buch herunterladen scheint hier online zu sein .

Mit TreeBuilder können Sie einen Baum aus dem HTML erstellen. Dokumentation und Quelle sind in HTML :: TreeBuilder - Parser verfügbar , der einen HTML-Syntaxbaum erstellt .

Es könnte jedoch noch zu viel schweres Heben geben, um mit so etwas zu tun zu haben. Ich habe mir das von einer anderen Antwort vorgeschlagene Mechanize-Modul nicht angesehen , daher kann ich das durchaus tun.



3

Wenn Sie möchten, dass dies vom Client aus nur mit einem Browser durchgeführt wird, haben Sie jcrawl.com . Nachdem Sie Ihren Verschrottungsdienst über die Webanwendung ( http://www.jcrawl.com/app.html) erstellt haben ) erstellt haben, müssen Sie nur das generierte Skript zu einer HTML-Seite hinzufügen, um Ihre Daten verwenden / präsentieren zu können.

Die gesamte Verschrottungslogik erfolgt im Browser über JavaScript. Ich hoffe, Sie finden es nützlich. Klicken Sie auf diesen Link, um ein Live-Beispiel zu erhalten, das die neuesten Nachrichten aus Yahoo Tennis extrahiert .


2

Sie haben wahrscheinlich schon so viel, aber ich denke, das ist, was Sie versuchen zu tun:

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

Ich mag die ImportXML-Funktion (URL, XPath) von Google Spreadsheets.

Es werden Zellen in der Spalte wiederholt, wenn Ihr XPath-Ausdruck mehr als einen Wert zurückgibt.

Sie können bis zu 50 importxml()Funktionen in einer Tabelle haben.

Das Web-Plugin von RapidMiner ist auch ziemlich einfach zu bedienen. Es kann Beiträge verfassen, Cookies akzeptieren und den Benutzeragenten festlegen .


2

Ich hatte auch großen Erfolg mit Aptanas Jaxer + jQuery zum Parsen von Seiten. Es ist nicht so schnell oder "skriptartig", aber jQuery-Selektoren + echtes JavaScript / DOM sind ein Lebensretter auf komplizierteren (oder fehlerhaften) Seiten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.