jak poskladac żądanie HTTP1.1:GET

0

Problem pojawia się tylko i wyłącznie przy jednej witrynie. Przy każdej innej nie mam tego problemu i wszystko działa prawidłowo

The server committed a protocol violation. Section=ResponseStatusLine

Taki error dostaję przy próbie pobrania danych ze strony http://filmweb.pl/

onet.pl, allegro.pl, wp.pl - itp nie są "zabezpieczone" i ich zawartość jest dobrze ściągana.

Mój kod odpowiedzialny za pobieranie wygląda następująco:

WebClient oClient = new System.Net.WebClient();
string sFullHtml = oClient.DownloadString(linkFilm.Text);
textBox1.Text = sFullHtml;

linkFilm oraz textBox1 to TextBox'y

Ktoś wie jak rozwiązać ten problem?

Ominąć pośrednio wiem jak - http://mojastrona.pl/?go=http://filmweb.pl/ i PHP mi pobierze kod i zwróci go... no, ale nie o to chodzi. Bo mogą jutro zbanować IP serwera i po ptokach. To by była walka z wiatrakami.

0

sprobuj z GETEM . Czyli Request + Response + getResponseStream + stream.ReadToEnd();

Radze samemu poszukać ,bo ostatnio bylo sporo razy. Moge napisac tak mnie wiecej ,chociaz duze prawdopodobienstwo ,ze bedzie zle.

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://www.filmweb.pl/"); 
            req.ContentType = "Content-Type: text/html; charset=UTF-8";
            req.Method = "GET";
            req.UserAgent = "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; FunWebProducts; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 1.1.4322)";
            req.KeepAlive = true;
       
          
                var wres2 = (HttpWebResponse)req.GetResponse();
                Stream resStream2 = wres2.GetResponseStream();
                StreamReader reader2 = new StreamReader(resStream2);

                //zwraca kod strony glownej
                string kodzrodlowy2 = reader2.ReadToEnd();
0

Dziękuję za szybką odpowiedź.

Próbowałem tą metodą (nie z takimi parametrami jak podałeś), ale i tak nie działa.
Występuje ten sam błąd, dla tylko tej strony :(

0

filmweb.pl na

GET / HTTP/1.1

odpowiada

HTTP/1.1 400 Bad Request
Connection: close
Server: Apache

wp tak samo, i identycznie na:

GET / HTTP/1.1
Content-Type: text/html

z kolei na:

GET /index.html HTTP/1.1
Host: filmweb.pl
Content-Type: text/html

wp odpowiada na analogiczny trescia natychmiast, zas filmweb mowi:

HTTP/1.1 301 Moved Permanently <-różnica
Set-Cookie: jetbackup=0;path=/;domain=.filmweb.pl
Date: Wed, 08 Apr 2009 0634 GMT
Location: http://www.filmweb.pl/index.html <-hint
Connection: close
Server: Apache

kolejne podejscie to oczywiscie jump na wskazany adres..

GET /index.html HTTP/1.1
Host: www.filmweb.pl <-różnica
Content-Type: text/html

i co? sciagnelo sie..
polecam

TELNET FILMWEB.PL 80

i opisy formatu żądań GET.. wszystkie ww żądania przetestowane z palca w 10 minut, ot, przed chwilką

btw. żeby ściagnać filmweb wprost, wystarczy ten ostatni get, wyslany natychmiast. redirect z set-cookie jest zbedny, filmweb wysyla tresc rowniez bez owego cookie.

0

Albo zamiast się telnetować i zgadywać co wpisać - podsłuchać przeglądarkę ;-P

0

nie musialem zgadywac, a podsluchiwanie przegladarki nijak odpowie Ci na pytanie: czego serwer wymaga?

0
quetzalcoatl napisał(a)

nie musialem zgadywac, a podsluchiwanie przegladarki nijak odpowie Ci na pytanie: czego serwer wymaga?

Autor nie zaznaczył, że taka wiedza jest mu potrzebna.

0

Autor nie zaznaczyl, ze nie chce takiej wiedzy

0

Witam serdecznie
Ja tez mam kłopocik z filmweb.
Mam nadzieje że mi pomożecie.
Próbowałem zastosować powyższy kod ale dostaje ciągle stronę z kliknięcie żeby przejść do strony filmweb.pl

            SetAllowUnsafeHeaderParsing();
            HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create("http://www.filmweb.pl");
            WebReq.Method = "GET";
            WebReq.ContentType = "Content-Type: text/html; charset=utf-8";
            WebReq.UserAgent = "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; FunWebProducts; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 1.1.4322)";
            WebReq.KeepAlive = true;
            HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();
            Stream Answer = WebResp.GetResponseStream();
            StreamReader _Answer = new StreamReader(Answer);
            textBox1.Text = _Answer.ReadToEnd();

Czy mógłby ktoś z was pomóc mi to rozwiązać ??
Pozdrawiam
Savior

0

przeciez quetzalcoatl wszystko napisal

quetzalcoatl napisał(a)

filmweb.pl na

GET /index.html HTTP/1.1
Host: filmweb.pl
Content-Type: text/html

wp odpowiada na analogiczny trescia natychmiast, zas filmweb mowi:

HTTP/1.1 301 Moved Permanently <-różnica
Set-Cookie: jetbackup=0;path=/;domain=.filmweb.pl
Date: Wed, 08 Apr 2009 0634 GMT
Location: http://www.filmweb.pl/index.html <-hint
Connection: close
Server: Apache

co oznacza odpowiedz serwera 301 ? Moved Permanently
gdzie? w tym przypadku Location: http://www.filmweb.pl/index.html, wiec trzeba odpytac o taki adres, a nie www.filmweb.pl

0
            SetAllowUnsafeHeaderParsing();
            HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create("http://www.filmweb.pl/index.html");
            WebReq.Method = "GET";
            WebReq.ContentType = "Content-Type: text/html; charset=utf-8";
            WebReq.UserAgent = "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; FunWebProducts; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 1.1.4322)";
            WebReq.KeepAlive = true;
            HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();
            Stream Answer = WebResp.GetResponseStream();
            StreamReader _Answer = new StreamReader(Answer);
            textBox1.Text = _Answer.ReadToEnd();

i nadal dostaje tą stronkę z kliknięciem "przejdz do filmweb.pl"
jeszcze jakoś pomysł ??
dodam że filmweb zmienił stronę kilka dni temu !!

0

czegos nie doczytalem, zeby nie bylo za latwo, bo juz kilkanascie min. poswiecilem na to, dam na razie podpowiedz, popatrz jakie ciasteczka ustawia ta strona, jak do swojego requestu dodasz odpowiednie ciacho bedzie ok

0
SetAllowUnsafeHeaderParsing();
            HttpWebRequest zapytanie = (HttpWebRequest)WebRequest.Create("http://www.filmweb.pl/index.html");
            zapytanie.Method = "GET";
            zapytanie.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)";  
            zapytanie.ContentType = "application/x-www-form-urlencoded";
            zapytanie.KeepAlive = true;
            zapytanie.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
            zapytanie.Referer = "http://www.filmweb.pl/";
            zapytanie.CookieContainer = kontener;
            zapytanie.AllowAutoRedirect = true;
            HttpWebResponse odpowiedz = (HttpWebResponse)zapytanie.GetResponse();
            StreamReader odpowiedzSTR = new StreamReader(odpowiedz.GetResponseStream()); 
            odpowiedz.Cookies = zapytanie.CookieContainer.GetCookies(zapytanie.RequestUri);
            Encoding PosterEnc = System.Text.Encoding.UTF8;
            StreamReader PosterResponseStreamReader = new StreamReader(odpowiedz.GetResponseStream(), PosterEnc, true);
            label16.Text = Convert.ToString(kontener.Count);
            textBox1.Text += PosterResponseStreamReader.ReadToEnd();

próbuje tak i mam tą samą odpowiedz
zerknie ktoś czy o to chodzi ??
Strona po pierwszym wejściu wysyła trzy ciastka.
i nie wiem jak je wykorzystać.

0

nie chodzi o referera
co to kontener? tzn. jak to jest stworzone, wypelnione?
zobacz sobie w przegladarce jakie ta strona ciasteczka wystawia, jest tam m.in. takie welcomeScreen=welcomeScreen, jak ono jest laduje strone glowna, nie reklame

0

public CookieContainer kontener = new CookieContainer();

kontener do przechowywania ciastek.
przetłumaczyłem żeby lepiej to zrozumieć
tylko nie wiem jak potem te ciastko załadować (nie wiem jak to napisać) żeby strona odpowiedziała poprawnie.

0

filmweb ma obecnie jakiegos zonka.
start:

GET / HTTP/1.1
Host: www.filmweb.pl
Content-Type: text/html

request przyjety, odpowiedz:

HTTP/1.1 200 OK
Set-Cookie: jetbackup=0;path=/;domain=.filmweb.pl   <-------RAZ
Date: Tue, 25 May 2010 08:45:32 GMT
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Set-Cookie: JSESSIONID=gptg1088uv3u;Path=/        <-------DWA
Set-Cookie: welcomeScreen=welcomeScreen;Path=/;Domain=.filmweb.pl;Expires=Tue, 25-May-10 22:13:59 GMT            <-------TRZY
Cache-Control: private, no-cache, no-store, max-age=0, must-revalidate, proxy-revalidate
Pragma: no-cache
Content-Type: text/html; charset=utf-8
Content-Language: pl-PL
Connection: close
Server: Apache

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
<head>

<title>Filmweb.pl - Ĺeb peĹen filmĂłw!</title>
........
<script type="text/javascript">
// <![CDATA[
function link(){                           <---------- CZTERY
window.location.href="http://www.filmweb.pl/index.html";      <---------- CZTERY!!!!!
}
// ]]>
</script>
...........
........onclick="link();return false;".........
..........
<script type="text/javascript">
// <![CDATA[
setTimeout("link()",25000);              <----------- PIEC
// ]]>
</script>
</div>
</div>
</body>
</html>

naturalna nastepna rzecza jest wiec:

GET /index.html HTTP/1.1
Host: www.filmweb.pl
Cookie: jetbackup=0
Cookie: JSESSIONID=1jdvbvpcmdesj
Cookie: welcomeScreen=welcomeScreen

na co serwer odpowiada, uwaga, smiejemy sie:

HTTP/1.1 404 Not Found        <--------------- TUTAJ, 404:)))
Date: Tue, 25 May 2010 08:44:47 GMT
Cache-Control: private, no-cache, no-store, max-age=0, must-revalidate, proxy-revalidate
Pragma: no-cache
Content-Type: text/html; charset=utf-8
Connection: close
Server: Apache

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
........

content not found'a juz ma jakas zawartosc merytoryczna dla uzytkownika, jest jakies mini menu..

natomiast, wszystko wskazuje, ze po odbiciu uzytkownika explicite do www.filmweb.pl/index.html -- strona raczy spodziewac sie, żeee...

GET / HTTP/1.1                       <----- TU, root, nie index.html
Host: www.filmweb.pl
Content-Type: text/html
Cookie: jetbackup=0
Cookie: JSESSIONID=1jdvbvpcmdesj
Cookie: welcomeScreen=welcomeScreen

response:

HTTP/1.1 200 OK
               Set-Cookie: jetbackup=0;path=/;domain=.filmweb.pl
Date: Tue, 25 May 2010 08:44:07 GMT
Cache-Control: private, no-cache, no-store, max-age=0, must-revalidate, proxy-revalidate
Pragma: no-cache
Content-Type: text/html; charset=utf-8
Content-Language: pl-PL
Connection: close
Server: Apache

....

i dalej leci pare stron tekstu, nie sprawdzilem, ale sadze ze to juz wlasciwa strona.

0

udało się

        private CookieCollection GetCookies()
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.filmweb.pl/John.Rambo");
            request.CookieContainer = new CookieContainer();
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream responseStream = response.GetResponseStream();
            return response.Cookies;
        }
        private void button2_Click(object sender, EventArgs e)
        {

            CookieCollection cookies = this.GetCookies();
            var request = (HttpWebRequest)WebRequest.Create("http://www.filmweb.pl/John.Rambo");
            request.CookieContainer = new CookieContainer();
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            if (cookies != null)
            {
                request.CookieContainer.Add(cookies);
            }
            Stream requestStream = request.GetRequestStream();
            var response = request.GetResponse();
            var stream = response.GetResponseStream();
            var reader = new StreamReader(stream);
            this.textBox1.Text = reader.ReadToEnd();
        }

textBox1.Text <- tu mam całą zawartość strony
Dzięki panowie za pomoc.

a jak teraz najlepiej poznajdować w tej zawartości interesujące mnie rzeczy czyli opis filmu itp??

0
savior napisał(a)

a jak teraz najlepiej poznajdować w tej zawartości interesujące mnie rzeczy czyli opis filmu itp??

Można wyciągnąć interesujące kontenery przy użyciu Regexów.

0

ok dzięki prawie sobie poradziłem
Jeszcze mam pewien kłopot powyższy kod do pobierania umieściłem pod butonem i przy wciśnięciu go drugi raz program się zawiesza i nie wiem dlaczego
Czy trzeba coś Close();

0

tak, readera, po wczytaniu wszystkiego do TextBoxa
oraz responseStream - takze w GetCookies()

Stream responseStream = response.GetResponseStream();
var cookies = response.Cookies;
responseStream.Close();
return cookies;

chociaz nie jestem pewien czy w ogole jest tu potrzeba pobierania response streama, ale sprawdz, ja w tej chwili nie moge

0

znaczy potrzebne jest
ale trzeba to Close();

0

jesli ci juz stream jest nie potrzebny dobra praktyka jest go zamknac
napisz moze jeszcze jaki exception dostajesz, bo tak, to znowu pomagamy po omacku

0
savior napisał(a)

udało się
private CookieCollection GetCookies()
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.filmweb.pl/John.Rambo");
request.CookieContainer = new CookieContainer();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
return response.Cookies;
}

> 
> <code>        private void button2_Click(object sender, EventArgs e)
        {

            CookieCollection cookies = this.GetCookies();
            var request = (HttpWebRequest)WebRequest.Create("http://www.filmweb.pl/John.Rambo");
            request.CookieContainer = new CookieContainer();
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            if (cookies != null)
            {
                request.CookieContainer.Add(cookies);
            }
            Stream requestStream = request.GetRequestStream();
            var response = request.GetResponse();
            var stream = response.GetResponseStream();
            var reader = new StreamReader(stream);
            this.textBox1.Text = reader.ReadToEnd();
        }

textBox1.Text <- tu mam całą zawartość strony
Dzięki panowie za pomoc.

a jak teraz najlepiej poznajdować w tej zawartości interesujące mnie rzeczy czyli opis filmu itp??

ja mam natomiast problem taki:

zastosowalem powyzszy kod i wszystko dzialalo ostatnio swietnie. Ale od dzisiaj znowu wyskakuje reklama i dopiero po kliknieciu w linka przenosci do wybranej strony. Problemu nie ma kiedy szukamy konkretnego filmu jak http://www.filmweb.pl/John.Rambo Ja natomiast mam link np "http://www.filmweb.pl/search/film?q=avatar" czyli chce stronke z wybranymi tytulami. Jak mowie do wczoraj to wszystko chodzilo wg zamieszczonego wyzej kodu. Dzisiaj klapa :/

moze ktos pomoc?

0

Panowie podepnę się pod temat. Chcę pobrać kod źródłowy strony i robię to tak:

       HttpWebRequest zapytanie = (HttpWebRequest)WebRequest.Create(url);
                zapytanie.Method = "GET";
                zapytanie.ContentType = "application/x-www-form-urlencoded";
                HttpWebResponse odpowiedz = (HttpWebResponse)zapytanie.GetResponse();
                StreamReader odpowiedzSTR = new StreamReader(odpowiedz.GetResponseStream());
                string str = odpowiedzSTR.ReadToEnd();

i niestety dostaje kod źródłowy bez polskich znaków. Macie jakieś pomysł na pobranie odkowanego źródła strony?

0

StreamReader za drugi parametr może przyjąć System.Text.Encoding:

Private _Kodowanie As System.Text.Encoding = System.Text.Encoding.GetEncoding("UTF-8")

Używamy takiego kodowania jakie jest na stronie.

0

Witam
Odświeżę trochę temat.
Mam kłopot z wyszukiwarką na filmweb.pl
Wydaje mi się że przez to że może być to spowodowane przez cookies
Za każdym razem otrzymuję stronę z reklamą.

        private CookieCollection GetCookies()
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.filmweb.pl/search?q=rambo");
            request.CookieContainer = new CookieContainer();
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream responseStream = response.GetResponseStream();
            return response.Cookies;
        }
        private void button2_Click(object sender, EventArgs e)
        {

            CookieCollection cookies = this.GetCookies();
            var request = (HttpWebRequest)WebRequest.Create("http://www.filmweb.pl/search?q=rambo");
            request.CookieContainer = new CookieContainer();
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            if (cookies != null)
            {
                request.CookieContainer.Add(cookies);
            }
            Stream requestStream = request.GetRequestStream();
            var response = request.GetResponse();
            var stream = response.GetResponseStream();
            var reader = new StreamReader(stream);
            this.textBox1.Text = reader.ReadToEnd();
        }

W jednym z postów na forum wyczytałem że być może jest to spowodowane tym że przy każdym WebRequest.Create otwieramy inna sesje z innymi Cookiesami i trzeba by ja jakoś przekazać
Wklejony był kawałek kodu ale nie wiem jak tego użyć:

cookies2.SetCookies(url2, cookies.GetCookieHeader(url));

Może to by pomogło.

Innym wyjściem było by też to że można kliknąć na buton przejdź dalej ale nie wiem jak to zrobić i dopiero zczytać stronę

Czekam na Waszą pomoc.
Pozdrawiam

EDIT:
dzisiaj akurat działa to powyższe :(

0

Nigdy nie ufałem automatycznej obsłudze ciasteczek - nie na każdej stronie działała poprawnie. Wolę ręcznie wyciągać ciasteczka z response.Headers.Item(HttpResponseHeader.SetCookie) i dodawać je przez request.Headers.Add(HttpRequestHeader.Cookie, "ciasteczko1; ciasteczko2").
Musisz sprawdzić czy po 1 żądaniu coś trafiło w ogóle do CookieCollection oraz jak takie samo wywołanie zachowuje się w przeglądarce. Wyśmienite proxy do debugowania - Fiddler2.

Możliwe, że reklama pojawia się co X odświeżeń strony z danego IP lub dla danej sesji (ciasteczka). Mogą mieć też jakiś mechanizm blokujący sesję z nadmierną aktywnością. Tak czy inaczej musisz programowo obsłużyć tę reklamę, a nie jej unikać.

0

dzięki @Anthony
dzięki temu programowi doszedłem o co chodzi.
a chodzi o to że jeden z kukisów tracił ważność. Utworzyłem go ręcznie i dodałem do requesta i poszło.
Pozdrawiam

0

Poobserwowałem i rzeczywiście jeśli brakuje tego ciasteczka to czasami wyświetla się reklama cały czas, dopóki to ciasteczko nie zostanie ustawione. Mało tego - reklama nie wyświetla się gdy welcomeScreenNew jest obecne, a brakuje dwóch pozostałych. Ciasteczko to jest statyczne (zawartość się nie zmienia), więc na upartego możesz utworzyć obiekt klasy Cookie, wypełnić danymi i dodać do magazynu.

Jak napisałem wcześniej - nie ufam automatycznej obsłudze ciasteczek. Powinieneś zrobić sobie ładną klasę do pobierania danych z HTTP (obsługa kompresji (gzip/deflate), "ręczna" obsługa ciasteczek, itp.) - zrobisz raz i starczy na długo. :)

Edit:
Widzę, że sam na to wpadłeś gdy ja posta pisałem. :D

1
savior 06-10-2010 14:45 napisał(a)

dzięki @Anthony
dzięki temu programowi
doszedłem o co chodzi.
a chodzi o to że jeden z kukisów tracił ważność. Utworzyłem go ręcznie i dodałem do requesta i poszło.
Pozdrawiam

Anthony 06-10-2010 16:21 napisał(a)

Widzę, że sam na to wpadłeś gdy ja posta pisałem.

Półtorej godziny piszesz sześciolinijkowy post? ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1