猿问

通过 Python 进行龙与地下城角色表解析器

这个项目的要点很简单,但如果有人觉得自己有一些东西需要补充,我们将不胜感激。

用途:该应用程序的用途是在 Myth-Weavers ( https://www.myth-weavers.com/ )上输入帐户并返回在该帐户上创建的所有龙与地下城工作表的名称。这

该应用程序还应该能够获取直接链接(https://www.myth-weavers.com/sheet.html#id=2311944)。这在理论上是可能的,因为您无需登录 Myth-Weavers 即可访问链接和相关工作表。

第一部分:我需要能够让应用程序进入网站并使用我的登录凭据进入我的帐户。当我登录该网站时,以下表单数据将在网络上发送:

vb_login_username: Testbug Jones

vb_login_password: 

s: 

securitytoken: guest

do: login

vb_login_md5password: fea5ff2cf4764d2e76ea81e68bb458d1

vb_login_md5password_utf: fea5ff2cf4764d2e76ea81e68bb458d1

我使用以下代码通过登录检查我的进度:


import requests


headers = {

    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) 

Chrome/85.0.4183.121 Safari/537.36'

  }


login_data = {

    's' : '',

    'securitytoken' : 'guest',

    'vb_login_username' : 'Testbug Jones',

    'vb_login_password' : 'TeStBuG',

    'redirect' : 'index.php',

    'login' : 'Login',

    'vb_login_md5password' : 'fea5ff2cf4764d2e76ea81e68bb458d1',

    'vb_login_md5password_utf' : 'fea5ff2cf4764d2e76ea81e68bb458d1'

}



#get page

url = 'https://www.myth-weavers.com/'

source = requests.get(url)


#isolates login form, along with an sid

print('\n\n***CURRENT LOGIN STATUS***')

login_status = source.text

login_status = login_status.split("<!-- login form -->")[1]

login_status = login_status.split("<!-- / login form -->")[0]

print(login_status)


#nab sid and update library

sid  = login_status.split('<input type="hidden" name="s" value="')[1]

sid = sid.split('" /')[0]

login_data['s'] = sid


#create session and attempt to log in

with requests.Session() as s:

  print('\n\n***ATTEMPTING TO LOGIN***')

  r = s.post(url, data = login_data, headers = headers)

  login_status = r.text

  login_status = login_status.split("<!-- login form -->")[1]

  login_status = login_status.split("<!-- / login form -->")[0]

  print(login_status)

在这一点上,我认为阻止我的是 1)语法,因为我显然是新人,2)cookie 没有被正确处理或 3)securitytoken/sid 没有被正确处理,但我已经达到了我可以看到的地步我的错误,但不是克服它们的方法。任何帮助或见解来克服这个问题都会非常有帮助!

第二部分:这将允许我访问网站上的页面,特别是“表”页面,并打印出在那里找到的所有角色表的列表。它还能够检索存储在找到的角色名称的表行中的 JSON 文件。


慕尼黑8549860
浏览 85回答 1
1回答

ABOUTYOU

您应该使用获取 cookie 发出第一个请求requests.Session(),并在发送 /login.php 时将它们发回。另外,您可以使用 beautifulsoup 获取登录表单中的所有输入名称/值,因此您只需添加您的用户名/密码(这样您就不会硬编码除用户名/密码之外的任何内容)密码经过 md5 哈希处理,因此您可以使用它hashlib进行编码以下进行登录调用:import requestsfrom bs4 import BeautifulSoupimport hashliburl = "https://www.myth-weavers.com"username = "Testbug Jones"password = "TeStBuG"s = requests.Session()r = s.get(url)soup = BeautifulSoup(r.text, "html.parser")form = soup.find("form",{"id":"login_form"})payload = dict([(t.get("name"),t.get("value",""))&nbsp;&nbsp; &nbsp; for t in form.findAll("input")&nbsp; &nbsp; if t.get("name")])md5 = hashlib.md5(password.encode('utf-8')).hexdigest()payload["vb_login_username"] = usernamepayload["vb_login_password"] = passwordpayload["vb_login_md5password"] = md5payload["vb_login_md5password_utf"] = md5r = s.post(f"{url}/login.php",&nbsp;&nbsp; &nbsp; params= {"do": "login"},&nbsp; &nbsp; data = payload)然后,您可以使用s.get(".....")如下方式获取工作表数据:r = s.get(f"{url}/sheets")soup = BeautifulSoup(r.text, "html.parser")rows = soup.find("table").find_all("tr")[1:]sheet_data = []for row in rows:&nbsp; &nbsp; tds = row.find_all("td")&nbsp; &nbsp; download_link = f'{url}{tds[5].find("a")["href"]}'&nbsp; &nbsp; json = s.get(download_link)&nbsp; &nbsp; sheet_data.append({&nbsp; &nbsp; &nbsp; &nbsp; "name": tds[1].text.strip(),&nbsp; &nbsp; &nbsp; &nbsp; "template": tds[2].text.strip(),&nbsp; &nbsp; &nbsp; &nbsp; "game": tds[3].text.strip(),&nbsp; &nbsp; &nbsp; &nbsp; "download_link": download_link,&nbsp; &nbsp; &nbsp; &nbsp; "json": json.json()&nbsp; &nbsp; })print(sheet_data)在 repl.it 上运行这个
随时随地看视频慕课网APP

相关分类

Python
我要回答