2017-06-05 115 views
1

我正在尝试登录到我的Morningstar.com溢价账户使用请求模块在python如下。邮政命令运行状态200,但实际上并没有登录我。Morningstar.com登录使用Python请求

)当我下载资产负债表时,我只收到5年(非高级)版本而不是所要求的10年(高级版)版本。这表明我的登录脚本失败,因为5年的数据是可用的,而不登录。在浏览器手动登录时的资产负债表URL正常工作的权利。

有谁知道如何正确设置登录脚本

它似乎很直接,但我已经尝试了整个一天使用不同形式的有效载荷/标题等,并找不到正确的方式......另外,我很困惑,因为我无法找到表单数据信息当检查登录页面时。

import csv 
import requests 

urlLogin = 'http://members.morningstar.com/memberservice/login.aspx' 
urlBalanceSheet = 'http://financials.morningstar.com/ajax/ReportProcess4CSV.html?&t=XNYS:F&region=usa&culture=en-US&cur=&reportType=bs&period=12&dataType=A&order=desc&columnYear=10&rounding=1&view=raw&r=149906&denominatorView=raw&number=1' 

payload = { 
    "uEmail": "<userEmail>", 
    "uPassword": "<userPW>", 
    "remember_me": "on", 
    "login": "Sign In" 
} 

with requests.Session() as s: 
    p = s.post(urlLogin, data = payload) 
    print(p.status_code) 

    download = s.get(urlBalanceSheet) 
+0

它可能会将请求标记为bot并拒绝。尝试['mechanize'](https://github.com/python-mechanize/mechanize),这是(大部分)与浏览器无法区分的。 – Artyer

+1

看起来像morningstart的前端是用角度写的,当你发送请求时你将不会得到任何东西。你需要使用无头浏览器。 – oshaiken

+0

@Artyer'mechanize'解决方案会是什么样子? –

回答

0

有几件事情可以做,以自动从晨星下载

PIP安装硒 http://selenium-python.readthedocs.io/installation.html

安装Firefox,找出你的个人资料是这里是一个资源http://toolsqa.com/selenium-webdriver/custom-firefox-profile/

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.common.keys import Keys 
import time 
import requests 
from xml.etree import cElementTree as ET 
import csv 
from selenium.webdriver.common.action_chains import ActionChains 


def timeme(method): 
    def wrapper(*args, **kw): 
     startTime = int(round(time.time() * 1000)) 
     result = method(*args, **kw) 
     endTime = int(round(time.time() * 1000)) 

     print(endTime - startTime, 'ms') 
     return result 

    return wrapper 

class Driver(): 
    def __init__(self,profile, diver_path, url): 
     self.profile = profile 
     self.driver_path = diver_path 
     self.url = url 

    def start_driver(self): 
     user_profile = webdriver.FirefoxProfile(self.profile) 
     user_profile.set_preference("browser.helperApps.neverAsk.saveToDisk", 'text/csv') 

     driver = webdriver.Firefox(executable_path=self.driver_path, firefox_profile=user_profile) 
     driver.get(self.url) 

     return driver 

    def shutdown(self,driver): 

     driver.quit() 


@timeme 
def login(driver, email = '', password = ''): 

    wait_time = 1 

    try: 

     email_input = WebDriverWait(driver,wait_time).until(
     EC.presence_of_all_elements_located((By.XPATH,'//*[@id="uim-uEmail-input"]'))) 


     email_input = driver.find_element_by_xpath('//*[@id="uim-uEmail-input"]').send_keys(email) 

     time.sleep(5) # wait time to see if you have input remove later 
     pwd_input = driver.find_element_by_xpath('//*[@id="uim-uPassword-input"]').send_keys(password) 
     time.sleep(5) 
     sign_in = driver.find_element_by_xpath('//*[@id="uim-login-submit"]').click() 



     title = driver.title 
     driver.execute_script("window.open('http://financials.morningstar.com/ajax/ReportProcess4CSV.html?&t=XNYS:F&region=usa&culture=en-US&cur=&reportType=bs&period=12&dataType=A&order=desc&columnYear=10&rounding=1&view=raw&r=149906&denominatorView=raw&number=1','new_window');") 
     time.sleep(1) 

     return 0 
    except Exception as e: 

     return None 

@timeme 
def main(): 
    # i am using on my mac, if you are using windows change paths accordingly 
    Mozilla = Driver(profile = '/Users/yourname/Library/Application Support/Firefox/Profiles/xxxxxxxxxxxx.default', 
      diver_path='/usr/local/bin/geckodriver', # path to firefox driver 
      url='https://www.morningstar.com/members/login.html?vurl=') 

    driver = Mozilla.start_driver() 
    download = login(driver, password='', email='') 
    if download ==0: 
     time.sleep(10) # let browser to download csv 

     Mozilla.shutdown(driver) # shutdown 

main() 
+0

非常感谢你,这真棒! :-) – usdn

+0

当我运行这段代码时,它只是启动浏览器,最终我得到错误消息:'selenium.common.exceptions.WebDriverException:消息:连接被拒绝'任何想法如何解决这个问题? –

+0

@usdn你有没有得到它的工作?上面的例子对我不起作用。 –