2014-01-17 2 views
3

Я пытаюсь войти на сайт и получить данные от него. Кажется, я не могу механизировать работу на следующем сайте. Я привел HTML ниже. Может кто-нибудь, пожалуйста, дайте мне краткую помощь, как я могу войти в систему и распечатать следующую страницу?Python Mechanize - Войти

Я пробовал использовать механизацию и петлю через br.forms(). Я вижу форму в этом, но у меня возникают проблемы с вводом имени пользователя и пароля, а затем нажатием submit.

<div class="loginform" id="loginpage" style="width: 300px;"> 
<div class="loginformentries" style="overflow: hidden;"> 
<div class="clearfix"> 
<div class="loginformtitle">Sign-in to your account</div> 
</div> 
<div class="clearfix"> 
<div class="loginformlabel"><label for="USERID">Username:</label></div> 
<div class="loginforminput"><input name="USERID" id="USERID" style="width: 150px;" type="text" value=""></div> 
</div> 
<div class="clearfix"> 
<div class="loginformlabel"><label for="PASSWDTXT">Password:</label></div> 
<div class="loginforminput"><input name="PASSWDTXT" id="PASSWDTXT" style="width: 150px;" type="password" value=""></div> 
</div> 
<div class="clearfix"> 
<div class="loginformlabel"><label for="usertype">Select Role:</label></div> 
<div class="loginforminput"><select name="usertype" id="usertype" style="width: 150px;"><option value="participant">Participant</option> 
<option value="sponsor">Sponsor</option></select></div> 
</div> 
<div class="loginformsubmit" style="text-align: right;"><span class="button"><button class="buttoninsidebuttonclass" type="submit">Login</button></span></div> 
</div> 
<div class="loginformdescription">Both entries are case sensitive. If you fail to login <strong>five</strong> consecutive times your account could be disabled.</div> 
</div> 
</div> 
</div> 

Я пытаюсь что-то вроде этого ...

import mechanize 

br = mechanize.Browser() 

br.open("test") 

br.select_form(name="loginform") 
br["USERID"] = 'xxxxx' 
br["PASSWDTXT"] = 'xxxxx' 
br.submit() 
print br.title() 

Но я не знаю, как проверить, что я нахожусь на следующей странице

ответ

12

Все эти div s должны быть обернутой в элементе form. Найдите это и найдите тег name. Это форма, с которой вы хотите войти в систему. Затем вы можете использовать фрагмент ниже, чтобы получить файлы cookie, которые вы будете использовать для дальнейшего просмотра.

import cookielib 
import urllib2 
import mechanize 

# Browser 
br = mechanize.Browser() 

# Enable cookie support for urllib2 
cookiejar = cookielib.LWPCookieJar() 
br.set_cookiejar(cookiejar) 

# Broser options 
br.set_handle_equiv(True) 
br.set_handle_gzip(True) 
br.set_handle_redirect(True) 
br.set_handle_referer(True) 
br.set_handle_robots(False) 

# ?? 
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time = 1) 

br.addheaders = [ ('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1') ] 

# authenticate 
br.open(the/page/you/want/to/login) 
br.select_form(name="the name of the form from above") 
# these two come from the code you posted 
# where you would normally put in your username and password 
br[ "USERID" ] = yourLogin 
br[ "PASSWDTXT" ] = yourPassword 
res = br.submit() 

print "Success!\n" 

После этого, ваши логин куки будут сохранены в cookiejar. Затем вы можете использовать один и тот же br объект, чтобы получить любую страницу, которую вы любите, как такой

url = br.open(page/needed/after/login) 
returnPage = url.read() 

Это даст вам источник HTML страницы, которые вы можете разобрать любой способ, который вы хотите.

+0

Это, кажется, отлично работает, не могли бы вы указать мне лучший способ получить уступ от следующей страницы. Если бы я просто хотел получить всю информацию об этом? –

+1

@ Dumbkid_trying См. Редактирование. Кроме того, я слышал о том, что beautifulsoup легче анализировать элементы HTML, но я никогда не использовал его, не уверен, можно ли его комбинировать с mechanize – CDspace

+0

Иногда одна форма на странице может не иметь имени. В этом случае 'br.form = list (br.forms()) [0]' будет делать вместо 'br.select_form (name =" имя формы сверху ")' –

Смежные вопросы