Forme nebunești. Descrierea obiectului de răspuns html răspunsuri nevalide

Să presupunem că trebuie să obținem date de pe un site web, a căror colectare manuală este imposibilă sau imposibilă din cauza volumului său. În acest caz, putem automatiza procesul folosind instrumentele descrise mai jos.

solicită bibliotecă

Biblioteca Python pentru a face cereri către server și pentru a procesa răspunsurile. Fundamentul scriptului de analiză și arma noastră principală. Folosind această bibliotecă, primim conținutul paginii sub formă de html pentru o analiză ulterioară.

cereri de import răspuns = solicitări . get ("https://ya.ru") # get-request print (răspuns . text ) # output page contents payload = ( "key1" : "value1" , "key2" : "value2" ) response = requests . get ("http://httpbin.org/get" , params = payload ) # cerere cu parametri headers = ( "user-agent" : "my-app/0.0.1") răspuns = solicitări . get (url, headers = headers) # cerere cu antete html specifice

API

Interfață de programare a aplicației - interfață de programare a aplicației oferită de proprietarul aplicației web pentru alți dezvoltatori. Lipsa unui API care să ne poată satisface nevoile este primul lucru de care ar trebui să ne asigurăm înainte de a ne grăbi să analizăm codul sursă al paginii și să scriem un parser pentru acesta. Multe site-uri populare au propria lor API și documentație care explică cum să le folosească. Putem folosi API-ul în acest fel - formăm o cerere http conform documentației și primim un răspuns folosind cereri.

BS4

Beautifulsoup4 este o bibliotecă pentru analizarea documentelor html și xml. Vă permite să accesați direct conținutul oricăror etichete în html.

din bs4 import BeautifulSoup soup = BeautifulSoup (raw_html, "html.parser" ) print (soup . find ( "p" , class_ = "some-class") . text ) # scoateți conținutul etichetei "p" cu clasa „oarecare clasă”

Driver web Selenium

Datele de pe site pot fi generate dinamic folosind javascript. În acest caz, nu va fi posibilă analizarea acestor date folosind requests+bs4. Cert este că bs4 analizează codul sursă al paginii fără a executa js. Pentru a executa codul js și a obține o pagină identică cu cea pe care o vedem în browser, puteți utiliza driverul web selenium - acesta este un set de drivere pentru diferite browsere, furnizate cu biblioteci pentru a lucra cu aceste drivere.

Ce să faci dacă există autorizație?

session = requests.Session() data = ("login_username":"login", "login_password":"parolă") url = "http://site.com/login.php" răspuns = session.post(url, date =date)

Ce se întâmplă dacă un site vă interzice pentru prea multe solicitări?
  • Setați o întârziere între solicitări:

răspuns = requests.get(url, timeout=(10, 0.01)) # timeout conexiune, timeout citire (în secunde)

  • Pretindeți-vă că sunteți un browser care utilizează driverul web selenium sau care transmite conținutul antetului user-agent atunci când faceți o solicitare:

user_agent = ("Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:50.0) " "Gecko/20100101 Firefox/50.0") cerere = requests.get(url, headers=("User-Agent":user_agent))

  • Utilizarea proxy:

După primirea și interpretarea unui mesaj de solicitare, un server răspunde cu un mesaj de răspuns HTTP:

  • O linie de stare
  • Zero sau mai multe câmpuri de antet (General|Răspuns|Entitate) urmate de CRLF
  • O linie goală (adică, o linie fără nimic care să precede CRLF) care indică sfârșitul câmpurilor de antet
  • Opțional un mesaj-corp
  • Următoarele secțiuni explică fiecare entități utilizate într-un mesaj de răspuns HTTP.

    Linia de stare a mesajului

    O linie de stare constă din versiunea protocolului urmată de un cod de stare numeric și fraza textuală asociată. Elementele sunt separate prin caractere SP spațiale.

Status-Line = Versiune HTTP SP Cod de stare SP Motiv-Expresie CRLF Versiune HTTP

Un server care acceptă HTTP versiunea 1.1 va returna următoarele informații despre versiune:

Versiune HTTP = HTTP/1.1

Cod de stare

Elementul Status-Code este un număr întreg de 3 cifre în care prima cifră a Status-Code definește clasa de răspuns, iar ultimele două cifre nu au nici un rol de categorizare. Există 5 valori pentru prima cifră:

S.N. Cod și descriere
1 1xx: Informațional

Înseamnă că cererea a fost primită și procesul continuă.

2 2xx: Succes

Înseamnă că acțiunea a fost primită, înțeleasă și acceptată cu succes.

3 3xx: Redirecționare

Înseamnă că trebuie luate măsuri suplimentare pentru a finaliza cererea.

4 4xx: Eroare client

Înseamnă că cererea conține sintaxă incorectă sau nu poate fi îndeplinită.

5 5xx: Eroare server

Înseamnă că serverul nu a reușit să îndeplinească o solicitare aparent validă.

Codurile de stare HTTP sunt extensibile, iar aplicațiile HTTP nu sunt necesare pentru a înțelege semnificația tuturor codurilor de stare înregistrate. O listă cu toate codurile de stare a fost dată într-un capitol separat pentru referință.

Câmpuri antet răspuns

Vom studia General-header și Entity-header într-un capitol separat când vom afla câmpurile de antet HTTP. Deocamdată, să verificăm care sunt câmpurile antetului răspunsului.

Câmpurile pentru antetul răspunsului permit serverului să transmită informații suplimentare despre răspuns care nu pot fi plasate în linia de stare. Aceste câmpuri de antet oferă informații despre server și despre accesul suplimentar la resursa identificată de Request-URI.

  • Proxy-Autentificare

  • WWW-Autentificare

Puteți introduce câmpurile dvs. personalizate în cazul în care aveți de gând să scrieți propriul Web Client și Server personalizat.

Exemple de mesaje de răspuns

Acum haideți să punem totul împreună pentru a forma un răspuns HTTP pentru o solicitare de a prelua pagina hello.htm de pe serverul web care rulează pe site

HTTP/1.1 200 OK Data: Luni, 27 iulie 2009 12:28:53 GMT Server: Apache/2.2.14 (Win32) Ultima modificare: miercuri, 22 iulie 2009 19:15:56 GMT Lungimea conținutului: 88 conținut- Tip: text/html Conexiune: închisă Bună ziua, lume!

Următorul exemplu arată un mesaj de răspuns HTTP care afișează o condiție de eroare când serverul web nu a putut găsi pagina solicitată:

HTTP/1.1 404 Nu a fost găsit Data: Duminica, 18 Oct 2012 10:36:20 GMT Server: Apache/2.2.14 (Win32) Lungimea conținutului: 230 Conexiune: Tip conținut închis: text/html; charset=iso-8859-1 404 Nu a fost găsit Nu a fost găsit

Adresa URL solicitată /t.html nu a fost găsită pe acest server.

Următorul este un exemplu de mesaj de răspuns HTTP care arată starea de eroare atunci când serverul web a întâlnit o versiune HTTP greșită în cererea HTTP dată:

HTTP/1.1 400 Data cererii greșite: Duminica, 18 octombrie 2012 10:36:20 GMT Server: Apache/2.2.14 (Win32) Lungimea conținutului: 230 Tipul conținutului: text/html; charset=iso-8859-1 Conexiune: închisă 400 Solicitare greșită Solicitare greșită

Browserul dvs. a trimis o solicitare pe care acest server nu a putut-o înțelege.

Linia de solicitare conținea caractere nevalide după șirul de protocol.

Obiectul descris este un instrument foarte util și puternic. Acest obiect are mai multe metode, descrierea lor este dată mai jos:

Colecții: Metode: Proprietăți: Răspuns.Colectare cookie-uri

Colecția de cookie-uri stabilește valori pentru cookie-uri. Dacă cookie-urile specificate nu există, le creează. Dacă cookie-ul există, acesta capătă o nouă valoare și o distruge pe cea veche.

Răspuns.Cookies(cookie) [(cheie) | . atribute ] = valoare

Opțiuni:

  • cookie - Nume cookie
  • cheie - Parametru opțional. Dacă este specificat, atunci cookie-ul este un director (imbricat) și cheia este un set de valori.
  • atribute - Informații specificate despre cookie-urile în sine. Acest parametru poate fi unul dintre următoarele:
  • valoare - Specifică valoarea care trebuie alocată acestei chei sau atribut.
NumeDescriere
DomeniuDoar înregistrare. Dacă este specificat, cookie-urile sunt trimise numai la cererea din acest domeniu.
ExpirăDoar înregistrare. Data la care expiră cookie-ul. Această dată trebuie setată pentru ca cookie-urile să fie scrise pe hard disk-ul clientului după încheierea sesiunii. Dacă acest atribut nu este setat, se presupune că data de expirare a cookie-ului este data curentă. Cookie-urile vor expira imediat după încheierea sesiunii.
HasKeyDoar lectură. Indică dacă cookie-ul conține cheia dată.
caleDoar înregistrare. Dacă este specificat, cookie-urile sunt trimise numai la cerere din această cale. Dacă parametrul nu este setat, se utilizează calea către aplicație.
SigurDoar înregistrare. Indică dacă cookie-urile vor fi protejate sau nu.

Cometariu:

Dacă cookie-ul cheie este creat așa cum se arată în următorul script,

atunci va fi trimis următorul antet:

Set-Cookie:MYCOOKIE=TYPE1=zahăr&TYPE2=cookie-uri

Dacă atribuiți o valoare mycookie fără a utiliza chei, atunci această acțiune va distruge cheile de tip1 și tip2. De exemplu:

În exemplul anterior, cheile tip1 și tip2 vor fi distruse, iar valorile lor se vor pierde. Mycookie va conține acum valoarea marshmallow de ciocolată.

De asemenea, puteți verifica existența unei chei specifice în felul următor:

Dacă este afișat TRUE, atunci o astfel de cheie există; dacă FALSE, nu există.

Răspuns.Metoda de scriere

Răspuns.Scrieți variabilă_sau_valoare

Opțiuni:

  • variable_or_value - Date care vor fi afișate pe ecranul browserului prin HTML. Acest parametru poate fi de orice tip acceptat de VisualBasic Scripting Edition. Adică datele pot fi de următoarele tipuri: dată, șir, caracter, valori numerice. Valoarea acestui parametru nu poate conține combinația %>. În schimb, puteți utiliza combinația echivalentă %\>. Serverul web va converti această secvență în cea necesară când scriptul este executat.

Următorul exemplu arată cum funcționează metoda Response.write pentru a scoate un mesaj către client.

Îți spun doar: Și numele tău

Următorul exemplu adaugă o etichetă HTML la o pagină web. Deoarece această metodă nu poate conține combinația %>, folosim secvența %\>. Deci un exemplu de script:

Ieșirea va fi linia:

Răspuns.Metoda de redirecționare

Response.Redirect URL (URL - Uniform Resource Locator)

Opțiuni:

  • URL - Parametrul este un descriptor de resurse universal. Afișează când browserul trebuie redirecționat.

Cometariu:

Orice apariție a acestei metode între etichete și pagina web va fi ignorată. Această metodă poate fi folosită numai în capul unei pagini HTML. Această metodă va transmite un antet browserului dacă parametrul URL al acestui obiect lipsește în următoarea formă:

HTTP/1.0 302 Adresa URL a locației obiectului mutat

Răspuns.Metoda finală

Răspuns.Sfârşit

Cometariu:

Dacă proprietatea Response.Buffer a fost setată la TRUE, atunci apelarea metodei Response.End va șterge tamponul, împingând datele din acesta către client. Dacă nu doriți să trimiteți date utilizatorului, ar trebui să apelați următoarea metodă:

Metoda Response.AddHeader

Metoda AddHeader adaugă un antet HTML cu valori specifice. Această metodă adaugă întotdeauna un nou antet răspunsului la browserul clientului. Această metodă nu înlocuiește antetul existent cu unul nou. Antetul adăugat nu poate fi eliminat.

Această metodă este utilizată numai pentru sarcini „avansate”.

Response.AddHeader nume_variabilă, valoare

Opțiuni:

  • variable_name - Numele noilor parametri de antet HTML.
  • value - Setați valoarea care va fi reținută în antet.
Note:

Pentru ca metoda să funcționeze corect, variabila_name nu trebuie să conțină caracterul de subliniere (_). Setul ServerVariables interpretează caracterul de subliniere ca o liniuță în antet. De exemplu, următorul script forțează serverul să găsească un parametru din antetul HTML numit MY-HEADER.

Deoarece protocolul HTTP necesită ca toți parametrii antetului să fie trecuți înaintea corpului paginii HTML, trebuie să apelați metoda AddHeader în scriptul dumneavoastră înainte de a începe descrierea... Există o excepție. Dacă proprietatea Buffer este setată la true, atunci puteți scrie AddHeader oriunde în script, dar înainte de primul apel la metoda Flush. În caz contrar, apelarea metodei AddHeader va genera o eroare.

Următoarele două fișiere .ASP demonstrează acest ultim punct.

textul dvs. de pe pagină

În acest exemplu, pagina nu este tamponată. Scriptul funcționează, totuși, AddHeader este apelat înainte ca serverul să producă ieșire HTML către client.

iata cateva informatii de pe pagina ta...

În cel de-al doilea exemplu, pagina este în buffer și, ca rezultat, serverul nu trimite text către client până când scriptul în sine se termină sau este întâlnită metoda Flush. Puteți folosi această metodă pentru a trimite mai multe copii ale unui parametru de antet cu valori diferite, ca și antetul WWW-Authenticate.

Metoda Response.AppendToLog

Metoda AppendToLog adaugă o linie la sfârșitul fișierului de raport (fișier jurnal) al serverului web. Puteți apela această metodă de câte ori aveți nevoie. De fiecare dată când apelați metoda, șirul pe care îl specificați va fi scris în fișierul de raport al serverului.

Valoarea Response.AppendToLog

Opțiuni:

  • valoare - Text care va fi adăugat la fișierul de raport al serverului web. Acest șir nu poate conține caracterul virgulă (,). Mai mult, lungimea totală a rândului adăugat nu trebuie să depășească 80 de caractere.
Note:

Pentru a utiliza această caracteristică, trebuie să aveți opțiunea de interogare URI activată în panoul „Proprietăți avansate de înregistrare” pentru acest server web în IIS.

Metoda Response.BinaryWrite

Metoda BinaryWrite vă permite să scrieți informații specificate în ieșirea HTTP curentă fără nicio conversie de caractere. Această metodă este utilă pentru ieșirea de informații care nu sunt șir, cum ar fi datele binare cerute de o aplicație.

Răspuns. Date BinaryWrite

Opțiuni:

  • date - Date destinate ieșirii HTTP.

Dacă aveți un obiect care produce o matrice de octeți, puteți utiliza următorul apel la această metodă pentru a transmite acea matrice unei aplicații care rulează pe computerul client.

Răspuns.Metoda clară

Metoda Clear șterge toate ieșirile HTML stocate în tampon. Cu toate acestea, această metodă nu șterge informațiile tampon asociate cu antetul. Puteți utiliza această metodă pentru a gestiona erorile. Cu toate acestea, executarea acestei metode va avea ca rezultat o eroare dacă proprietatea Response.Buffer nu este adevărată.

Proprietatea Response.CacheControl

Această proprietate înlocuiește valoarea implicită. Când setați proprietatea la Public, serverul proxy poate stoca în cache ieșirea generată de ASP.

Response.CacheControl [= antet pentru controlul cache]

Opțiuni:

  • Antet de control cache - Această opțiune de control antet poate fi publică sau privată.
Proprietatea Response.CharSet

Proprietatea CharSet vă permite să adăugați numele tabelului de coduri de caractere (de exemplu, WINDOWS-1251) la antetul HTML, linia tip conținut.

Response.CharSet nume_tabel_cod

Opțiuni:

  • charset_name - Un șir care specifică setul de caractere pentru această pagină HTML. Numele acestui tabel de coduri va fi adăugat la antetul fișierului HTML sub parametrul „content-type”.

Pentru o pagină ASP care nu utilizează proprietatea Response.Charset, parametrul „content-type” din antet va fi după cum urmează:

Tip de conținut:text/html

Dacă fișierul ASP conține comanda

apoi în antet câmpul tip conținut va arăta ca

Tip de conținut:text/html; set de caractere=Windows-1251

Cometariu:

Această funcție inserează orice linie în antet și nu verifică valabilitatea acesteia.

Dacă o pagină conține mai multe etichete Response.Charset, atunci fiecare etichetă ulterioară va înlocui valoarea cu propria sa.

Proprietatea Response.ContentType

Proprietatea ContentType vă permite să specificați tipul (tipul) conținutului fișierului HTML. Dacă această proprietate nu este utilizată, atunci text/html este luat în mod implicit.

Response.ContentType [=content_type]

Opțiuni:

  • content_type - Un șir care descrie tipul de conținut HTML. Acest șir ia de obicei forma „tip/subtip”, unde tipul este categoria principală a conținutului, iar subtipul indică tipul de conținut. Pentru o listă completă a tipurilor acceptate, consultați documentația browserului dvs. sau specificația HHTP.

Următorul exemplu ilustrează setarea tipului de conținut la Channel Definition Format (Push Channels).

Al doilea exemplu demonstrează setarea unei proprietăți la cele mai cunoscute valori.

Răspuns. Proprietatea expiră

Proprietatea Expires specifică perioada de timp până când pagina HTML memorată în cache de browser este considerată ca nu a expirat (perioada de stocare). Dacă un utilizator solicită din browser o pagină stocată în cache care nu a expirat, browserul o returnează direct din memoria cache.

Răspuns.Expiră [=număr]

Opțiuni:

  • număr - Timpul în minute înainte ca pagina să fie considerată „întârziată”. Setarea acestei valori la 0 face ca pagina dată să devină „expirată” imediat.

Cometariu:

Dacă această proprietate este setată de mai multe ori pe o pagină, se folosește cea mai mică valoare.

Response.ExpiresAbsolute proprietate

Proprietatea ExpiresAbsolute specifică ora și data după care pagina HTML stocată în cache de browser este considerată expirată (perioada de păstrare a expirat). Dacă un utilizator solicită din browser o pagină stocată în cache care nu a expirat, browserul o returnează direct din memoria cache. Dacă este specificată ora (și este specificată data), atunci „data de expirare” a acestei pagini expiră la miezul nopții acelei zile. Dacă nu este specificată nici ora, nici data, atunci valoarea este atribuită în funcție de ziua și ora la care a fost rulat scriptul.

Response.ExpiresAbsolute [= [data] [ora]]

Opțiuni:

  • data - Indică data de expirare a „perioadei de valabilitate”. Formatul datei trebuie să respecte standardul RFC-1123.
  • time - Indică ora la care expiră pagina. Această valoare este convertită în format GMT (Greenwich Mean Time) înainte ca antetul să fie trimis clientului.

Cometariu:

Dacă o anumită proprietate este definită de mai multe ori pe o pagină, atunci timpul de expirare a „perioadei de stocare” este considerată ca fiind cea mai devreme dintre toate valorile specificate.

Proprietatea Response.IsClientConnected

Această proprietate este doar pentru citire, ceea ce înseamnă că nu pot fi atribuite valori acestei proprietăți. Această proprietate indică dacă clientul este conectat sau nu mai este conectat la serverul definit în ultimul mesaj Response.Write.

Response.IsClientConnected()

Cometariu:

Această proprietate vă permite să determinați când un utilizator este conectat și când este deconectat de la server. De exemplu, durata perioadei de timp dintre momentul în care serverul a răspuns și momentul în care clientul a făcut cererea oferă încredere că clientul este încă conectat și are sens să continue executarea scriptului.