В настоящее время я делаю веб-скребинг в первый раз, пытаясь собрать и скомпилировать список завершенных Katas из моего профиля CodeWars. Вы можете просмотреть завершенные проблемы без входа в систему, но он не отображает ваши решения, если вы не вошли в эту учетную запись c.
Вот предварительный просмотр отображения страницы при входе в систему и соответствующие div я пытаюсь почистить:
URL для этой страницы - https://www.codewars.com/users/User_Name/completed_solutions
с User_Name
, замененным действительным именем пользователя . Страница входа в систему: https://www.codewars.com/users/sign_in
Я попытался получить элементы div с классом «решения списка элементов» двумя способами, которые я сейчас напишу:
#attempt 1
import requests
from bs4 import BeautifulSoup
login_url = "https://www.codewars.com/users/sign_in"
end_url = "https://www.codewars.com/users/Ash-Ozen/completed_solutions"
with requests.session() as sesh:
result = sesh.get(login_url)
soup = BeautifulSoup(result.content, "html.parser")
token = soup.find("input", {"name": "authenticity_token"})["value"]
payload = {
"user[email]": "ph@gmail.com",
"user[password]": "phpass>",
"authenticity_token": str(token),
}
result = sesh.post(login_url, data=payload) #this logs me in?
page = sesh.get(end_url) #This navigates me to the target page?
soup = BeautifulSoup(page.content, "html.parser")
print(soup.prettify()) # some debugging
# Examining the print statement shows that the "list-item solutions" is not
# there. Checking page.url shows the correct url(https://www.codewars.com/users/Ash-Ozen/completed_solutions).
solutions = soup.findAll("div", class_="list-item solutions")
# solutions yields an empty list.
и
#attempt 2
from robobrowser import RoboBrowser
from bs4 import BeautifulSoup
browser = RoboBrowser(history=True)
browser.open("https://www.codewars.com/users/sign_in")
form = browser.get_form()
form["user[email]"].value = "phmail@gmail.com"
form["user[password]"].value = "phpass"
browser.submit_form(form) #think robobrowser handles the crfs token for me?
browser.open("https://www.codewars.com/users/Ash-Ozen/completed_solutions")
r = browser.parsed()
soup = BeautifulSoup(str(r[0]), "html.parser")
solutions = soup.find_all("div", class_="list-item solutions")
print(solutions) # returns empty list
Понятия не имею, как / что отлаживать отсюда, чтобы заставить его работать.
Редактировать: Мои первые мысли о том, что идет не так, заключаются в том, что после выполнения любой публикации я получить перенаправление на панель управления (поведение после успешного входа в систему), но, похоже, при попытке получить окончательный URL-адрес я получаю версию страницы, не вошедшую в систему.