我正在尝试登录网站并在其中检索一些日期。我尝试了以下代码:
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
。
答案 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