Also habe ich ein Website-Scraper-Programm in C# mit dem HTML Agility-Paket geschrieben. Das war ziemlich geradlinig. Selbst wenn Inkonsistenzen bei der Formatierung auf der Webseite berücksichtigt wurden, brauchte ich nur ein paar Stunden, um zu arbeiten.Wie scrape ich eine Webseite mit C?
Jetzt muss ich dieses Programm in C neu implementieren, damit es in einer Linux-Umgebung ausgeführt werden kann. Dies ist ein großer Albtraum.
Ich kann die Seite zurückziehen, aber wenn es darum geht, durch sie zu ziehen, um die Teile herauszuziehen, die mich interessieren - ich zeichne viele Leerzeichen. Ursprünglich wollte ich eine Lösung implementieren, die meiner HTML-Agility-Option in C# ähnelte, außer mit Tidy und einer anderen XML-Bibliothek, damit ich meine Logik mehr oder weniger beibehalten konnte.
Das hat nicht so gut funktioniert. Die XML-Bibliothek, auf die ich Zugriff habe, scheint xpath nicht zu unterstützen, und ich kann keine installieren, die dies tut. Also habe ich versucht, einen Weg zu finden, die Seite zu lesen, indem ich einen String-Matching verwende, um die gewünschten Daten zu finden. Ich kann nicht anders als zu glauben, dass es einen besseren Weg dafür geben muss.
Hier ist, was ich habe:
#define HTML_PAGE "codes.html"
int extract()
{
FILE *html;
int found = 0;
char buffer[1000];
char searchFor[80], *cp;
html = fopen(HTML_PAGE, "r");
if (html)
{
// this is too error prone, if the buffer cuts off half way through a section of the string we are looking for, it will fail!
while(fgets(buffer, 999, html))
{
trim(buffer);
if (!found)
{
sprintf(searchFor, "<strong>");
cp = (char *)strstr(buffer, searchFor);
if(!cp)continue;
if (strncmp(cp + strlen(searchFor), "CO1", 3) == 0 || strncmp(cp + strlen(searchFor), "CO2", 3) == 0)
{
got_code(cp + strlen(searchFor));
}
}
}
}
fclose(html);
return 0;
}
got_code(html)
char *html;
{
char code[8];
char *endTag;
struct _code_st *currCode;
int i;
endTag = (char *)strstr(html, "</strong>");
if(!endTag)return;
sprintf(code, "%.7s", html);
for(i=0 ; i<Data.Codes ; i++)
if(strcasecmp(Data.Code[i].Code, code)==0)
return;
ADD_TO_LIST(currCode, _code_st, Data.Code, Data.Codes);
currCode->Code = (char *)strdup(code);
printf("Code: %s\n", code);
}
Die oben nicht richtig funktioniert. Ich bekomme viele der Codes, die mich interessieren, aber wie ich oben erwähnt habe, wenn der Puffer an den falschen Stellen abschneidet, vermisse ich etwas.
Ich habe gerade versucht, den ganzen Teil von HTML zu lesen, an dem ich interessiert bin, in eine Zeichenfolge, aber ich konnte nicht herausfinden, wie man das durchläuft - ich konnte keine Codes angezeigt bekommen.
Weiß jemand, wie ich dieses Problem lösen kann?
EDIT: Ich habe darüber mehr nachgedacht. Gibt es irgendeine Möglichkeit, in der Datei nach vorne zu schauen und nach dem Ende jedes 'Blocks' des zu analysierenden Textes zu suchen und die Puffergröße so einzustellen, dass ich sie lesen kann? Benötige ich einen anderen Dateizeiger für dieselbe Datei? Dies würde (hoffentlich) das Problem des Abschneidens des Puffers an ungünstigen Stellen verhindern.
Vielleicht mit Mono laufen? –
C ist großartig, aber nicht für diese Art von Aufgabe. Verwenden Sie stattdessen etwas anderes, wie Perl oder Python. Hölle, würde sogar PHP tun. –
Ja, ich muss zustimmen. Es fühlt sich einfach wie das falsche Werkzeug für den Job an. –