2013-05-10 139 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'})