使用python的请求模块登录带有单选按钮的网站

时间:2015-02-20 07:44:46

标签: python python-2.7 post python-requests basic-authentication

我正在尝试登录网站并在其中检索一些日期。我尝试了以下代码:

from requests import session  

payload = {  
    r"Login1$UserName": "myusername",  
    r"Login1$Password": "thepassword",  
    r"Login1$RadioButtonList_Type": "Tuna"  
}  

with session() as s:
    s.post("http://elogbook.ofdc.org.tw/", data=payload)
    req = s.get("http://elogbook.ofdc.org.tw/Member/CatchReportTuna.aspx")
    print(req.text)

但结果显示我没有登录该网站。我想知道为什么上面的代码失败了,以及如何登录the website 我是新来解析网站上的数据,所以任何意见都是真诚地欢迎,提前感谢。

P.S。名称r"Login1$RadioButtonList_Type"是指该网站上单选按钮的名称,我想将其值设置为Tuna

1 个答案:

答案 0 :(得分:2)

关键问题是隐藏的ASP.NET表单字段也应该是有效负载的一部分。这意味着您首先需要向页面发出GET请求并解析隐藏的input字段值。此外,您需要提供User-Agent标头。使用BeautifulSoup进行html解析部分:

# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
from requests import session

payload = {  
    r"Login1$UserName": "myusername",  
    r"Login1$Password": "thepassword",  
    r"Login1$RadioButtonList_Type": "Tuna",
    r"Login1$LoginButton": u"登入"
}  
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36'}

with session() as s:
    s.headers = headers
    response = s.get('http://elogbook.ofdc.org.tw/')

    soup = BeautifulSoup(response.content)

    for input_name in ['__EVENTTARGET', '__EVENTARGUMENT', '__VIEWSTATE', '__VIEWSTATEGENERATOR', '__EVENTVALIDATION']:
        payload[input_name] = soup.find('input', {'name': input_name}).get('value', '')

    s.post("http://elogbook.ofdc.org.tw/", data=payload)

    req = s.get("http://elogbook.ofdc.org.tw/Member/CatchReportTuna.aspx")
    print(req.content)

仅供参考,您可以使用以下工具提交表单,而不必明确担心隐藏的表单字段:


另一种选择是通过selenium自动化真实浏览器来模仿真实的你:

from selenium import webdriver

login = "mylogin"
password = "mypassword"

driver = webdriver.Firefox()
driver.get('http://elogbook.ofdc.org.tw/')

# fill the form
driver.find_element_by_id('Login1_UserName').send_keys(login)
driver.find_element_by_id('Login1_Password').send_keys(password)
driver.find_element_by_id('Login1_RadioButtonList_Type_0').click()

# submit
driver.find_element_by_id('Login1_LoginButton').click()

driver.get('http://elogbook.ofdc.org.tw/Member/CatchReportTuna.aspx')
print driver.page_source