dryscrape:“未找到路线......”
问题描述:
我想,因为大多数可用的工具在市场上并没有涵盖所有金融网站尚未编写自己的钱汇集。我在raspberrypi上使用python 2.7.9。
感谢请求库,我设法连接到目前为止我的帐户中的两个帐户(一个贷款网站和一个用于我的养老金)。 我想汇总的第三个网站给我很难从现在2周起,它的名字是https://www.amundi-ee.com。
我发现这个网站实际上是在使用JavaScript,经过很多研究,我最终使用了dryscrape(我不能使用硒因为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:我的代码的灵感来源于此问题 Python dryscrape scrape page with cookies
答
确定,所以试图解决这个下跌一个多月之后,我很高兴地说,我终于设法得到我想要的
问题是什么?
基本上2点重要的事情(也许更多,但我可能会之间忘记了):
- 密码必须通过按钮来推,而这些都是随机生成的 所以每次你访问你需要做的时间新的映射
-
login.form().submit()
是围绕获取所需的数据页搞乱,通过点击验证按钮是足够好的
下面是最后的代码,不hesitat e,如果你发现一个不好的用法,因为我是一个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)。然后再试一次,并告诉是否发生错误 – Exprator
对不起,我不能在早些时候测试它,不幸的是,登录后登录后(login.form()。submit())问题仍然存在(我也尝试将时间加倍) –
做在登录表单提交之后的一件事情,打印当前网址,如s.url(),并检查网址是否是你想要抓取的网址。然后将其存储在一个变量然后s.visit(url),因为如果你尝试访问一个被登录保护的页面,它会给出错误 – Exprator