Che Posted May 1, 2017 Report Posted May 1, 2017 Salut ! Vreau sa iau niste date de pe un server folosing pycurl. Serverul este protejat si pana sa ajunga la pagina initiala, originala, te tot redirectioneaza catre diverse alte pagini/servere intermediare (pe care nu le vezi decat cu http headers) care te verifica sa vada daca esti om, daca ai doua picioare, de unde esti, unde te duci etc. etc. etc. plus daca folosesti un browser real si nu un script. Am trecut pana acum de toate etapele mai putin ultima etapa: Ma trimite la un server pe care in browserul adevarat daca il accesezi direct (fara sa treci prin tot lantul de verificari) nu se vede nimic ci pur si simplu isi da singur refresh la nesfarsit. In schimb, acest browser, cu tot cu refreshul lui, iti seteaza niste cookie-uri bune, necesare pentru a avea acces la pagina initiala. Problema este ca in browser merge si iti da cookie-urile alea care iti trebuie, tu dai stop refresh si mergi mai departe cu cookie-urile bune. Dar cum fac asta in python si cu pycurl ca doar daca vreau sa il accesez mi se blocheaza scriptul si imi da eroare cum ca pycurl(22, "Unexpected internal server erro 500.") ? Cum ar trebui procedat ? Eu ma gandeam sa dau cumva stop refresh, apoi iau cookie-urile si pa, ma duc si accesez url-ul dorit, dar cum fac asta sau cum fac sa evit eroarea asta si sa iau direct cookieurile ? Multumesc mult ! @vatman32 @gear @MrGrj Va rog, daca stiti si scuze de quote. Quote
Active Members vatman32 Posted May 2, 2017 Active Members Report Posted May 2, 2017 In prima faza ai putea sa analizezi ce headere & cookie-uri se schimba concret de la refresh la refresh. Acel 500 poate fi un redirect intentionat deoarece a detectat un script sau o eroare deoarece serverul nu si-a luat doza de cookies / headers dorita. Eu pariez pe prima varianta, de obicei trucul e sa iti ia pozitia cursorului sau marimea ferestrei ori chiar paseaza date despre un fisier temporar ce in mod normal ar fi accesibil de un browser. Incearca sa faci o simulare cu Selenium si vezi daca duce tot in 500. Daca da, e fara dar si poate o masura de securitate insa ar trebui sa ii poti face bypass daca reusesti sa iti formezi un log cu informatii precise despre ce se schimba intre refresh-uri. Totodata tine cont de timpii in care treci de la un link la altul, adauga un delay la fiecare redirect (un 0.3 - 0.4 ar fi de ajuns); ar putea fi un factor dupa care sa fii identificat tinand cont ca un script e de obicei cu mult mai rapid decat un browser obisnuit. Am lucrat candva la un generator de backlinks doar ca in PHP si dadeam cam de aceleasi probleme. Nu stiu daca te ajuta dar ca informatie extra ai putea sa te uiti si peste ASTA pentru teste mai ample. 1 Quote
Active Members MrGrj Posted May 2, 2017 Active Members Report Posted May 2, 2017 (edited) Exista vreun motiv pentru care folosesti `pycurl` ? Te sfatuiesc sa folosesti `requests`. Un exemplu mai jos: import requests URL = 'http://fellon_suge_curu.always' HEADERS = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/39.0.2171.95 Safari/537.36' } # ai nevoie de User-Agent (schimba cu ce vrei tu) s = requests.session() # se creeaza o sesiune care iti pastreaza cookies chiar daca faci mai multe requesturi response = s.get(URL, headers=HEADERS, allow_redirects=False) # daca nu mai vrei redirecturi print(response.content) Mai departe, cel mai probabil, va trebui sa salvezi ceva parametru de la cookie in headers. Daca pui un link aici ar putea sa te ajute mai multa lume. Edited May 2, 2017 by MrGrj 4 Quote
Che Posted May 2, 2017 Author Report Posted May 2, 2017 @vatman32 Cu Selenium si cu Phantom nici nu se pune problema. Serverul te directioneaza si te redirectioneaza de la o pagina la alta si de la un server la altul si fiecare te verifica iar Phantom si Selenium au nu stiu ce parametri ce nu pot fi schimbati (stiu ca am incercat eu ceva acum ceva mai mult timp in urma) iar serverul iti trimite requesturi in javascript si are special pentri requesturile respective sa vada daca esti Phantom sau Selenium. Plus de asta Phantom nu mai stiu cum se misca si nu imi mai amintesc bine ce am reusit eu sa fac cu el dar cu seleniumstiu ca daca reusesti sa treci totusi de toate verificarile, se misca greu al dracului, mai bine faci totul manual decat sa apelezi la Selenium. Plus de asta, dupa o vreme se blocheaza, nu e bun deloc. Pycurl zboara, e racheta pe langa astea de mai sus. @MrGrj Nu am folosit request niciodata, m-am invatat cu curl din php, plus de asta si parametrii sunt la fel si la pycurl, si mi se pare mult mai configurabil si mai complex din ce am vazut eu asa, cu coada ochiului, la requests. Adica mi se parce ca pycurl vs requests e ceva de genul C++ vs VB.NET, adica pare el mai greoi pycurl dar poti sa il configurezi mai in detaliu. Parerea mea, sper sa am dreptate. Te rog sa ma contrazici daca nu e asa. Apropo, de ce ma sfatuiesti sa folosesc requests si nu pycurl ? -------------------------------------------------------------------------- @vatman32 Eroarea 500 se pare ca nu apare numai la scriptul in python ci si direct in browser daca dau pur si simplu copy/paste la link, din prima. @MrGrj Nu pot decat sa dau copy paste la linkul cu eroarea insa problema este ca el e penultimul link al unui lant de linkuri care iti apar atunci cand serverul detecteaza mai multe requesturi din partea ta -> iti trimite un captcha iar daca l-ai completat bine -> te trimite la url-ul asta de care zic. Problema e ca am incercat sa mai accesez linkurile cu captcha dar nu imi mai apare nimic acuma si deci practic nu mai pot face rost de linkul cu captcha ca sa vad cum imi seteaza cookie & stuff. Quote
Active Members MrGrj Posted May 2, 2017 Active Members Report Posted May 2, 2017 Tie nu iti trebuie "mai in detaliu" ci pur si simplu trebuie sa automatizezi ceva din real-life, in cod. Intr-adevar, pycurl, asa cum sugereaza si numele, te lasa sa folosesti anumite functii ale cURL. Asta nu inseamna ca e mai bun decat `requests`. La fel cum asta nu inseamna ca `requests` e mai bun decat `pycurl`. Nu ma pricep atat de bine la request-uri (insa de cate ori am avut nevoie de ceva, mi-a fost de ajuns si nu mi-a trebuit mai mult), am luat si eu ceva meditatii de la @badluck atat cat am avut nevoie. Exista cateva situatii sa se intample ce ai zis in ultimele randuri, iar prima care imi vine in minte: - ti-au banat IP-ul din cauza requesturilor prea multe E foarte greu sa primesti sfaturi in aria asta, mai ales ca nu stiu ce se intampla acolo sau de ce. E mult brainstorming cand vine vorba de sesiuni, cookies & stuff. PS: Analogia aia facuta de tine, C++ vs VB.net nu e deloc okay. 2 Quote
gigiRoman Posted May 2, 2017 Report Posted May 2, 2017 Eu am mai folosit libraria mechanize. Poate te ajuta: http://stackoverflow.com/questions/15459217/how-to-set-cookie-in-python-mechanize 1 Quote
Che Posted May 2, 2017 Author Report Posted May 2, 2017 2 hours ago, gigiRoman said: Eu am mai folosit libraria mechanize. Poate te ajuta: http://stackoverflow.com/questions/15459217/how-to-set-cookie-in-python-mechanize Multumesc ! Oricum, am rezolvat pana la urma, am facut un try si catch pe eroare iar cand prinde eroarea se duce mai departe la url-ul initial dar de data asta cu cookieurile bune. Quote
Active Members dancezar Posted May 3, 2017 Active Members Report Posted May 3, 2017 7 hours ago, MrGrj said: Tie nu iti trebuie "mai in detaliu" ci pur si simplu trebuie sa automatizezi ceva din real-life, in cod. Intr-adevar, pycurl, asa cum sugereaza si numele, te lasa sa folosesti anumite functii ale cURL. Asta nu inseamna ca e mai bun decat `requests`. La fel cum asta nu inseamna ca `requests` e mai bun decat `pycurl`. Nu ma pricep atat de bine la request-uri (insa de cate ori am avut nevoie de ceva, mi-a fost de ajuns si nu mi-a trebuit mai mult), am luat si eu ceva meditatii de la @badluck atat cat am avut nevoie. Exista cateva situatii sa se intample ce ai zis in ultimele randuri, iar prima care imi vine in minte: - ti-au banat IP-ul din cauza requesturilor prea multe E foarte greu sa primesti sfaturi in aria asta, mai ales ca nu stiu ce se intampla acolo sau de ce. E mult brainstorming cand vine vorba de sesiuni, cookies & stuff. PS: Analogia aia facuta de tine, C++ vs VB.net nu e deloc okay. Pycurl este mult mai rapid decat requests. In requests ai avantajul ca este aproape one-liner si poti sa scrii foarte rapid un prototip sau un program functional, dar daca vine vorba de performanta requests pierde. In plus exista https://github.com/Lispython/human_curl , care foloseste pycurl dupa modelul requests. 1 Quote
Che Posted May 3, 2017 Author Report Posted May 3, 2017 @dancezar Singurul dezavantaj e ca daca vrei sa iti portezi scriptul de pe python pe php va trebui sa "traduci" in php si toata libraria human curl, de asta, cred eu si e strict parerea mea, ca e mai bine sa faci de la bun inceput direct doar in pycurl care este cat se poate de similar cu curl, practic identic. Plus de asta va trebui sa inveti si sa lucrezi in human curl daca nu cunosti libraria asta, nu zic ca e greu ci doar ca e ceva suplimentar. Quote