Войти на сайт используя urllib2 - Python 2.7
Итак, я использую это для Reddit бота, но я хочу быть в состоянии выяснить, КАК войти на любой сайт. Если это имеет смысл....
Я понимаю, что разные веб-сайты используют разные формы входа и т. Д. Так как мне выяснить, как оптимизировать его для каждого веб-сайта? Я предполагаю, что мне нужно что-то искать в файле HTML, но понятия не имею, что.
Я НЕ хочу использовать Mechanize или какую-либо другую библиотеку (именно об этом все остальные ответы здесь и на самом деле не помогают мне узнать, что происходит), так как я хочу узнать, как именно все это работает.
Документация urllib2 действительно не помогает мне.
Благодарю.
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
запрос к action
URL. Также ниже мы создаем новый opener
добавьте возможность обрабатывать куки и добавлять заголовки, что дает нам немного более надежный инструмент для выполнения запросов):
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
параметр). Опять же, не уверен, что это то, что вы хотели, но надеюсь, что это поможет.