Подтвердить что ты не робот

Войти на сайт, используя urllib2 - Python 2.7

Хорошо, поэтому я использую это для reddit-бота, но я хочу узнать, КАК войти на любой сайт. Если это имеет смысл...

Я понимаю, что разные веб-сайты используют разные формы входа и т.д. Итак, как мне понять, как оптимизировать его для каждого веб-сайта? Я предполагаю, что мне нужно искать что-то в html файле, но не знаю, что.

Я НЕ хочу использовать Mechanize или любую другую библиотеку (вот что все остальные ответы здесь, и на самом деле не помогают мне узнать, что происходит), поскольку я хочу сам узнать, как именно это все работает.

Документация urllib2 действительно не помогает мне.

Спасибо.

4b9b3361

Ответ 1

Я предварю это, сказав, что я не занимался таким входом в течение некоторого времени, поэтому я мог бы пропустить некоторые из более "приемлемых" способов сделать это.

Я не уверен, что это то, что вам нужно, но без библиотеки типа mechanize или более надежной структуры, такой как selenium, в базовом случае вы просто смотрите на форму и inputs. Например, глядя на www.reddit.com, а затем просматривая исходную страницу рендеринга, вы найдете эту форму:

<form method="post" action="https://ssl.reddit.com/post/login" id="login_login-main"
  class="login-form login-form-side">
    <input type="hidden" name="op" value="login-main" />
    <input name="user" placeholder="username" type="text" maxlength="20" tabindex="1" />
    <input name="passwd" placeholder="password" type="password" tabindex="1" />

    <div class="status"></div>

    <div id="remember-me">
      <input type="checkbox" name="rem" id="rem-login-main" tabindex="1" />
      <label for="rem-login-main">remember me</label>
      <a class="recover-password" href="/password">reset password</a>
    </div>

    <div class="submit">
      <button class="btn" type="submit" tabindex="1">login</button>
    </div>

    <div class="clear"></div>
</form>

Здесь мы видим несколько input - op, user, passwd и rem. Также обратите внимание на параметр action - это URL-адрес, на который будет отправляться форма, и поэтому станет нашей целью. Итак, теперь последний шаг заключается в том, чтобы упаковать параметры в полезную нагрузку и отправить его как запрос POST на URL action. Также ниже мы создаем новый opener, добавляем возможность обрабатывать файлы cookie и добавлять заголовки также, предоставляя нам немного более надежный открыватель для выполнения запросов):

import cookielib
import urllib
import urllib2


# Store the cookies and create an opener that will hold them
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))

# Add our headers
opener.addheaders = [('User-agent', 'RedditTesting')]

# Install our opener (note that this changes the global opener to the one
# we just made, but you can also just call opener.open() if you want)
urllib2.install_opener(opener)

# The action/ target from the form
authentication_url = 'https://ssl.reddit.com/post/login'

# Input parameters we are going to send
payload = {
  'op': 'login-main',
  'user': '<username>',
  'passwd': '<password>'
  }

# Use urllib to encode the payload
data = urllib.urlencode(payload)

# Build our Request object (supplying 'data' makes it a POST)
req = urllib2.Request(authentication_url, data)

# Make the request and read the response
resp = urllib2.urlopen(req)
contents = resp.read()

Обратите внимание, что это может усложниться - вы также можете сделать это с помощью GMail, но вам нужно выставлять параметры, которые будут меняться каждый раз (например, параметр GALX). Опять же, не уверен, что это то, что вы хотели, но надеюсь, что это поможет.