[python] Wyszukiwanie konkretnego linka na stronie i przechodzenie na niego

Potrzebujesz pomocy z C, C++, perl, python, itp.
Awatar użytkownika
LordRuthwen
Moderator
Posty: 2324
Rejestracja: 18 września 2009, 21:45
Lokalizacja: klikash?

[python] Wyszukiwanie konkretnego linka na stronie i przechodzenie na niego

Post autor: LordRuthwen »

Bry.
Piszę sobie taki automacik, który zaloguje mi się na stronkę, wyszuka w treści linka (link codziennie jest inny, znajduje się za to w tej samej klasie), no i mam problem.
Tak wygląda samo logowanie:

Kod: Zaznacz cały

#!/usr/bin/env python
import urllib2
import cookielib
url = 'https://www.TU_JEST_LINK#'
login = {'login':'Log In',
        'email':'[email protected]',
        'password':'SUPER_TAJNE_HASLO',
        'op':'Login',
        'login':'Log In'}
add_to_chart = {
        }
cookie = cookielib.CookieJar() ## accept cookie
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
opener.addheaders = [('User-agent','Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 5.1)')]
data = urllib.urlencode(login)
try:
    opener.open(url,data,10)
    print 'logged in - success!'
except:
    print 'time out!', url
I teoretycznie działa, na stronie jest link w postaci:

Kod: Zaznacz cały

<div class="float-left get-stuff">
   <a href="/free-get/10235/35237" class="last-stuff-get">
      <div class="stuff-get-token-inner">
         <div class="stuff-get-token-logo"></div>
         <div class="stuff-get-token-separator"></div>
         <input type="submit" class="form-submit" value="Get our last stuff" />
      </div>
   </a>
</div>
Z tego co widzę, to wystarczy mając ciasteczko przejść na link, tylko nie bardzo wiem jak się do tego zabrać, żeby go stamtąd wydobyć.
mariaczi
Member
Posty: 1343
Rejestracja: 08 lutego 2008, 12:58
Lokalizacja: localhost@śląskie

Post autor: mariaczi »

Nie do końca jestem pewien czy o to Ci chodzi - musisz sparsować HTMLa, np.;
http://stackoverflow.com/questions/1551 ... -in-python
http://stackoverflow.com/questions/9694 ... ific-links
Awatar użytkownika
LordRuthwen
Moderator
Posty: 2324
Rejestracja: 18 września 2009, 21:45
Lokalizacja: klikash?

Post autor: LordRuthwen »

Mniej więcej, tylko ja tu używam obiektu opener, nie jestem pewny czy można go wykorzystać do request.
No i ciasteczko musi być :)
Bo inaczej link ma inną wartość.
mariaczi
Member
Posty: 1343
Rejestracja: 08 lutego 2008, 12:58
Lokalizacja: localhost@śląskie

Post autor: mariaczi »

Jeśli się nie mylę, to:
1. Obsługę cookie odpaliłeś i podpiąłeś pod obiekt opener
2. Zalogowałeś się i potrzeba Ci pobrać zawartość strony (albo nawet ją już masz): page_content = opener.read()
3. Mając page_content wyjmiesz link i raz jeszcze tym samym obiektem opener otworzysz tego linka czyli razem z zainicjowanym cookie

Możliwe, że już to widziałeś, a może Ci jeszcze coś podpowie: http://stackoverflow.com/a/8206372
I z dokumentacji (co mi podsunęło punkty powyżej)
https://docs.python.org/2/howto/urllib2.html
https://docs.python.org/2/library/urllib2.html#examples

[edycja]
W ostatniej odpowiedzi na stackoverflow (link z tego posta) jest link do tematu na forum, jak pchnąć cookie ;) Podaje: http://forum.xbmc.org/showthread.php?t=15717
klavierkrk
Beginner
Posty: 257
Rejestracja: 14 maja 2013, 17:18

Post autor: klavierkrk »

moze warto pobrac strone przez http request, np. GET a pozniej sparsowac regexpem
Ostatnio zmieniony 30 listopada 2019, 21:01 przez klavierkrk, łącznie zmieniany 1 raz.
Awatar użytkownika
LordRuthwen
Moderator
Posty: 2324
Rejestracja: 18 września 2009, 21:45
Lokalizacja: klikash?

Post autor: LordRuthwen »

Dziękuję mariaczi, masz rację, już mam tylko o tym nie wiem:P

Kod: Zaznacz cały

cookie = cookielib.CookieJar() ## accept cookie
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
opener.addheaders = [('User-agent','Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 5.1)')]
data = urllib.urlencode(login)
try:
    strona = opener.open(url,data,10).read()
    print 'logged in - success!'
except:
    print 'time out!', url
claim = claim + re.search("(/[a-z -]*/\d+/\d+)", strona).group(1)
try:
    opener.open(claim,10)
    print 'Success!'
except:
    print 'time out!', claim
I to mi bardzo ładnie parsuje stronę, wyciąga link i na niego przechodzi, wychodzi jednak na to, że albo nie trzyma ciasteczka, albo mam skopane logowanie, muszę jeszcze sprawdzić.
mariaczi
Member
Posty: 1343
Rejestracja: 08 lutego 2008, 12:58
Lokalizacja: localhost@śląskie

Post autor: mariaczi »

Przed otwarciem wyciągniętego linka dodaj zawartość z obiektu cookie do nagłówka:

Kod: Zaznacz cały

opener.addheaders('Cookie', cookie)
i... Chyba tego brakuje :)
ODPOWIEDZ