2013-05-10 174 views
1

我試圖用BeautifulSoup刮一個網站。相關網站要求我登錄。請查看我的代碼。刮一個需要登錄的網站

from bs4 import BeautifulSoup as bs 
import requests 
import sys 

user = 'user' 
password = 'pass' 

# Url to login page 
url = 'main url' 

# Starts a session 
session = requests.session(config={'verbose': sys.stderr}) 

login_data = { 
'loginuser': user, 
'loginpswd': password, 
'submit': 'login', 
} 

r = session.post(url, data=login_data) 

# Accessing a page to scrape 
r = session.get('specific url') 
soup = bs(r.content) 

我想出了這個代碼已經在這裏看到了一些線後,在SO所以我想它應該是有效的,但打印的內容仍然彷彿我是註銷。

當我運行此代碼,這是印刷:當然

2013-05-10T22:49:45.882000 POST >the main url to login< 
2013-05-10T22:49:46.676000 GET >error page of the main url page as if the logging in failed< 
2013-05-10T22:49:46.761000 GET >the specific url< 

中,登錄信息是正確的。 需要一些幫助的人。

@EDIT

我將如何實現頭成以上?

opener = urllib2.build_opener() 
opener.addheaders = [('User-agent', 'Mozilla/5.0')] 

回答

3

首先您不應該使用任何版本的低於1.2.0的請求。如果你發現錯誤(你可能會),我們根本不會支持它們。

其次,你很可能在尋找的是:

import requests 
from requests.packages.urllib3 import add_stderr_logger 

add_stderr_logger() 
s = requests.Session() 

s.headers['User-Agent'] = 'Mozilla/5.0' 

# after examining the HTML of the website you're trying to log into 
# set name_form to the name of the form element that contains the name and 
# set password_form to the name of the form element that will contain the password 
login = {name_form: username, password_form: password} 
login_response = s.post(url, data=login) 
for r in login_response.history: 
    if r.status_code == 401: # 401 means authentication failed 
     sys.exit(1) # abort 

pdf_response = s.get(pdf_url) # Your cookies and headers are automatically included 

我評論的代碼,以幫助您。您也可以嘗試@ FastTurtle建議使用HTTP基本身份驗證,但如果您想要首先發布到表單,則可以繼續按照上述方式進行操作。還要確保loginuserloginpswd是正確的表單元素名稱。如果它們不是,那麼這可能是潛在的問題.b

1

requests模塊有幾種類型的身份驗證的支持。運氣好的話,您嘗試解析的網站使用HTTP基本身份驗證,在這種情況下,發送憑證非常容易。

本示例取自the requests website。您可以通過請求here和標頭here瞭解更多身份驗證信息。

s = requests.Session() 
s.auth = ('user', 'pass') 
s.headers.update({'x-test': 'true'}) 

# both 'x-test' and 'x-test2' are sent 
s.get('http://httpbin.org/headers', headers={'x-test2': 'true'})