Python веб-очистка дает значение html, отличное от браузера после входа на страницу - PullRequest
1 голос
/ 29 января 2020

В настоящее время я делаю веб-скребинг в первый раз, пытаясь собрать и скомпилировать список завершенных Katas из моего профиля CodeWars. Вы можете просмотреть завершенные проблемы без входа в систему, но он не отображает ваши решения, если вы не вошли в эту учетную запись c.

Вот предварительный просмотр отображения страницы при входе в систему и соответствующие div я пытаюсь почистить: enter image description here

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-адрес я получаю версию страницы, не вошедшую в систему.

...