通过Python的龙与地下城字符表解析器

通过Python的龙与地下城字符表解析器,python,html,web-scraping,python-requests,sid,Python,Html,Web Scraping,Python Requests,Sid,这个项目的要点很简单,但是任何人如果觉得自己有什么需要补充的,都会很感激 目的:该应用程序的目的是在Mystry Weavers()上输入一个帐户,并返回在该帐户上创建的所有地下城和龙的名称。这个 该应用程序还应该能够获取直接链接()。这在理论上是可能的,因为您可以访问链接和相关的工作表,而无需登录神话编织者 第一部分: 我需要能够让应用程序进入网站,并使用我的登录凭据输入我的帐户。当我登录站点时,以下表单数据将通过网络发送: vb_login_username: Testbug Jones v

这个项目的要点很简单,但是任何人如果觉得自己有什么需要补充的,都会很感激

目的:该应用程序的目的是在Mystry 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)
导入请求
标题={
“用户代理”:“Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如Gecko)
Chrome/85.0.4183.121 Safari/537.36'
}
登录\u数据={
“s”:“,
'securitytoken':'guest',
“vb\u登录\u用户名”:“Testbug Jones”,
“vb\u登录\u密码”:“TeStBuG”,
“重定向”:“index.php”,
'login':'login',
“vb_login_md5password”:“fea5ff2cf4764d2e76ea81e68bb458d1”,
“vb_login_md5password_utf”:“fea5ff2cf4764d2e76ea81e68bb458d1”
}
#获取页面
url='1〕https://www.myth-weavers.com/'
source=requests.get(url)
#隔离登录表单和sid
打印('\n\n***当前登录状态***')
登录\状态=source.text
登录状态=登录状态。拆分(“”[1]
登录状态=登录状态。拆分(“”[0]
打印(登录状态)
#nab sid和更新库

sid=login\u status.split(“您应该使用
requests.Session()
发出第一个请求,以获取cookies,并在发送post/login.php时将其发送回。此外,您还可以使用beautifulsoup获取登录表单中的所有输入名称/值,因此只需添加用户名/密码即可(因此,除了用户名/密码之外,您不需要硬编码任何内容)

密码是md5哈希的,因此您可以使用
hashlib

进行登录调用的步骤如下:

import requests
from bs4 import BeautifulSoup
import hashlib

url = "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","")) 
    for t in form.findAll("input")
    if t.get("name")
])

md5 = hashlib.md5(password.encode('utf-8')).hexdigest()
payload["vb_login_username"] = username
payload["vb_login_password"] = password
payload["vb_login_md5password"] = md5
payload["vb_login_md5password_utf"] = md5

r = s.post(f"{url}/login.php", 
    params= {"do": "login"},
    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:
    tds = row.find_all("td")
    download_link = f'{url}{tds[5].find("a")["href"]}'
    json = s.get(download_link)
    sheet_data.append({
        "name": tds[1].text.strip(),
        "template": tds[2].text.strip(),
        "game": tds[3].text.strip(),
        "download_link": download_link,
        "json": json.json()
    })

print(sheet_data)

谢谢!这解决了问题,但更重要的是,它为我提供了一个关于我需要阅读的后端文献的有用指针(即编码和美化组)。不过,我还有一个后续问题:你怎么知道忽略用户代理要求?到目前为止,我看过的每一个视频都强调了获取它的重要性。可能会发生一些服务器/网站检查用户代理标头是否来自有效的浏览器。在这种情况下,它不会检查任何标头。实际上,当我复制htt时p从chrome开发者控制台调用。我右键单击“复制为卷曲”,删除所有标题,查看它是否在没有任何内容的情况下工作
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:
    tds = row.find_all("td")
    download_link = f'{url}{tds[5].find("a")["href"]}'
    json = s.get(download_link)
    sheet_data.append({
        "name": tds[1].text.strip(),
        "template": tds[2].text.strip(),
        "game": tds[3].text.strip(),
        "download_link": download_link,
        "json": json.json()
    })

print(sheet_data)