使用请求和带有登录的漂亮的汤来增长Web数据



我试图登录到server.growwatt.com提取我的太阳能和电池数据,因为我想自动上传到pvoutput.org。登陆后我只需要获取几个数据点。我尝试使用html解析器后使用beautiful soup find函数搜索"Solar"这个词。看代码。它在运行时返回None。我打印了整个html输出,但没有找到Solar。如果我检查网站上的html,太阳能是列出的。我添加了asyncio。睡觉可以让你有时间登录网站。我相信登录是工作作为返回的文件很大,但嵌入的数据不存在。你知道我哪里做错了吗?

import requests
import asyncio
from bs4 import BeautifulSoup as bs
from config import username, password, lang
URL = 'https://server.growatt.com/index'
LOGIN = 'https://server.growatt.com/login'
s = requests.session()
login_payload = {
'account': username,
'password': password,
'lang' : lang
}
login_req = s.post(LOGIN, data=login_payload)
print(login_req.status_code)
async def main():
await asyncio.sleep(5)
asyncio.run(main())
soup = bs(s.get(URL).text, 'html.parser')
find = soup.find('Solar')
print(soup)
print(find)

我注意到你正试图使你的代码异步,而它根本不是。

首先,你必须使用请求异步方法。

其次,登录过程需要两个POST请求两个不同的urls

下面,我使用了一个高级Async库trio。

另一方面,我使用了支持异步请求的httpx。

下面是它的简单代码:
import trio
import httpx

async def main():
headers = {
"Accept-Language": "en-US,en;q=0.5"
}
async with httpx.AsyncClient(timeout=None, headers=headers) as client:
data1 = {
"userName": "testusername",
"password": "testpass",
}
r1 = await client.post('https://oss.growatt.com/login', data=data1)
print(r1.json())
data2 = {
"account": "testusername",
"password": "testpass",
"validateCode": ""
}
r2 = await client.post('https://server.growatt.com/login', data=data2)
print(r2.json())

if __name__ == "__main__":
trio.run(main)

输出:

{'result': 0, 'msg': 'Wrong user name or password'}
{'result': -2, 'msg': 'Username Password Error'}

最新更新