[ Horvat @ 30.06.2011. 14:29 ] @
da li neko moze da mi pojasni kako u c-u (c znam malo bolje od ostalih jezika, ali i to i dalje nije na zavidnom nivou,pa bih malo da unapredim) da napravim programcic koji ce skinuti web stranicu?

znaci, u c-u mu odredim hocu da mi svaki dan skines naslovnu sa jednog dnevnika (dnevnog lista) i da mi izvuce naslove i kratak opis (ovo je vec drugi deo)
to je prvi korak, drugi korak je da recimo sam upise u polje za pretragu neki pojam (recimo "subotica" u nekom dnevnom listu) i sacuva mi sadrzaje samo tih vesti i da vidi da li je bilo nekih gresaka,ili (sada sledi treci korak)
(treci korak)ukoliko je zbog previse pretraga neki dnevni list rekao da moram da upisem captcha, izbaci mi polje, tj slicicu sadrzaja koji trebam napisati (ili sam napise, napomena, ne trazim da mi napisete program koji razbija captcha ;) )

dakle, da rezimiram, treba mi pomoc (radio bih u code blocks-u, sa onim gnu kompajlerom, cisto da se zna koje nedostatke moze da ima) kako da bez otvaranja web browsera i posredovanja dobijem ispis u programcicu sadrzaja naslova vesti, zatim, da isto tako sam pretrazi (ne te sadrzaje, vec pomocu polja za pretragu dnevnog lista) po odredjenom kriterijumu/kriterijumima i isto tako poskida sadrzaje vezane za to ili da ispise zbog cega nije mogao i naravno ne zelim SUVI KOD, nego bih hteo pojasnjenje zasto taj deo tamo i sta radi (da bih i mogao nesto nauciti)

hvala vam unapred
[ pajaja @ 30.06.2011. 14:48 ] @
Pozdrav,

sto se prvog dela tice, bindujes tcp socket na port 80 servera sa koga zelis da skines stranu i posaljes mu http get request sa fajlom (/index.html ili sta ti vec treba), on ce da ti vrati cist HTML koga ti posle treba da parsiras, tj izvuces naslov itd. Taj deo ti je najlakse da uradis regularnim izrazima, sa tim sto ces morati da napises poseban pattern za svaki sajt. Sto se pretrage tice, ista stvar kao i sa naslovnom stranom, posaljes serveru get/post request sa url-om u kome ti stoje kljucne reci (pogledas kako izgleda pretraga na svakom sajtu). Sto se captche tice... ne znam koliko je to jednostavno uraditi u C-u, obzirom da bi trebalo da ti se prikazuje slika.
[ Horvat @ 30.06.2011. 14:53 ] @
a koja je komanda za slanje http zahteva? (da,znam da ovo zvuci izrazito glupo ;) )

hmmm, za drugi deo, ako je post komanda,moram simulirati iste parametre, je l tako? (npr ima hidden field sa sadrzajem "pretraga" i to moram poslati sa zahtevom)

za treci deo,bas sam ceprkao code blocks i ima i deo "opengl" i sad gledam kod, suvi c je, i prikazuje neki trougao koji se vrti (malo sam cackao, pa sam izmenio velicinu, oblik, boje i slicno tog trokuta), pa me to navelo na pomisao da je i u c-u moguce videti slike i praviti ih, ne?

[ pajaja @ 30.06.2011. 15:10 ] @
Get, post, ne-http, sve saljes na isti nacin u obliku teksta funkcijom int send() iz sys/socket.h.
Na primer za get naslovne gugla bi ti poruka koju saljes bila:
Code (c):
char *msg = "GET /index.html HTTP/1.1\nHost: www.google.com\0";

za post slicno, pogledaj kako izgledaju HTTP requestovi. Trebalo bi da posaljes sva polja koja se zahtevaju, to probaj pa vidi sta ti sve treba.


Sto se prikazivanja slika tice, iskreno nisam nikada pokusavao da uradim to u c-u tako da ne mogu da ti kazem nista o tome. Verovatno moze, samo je pitanje sa koliko cimanja:)
[ deerbeer @ 30.06.2011. 15:22 ] @
Citat:

Sto se prikazivanja slika tice, iskreno nisam nikada pokusavao da uradim to u c-u tako da ne mogu da ti kazem nista o tome. Verovatno moze, samo je pitanje sa koliko cimanja:)

Samo da isparsira HTML po standardu . piece of cake :)
[ Horvat @ 30.06.2011. 16:16 ] @
hmmm
kad ubacim #include <sys/socket.h> u build log-u mi izbaci
Citat:
sys/socket.h: No such file or directory


zatim, bez toga programcic proradi, ali ne dobijem nista,ondosno rezultat je
Code:
Process returned 1 (0x1)   execution time : 0.062 s
Press any key to continue.


[edit]nasao sam da u codeblocks je ovo
Code:
#include <winsock.h>
#include <winsock2.h>


al i dalje ne radi nista, moram skontati kako da ispise :D[/edit]

(kod trenutno izgleda sturo, cini mi se da fali nesto :D)
Code:
#include <stdio.h>
#include <stdlib.h>

int main()
{
char *msg = "GET /index.html HTTP/1.1\nHost: www.google.com\0";
}


Citat:
deerbeer: Samo da isparsira HTML po standardu . piece of cake :)

moze pojasnjenje? :]

[ Horvat @ 30.06.2011. 17:40 ] @
nece pa nece :(

nasao sam i neki kod (za linux pisan valjda),pa sam umesto socket.h ubacio winsock.h i winsock2.h, ali i dalje izbacuje da je pun gresaka :(
Code:
/*
** client.c -- a stream socket client demo
*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>

#include <arpa/inet.h>

#define PORT "3490" // the port client will be connecting to 

#define MAXDATASIZE 100 // max number of bytes we can get at once 

// get sockaddr, IPv4 or IPv6:
void *get_in_addr(struct sockaddr *sa)
{
    if (sa->sa_family == AF_INET) {
        return &(((struct sockaddr_in*)sa)->sin_addr);
    }

    return &(((struct sockaddr_in6*)sa)->sin6_addr);
}

int main(int argc, char *argv[])
{
    int sockfd, numbytes;  
    char buf[MAXDATASIZE];
    struct addrinfo hints, *servinfo, *p;
    int rv;
    char s[INET6_ADDRSTRLEN];

    if (argc != 2) {
        fprintf(stderr,"usage: client hostname\n");
        exit(1);
    }

    memset(&hints, 0, sizeof hints);
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;

    if ((rv = getaddrinfo(argv[1], PORT, &hints, &servinfo)) != 0) {
        fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
        return 1;
    }

    // loop through all the results and connect to the first we can
    for(p = servinfo; p != NULL; p = p->ai_next) {
        if ((sockfd = socket(p->ai_family, p->ai_socktype,
                p->ai_protocol)) == -1) {
            perror("client: socket");
            continue;
        }

        if (connect(sockfd, p->ai_addr, p->ai_addrlen) == -1) {
            close(sockfd);
            perror("client: connect");
            continue;
        }

        break;
    }

    if (p == NULL) {
        fprintf(stderr, "client: failed to connect\n");
        return 2;
    }

    inet_ntop(p->ai_family, get_in_addr((struct sockaddr *)p->ai_addr),
            s, sizeof s);
    printf("client: connecting to %s\n", s);

    freeaddrinfo(servinfo); // all done with this structure

    if ((numbytes = recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) {
        perror("recv");
        exit(1);
    }

    buf[numbytes] = '\0';

    printf("client: received '%s'\n",buf);

    close(sockfd);

    return 0;
}


a nema komentara koji objasnjavaju sta je sta :(
[ pajaja @ 30.06.2011. 18:52 ] @
Pozdrav,

Citat:
deerbeer: Samo da isparsira HTML po standardu . piece of cake :)

Koliko sam shvatio, trazio je samo da izvuce naslov i opis teksta. Za to mu ne treba nikakav standard, samo da zna gde se u html-u nalazi to sto mu treba:)

[qoute]sys/socket.h: No such file or directory[/quote]
Da, treba ti ili Cygwin ili da koristis winsock2.h. Neces moci samo tako da prepravis bsd socket u winsock2.h i da radi bez da diras ostatak.

Citat:
kod trenutno izgleda sturo, cini mi se da fali nesto :D

umm, pa fali mu sve:D

Prvo bindujes socket za neku adresu i port, onda posaljes taj msg koji imas tu u kodu i onda procitas sa socketa procitas odgovor servera. To je pocetak i to je tako duzine ovoga sto si nasao:) Za sve to pogledaj dokumentaciju za bsd ili win socket zavisi sta ces da koristis.

Iskreno, mislim ti je bolja varijanta da to uradis u nekom skript jeziku tipa python. Lakse je a i moci ces da napravis i gui ako ti bas treba.

[ Horvat @ 30.06.2011. 19:25 ] @
pa kad bi postojalo pojasnjenje sta je sta u kodu, mogao bih prepraviti,ovako na slepo tesko :(

na zalost, s python se nikad nisam igrao, pa ne znam ni kako zapocinje programski (skriptni) kod :(
ali,da, gui bi bio sledeci stepen, kad bih ovo "savladao", da mogu da "lokalno" pregledam naslove, i pretrazim te naslove (za to sam mislio da "nekako" spojim ovaj c kod sa mozda nekim drugim c ili c++)

nasao sam na msdn neku dokumentaciju vezanu za winsock, medjutim kad ubacim kod i kompajliram ga dobijem opet greske (rekao bih da je kod pisan za visual studio, sto opet ima "sitnih" razlika u samom programskom jeziku :( )

bio bih ti dodatno zahvalan ako bi me uputio na neki dokument koji se bavi socket programiranjem u c-u, a da pri tome je za windows, a nije za visual studio

p.s. ako bih se ipak odlucio za pitona, odakle bi mi savetovao da pocnem?
[ pajaja @ 30.06.2011. 20:21 ] @
Pa u principu nije bas pametno prepravljati, posebno ako ne znas tacno sta kako radi, nego napisati iz pocetka:)
Zato sam ti i pomenuo python (ako nije zahtevano da bas bude c), neuporedivo lakse i brze ces da zavrsis sve to. Za razliku od svega onoga sto bi ti trebalo da napises u c-u sto se odnosi na mrezni deo, preuzimanje strane u pythonu bi ti se svelo na:
Code (python):
import urllib
print urllib.urlopen("http://www.google.com/index.html").read()

kao i vecina drugih stvari. Imas dobru dokumentaciju sa primerima ovde. Ali to vec nije za ovde nego za python forum:) Ako ne baratas dobro sa pointerima/strukturama u c-u bolje da odmah krenes sa necim laksim.