Javascript 干刮:“干刮;找不到……的路线。”;

Javascript 干刮:“干刮;找不到……的路线。”;,javascript,python,python-2.7,dryscrape,Javascript,Python,Python 2.7,Dryscrape,上下文: 我正在尝试编写自己的货币聚合器,因为市场上大多数可用的工具还没有覆盖所有的金融网站。我正在raspberrypi上使用python 2.7.9 到目前为止,由于图书馆的请求,我成功地连接到了我的两个账户(一个是crow借贷网站,另一个是我的养老金账户)。 我试图聚合的第三个网站自2周以来给我带来了困难,它的名字是 我发现该网站实际上使用的是JavaScript,经过多次研究,我最终使用了DrySrape(我不能使用selenium,因为Arm不再受支持) 问题: 运行此代码时: imp

上下文

我正在尝试编写自己的货币聚合器,因为市场上大多数可用的工具还没有覆盖所有的金融网站。我正在raspberrypi上使用python 2.7.9

到目前为止,由于图书馆的请求,我成功地连接到了我的两个账户(一个是crow借贷网站,另一个是我的养老金账户)。 我试图聚合的第三个网站自2周以来给我带来了困难,它的名字是

我发现该网站实际上使用的是JavaScript,经过多次研究,我最终使用了DrySrape(我不能使用selenium,因为Arm不再受支持)

问题

运行此代码时:

import dryscrape

url='https://www.amundi-ee.com'
extensionInit='/psf/#login'
extensionConnect='/psf/authenticate'
extensionResult='/psf/#'
urlInit = url + extensionInit
urlConnect = url + extensionConnect
urlResult = url + extensionResult

s = dryscrape.Session()
s.visit(urlInit)
print s.body()
login = s.at_xpath('//*[@id="identifiant"]')
login.set("XXXXXXXX")
pwd = s.at_xpath('//*[@name="password"]')
pwd.set("YYYYYYY")
# Push the button
login.form().submit()
s.visit(urlConnect)
print s.body()
s.visit(urlResult)
代码访问urlConnect行21时出现问题,正文打印行22返回以下信息:

{"code":405,"message":"No route found for \u0022GET \/authenticate\u0022: Method Not Allowed (Allow: POST)","errors":[]}
问题

为什么我有这样的错误信息,我如何才能正确登录到网站检索数据,我正在寻找

PS:我的代码灵感来自这个问题

好的,经过一个多月的努力,我很高兴地说,我终于得到了我想要的

问题出在哪里?

基本上有两件大事(可能更多,但我可能忘记了这两件事):

  • 密码必须通过按钮按下,这些是随机的 因此每次访问时都需要进行新映射
  • login.form()
  • 这是最后一段代码,如果您发现一个不好的用法,请不要犹豫,因为我是python新手,也是一个零星的程序员

    import dryscrape
    from bs4 import BeautifulSoup
    from lxml import html
    from time import sleep
    from webkit_server import InvalidResponseError
    from decimal import Decimal
    import re
    import sys 
    
    
    def getAmundi(seconds=0):
    
        url = 'https://www.amundi-ee.com/psf'
        extensionInit='/#login'
        urlInit = url + extensionInit
        urlResult = url + '/#'
        timeoutRetry=1
    
        if 'linux' in sys.platform:
            # start xvfb in case no X is running. Make sure xvfb 
            # is installed, otherwise this won't work!
            dryscrape.start_xvfb()
    
        print "connecting to " + url + " with " + str(seconds) + "s of loading wait..." 
        s = dryscrape.Session()
        s.visit(urlInit)
        sleep(seconds)
        s.set_attribute('auto_load_images', False)
        s.set_header('User-agent', 'Google Chrome')
        while True:
            try:
                q = s.at_xpath('//*[@id="identifiant"]')
                q.set("XXXXXXXX")
            except Exception as ex:
                seconds+=timeoutRetry
                print "Failed, retrying to get the loggin field in " + str(seconds) + "s"
                sleep(seconds)
                continue
            break 
    
        #get password button mapping
        print "loging in ..."
        soup = BeautifulSoup(s.body())
        button_number = range(10)
        for x in range(0, 10):
         button_number[int(soup.findAll('button')[x].text.strip())] = x
    
        #needed button
        button_1 = button_number[1] + 1
        button_2 = button_number[2] + 1
        button_3 = button_number[3] + 1
        button_5 = button_number[5] + 1
    
        #push buttons for password
        button = s.at_xpath('//*[@id="num-pad"]/button[' + str(button_2) +']')
        button.click()
        button = s.at_xpath('//*[@id="num-pad"]/button[' + str(button_1) +']')
        button.click()
        ..............
    
        # Push the validate button
        button = s.at_xpath('//*[@id="content"]/router-view/div/form/div[3]/input')
        button.click()
        print "accessing ..."
        sleep(seconds)
    
        while True:
            try:
                soup = BeautifulSoup(s.body())
                total_lended = soup.findAll('span')[8].text.strip()
                total_lended = total_lended = Decimal(total_lended.encode('ascii','ignore').replace(',','.').replace(' ',''))
                print total_lended
    
            except Exception as ex:
                seconds+=1
                print "Failed, retrying to get the data in " + str(seconds) + "s"
                sleep(seconds)
                continue
            break 
    
        s.reset()
    

    好吧,经过一个多月的努力,我很高兴地说,我终于得到了我想要的

    问题出在哪里?

    基本上有两件大事(可能更多,但我可能忘记了这两件事):

  • 密码必须通过按钮按下,这些是随机的 因此每次访问时都需要进行新映射
  • login.form()
  • 这是最后一段代码,如果您发现一个不好的用法,请不要犹豫,因为我是python新手,也是一个零星的程序员

    import dryscrape
    from bs4 import BeautifulSoup
    from lxml import html
    from time import sleep
    from webkit_server import InvalidResponseError
    from decimal import Decimal
    import re
    import sys 
    
    
    def getAmundi(seconds=0):
    
        url = 'https://www.amundi-ee.com/psf'
        extensionInit='/#login'
        urlInit = url + extensionInit
        urlResult = url + '/#'
        timeoutRetry=1
    
        if 'linux' in sys.platform:
            # start xvfb in case no X is running. Make sure xvfb 
            # is installed, otherwise this won't work!
            dryscrape.start_xvfb()
    
        print "connecting to " + url + " with " + str(seconds) + "s of loading wait..." 
        s = dryscrape.Session()
        s.visit(urlInit)
        sleep(seconds)
        s.set_attribute('auto_load_images', False)
        s.set_header('User-agent', 'Google Chrome')
        while True:
            try:
                q = s.at_xpath('//*[@id="identifiant"]')
                q.set("XXXXXXXX")
            except Exception as ex:
                seconds+=timeoutRetry
                print "Failed, retrying to get the loggin field in " + str(seconds) + "s"
                sleep(seconds)
                continue
            break 
    
        #get password button mapping
        print "loging in ..."
        soup = BeautifulSoup(s.body())
        button_number = range(10)
        for x in range(0, 10):
         button_number[int(soup.findAll('button')[x].text.strip())] = x
    
        #needed button
        button_1 = button_number[1] + 1
        button_2 = button_number[2] + 1
        button_3 = button_number[3] + 1
        button_5 = button_number[5] + 1
    
        #push buttons for password
        button = s.at_xpath('//*[@id="num-pad"]/button[' + str(button_2) +']')
        button.click()
        button = s.at_xpath('//*[@id="num-pad"]/button[' + str(button_1) +']')
        button.click()
        ..............
    
        # Push the validate button
        button = s.at_xpath('//*[@id="content"]/router-view/div/form/div[3]/input')
        button.click()
        print "accessing ..."
        sleep(seconds)
    
        while True:
            try:
                soup = BeautifulSoup(s.body())
                total_lended = soup.findAll('span')[8].text.strip()
                total_lended = total_lended = Decimal(total_lended.encode('ascii','ignore').replace(',','.').replace(' ',''))
                print total_lended
    
            except Exception as ex:
                seconds+=1
                print "Failed, retrying to get the data in " + str(seconds) + "s"
                sleep(seconds)
                continue
            break 
    
        s.reset()
    

    登录后使用time.sleep(5)。然后重试并告诉是否发生错误抱歉,我无法更早地测试它,不幸的是,在登录后立即休眠(login.form().submit())问题仍然发生(我也尝试加倍时间)在登录表单提交后做一件事,像这样打印当前url,s.url(),并检查url是否是您想要刮取的url。然后将其存储在一个变量中,然后存储在s.visit(url)中,因为如果您尝试访问受登录保护的页面,它将给出errorok,因此我尝试了s.url(),打印结果是:(XXXXXXXX是我前面在代码中提到的登录名)。我以前并不是真的想废弃这个url,但如果我在网络浏览器(Chrome)中复制粘贴它,并且我已经连接了,那么我会被重定向,它会得到我想要废弃的数据!如果我现在通过s.visit(url)访问此url,我不会得到我想要的数据,但会有一条法语消息说“您的web浏览器版本与blabla不兼容”,请在登录后使用time.sleep(5)。然后重试并告诉是否发生错误抱歉,我无法更早地测试它,不幸的是,在登录后立即休眠(login.form().submit())问题仍然发生(我也尝试加倍时间)在登录表单提交后做一件事,像这样打印当前url,s.url(),并检查url是否是您想要刮取的url。然后将其存储在一个变量中,然后存储在s.visit(url)中,因为如果您尝试访问受登录保护的页面,它将给出errorok,因此我尝试了s.url(),打印结果是:(XXXXXXXX是我前面在代码中提到的登录名)。我以前并不是真的想废弃这个url,但如果我在网络浏览器(Chrome)中复制粘贴它,并且我已经连接了,那么我会被重定向,它会得到我想要废弃的数据!如果我现在通过s.visit(url)访问此url,我不会得到我想要的数据,但会收到一条法语消息,上面写着“您的web浏览器版本与blabla不兼容”