Как сделать сайт защищенным паролем - PullRequest
0 голосов
/ 13 марта 2020

У меня есть веб-сайт, с которого мне нужно очистить некоторые данные (веб-сайт https://www.merriam-webster.com/, и я хочу очистить сохраненные слова).

Этот веб-сайт защищен паролем, и я также думаю, что происходят некоторые вещи javascript, которые я не понимаю (я думаю, что некоторые элементы загружаются браузером, поскольку они не отображаются, когда я вижу html).

В настоящее время у меня есть решение с использованием селена, оно работает, но для его открытия требуется firefox, и мне бы очень хотелось, чтобы решение позволяло запускать его как фоновую консольную программу.

Как мне это сделать, если возможно, используя библиотеку запросов pythons и наименьшее количество дополнительных сторонних библиотек?

Вот код моего решения для селена:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
import time
import json

# Create new driver
browser = webdriver.Firefox()
browser.get('https://www.merriam-webster.com/login')

# Find fields for email and password
username = browser.find_element_by_id("ul-email")
password = browser.find_element_by_id('ul-password')
# Find button to login
send = browser.find_element_by_id('ul-login')
# Send username and password 
username.send_keys("username")
password.send_keys("password")

# Wait for accept cookies button to appear and click it
WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.CLASS_NAME, "accept-cookies-button"))).click()
# Click the login button
send.click()

# Find button to go to saved words
WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.CLASS_NAME, "ul-favorites"))).click()


words = {}
# Now logged in
# Loop over pages of saved words
for i in range(2):
    print("Now on page " + str(i+1))
    # Find next page button
    nextpage = browser.find_element_by_class_name("ul-page-next")
    # Wait for the next page button to be clickable
    WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.CLASS_NAME, "ul-page-next")))

    # Find all the words on the page
    for word in browser.find_elements_by_class_name('item-headword'):
        # Add the href to the dictonary
        words[word.get_attribute("innerHTML")] = word.get_attribute("href")
    # Naivgate to the next page
    nextpage.click()

browser.close()

# Print the words list
with open("output.json", "w", encoding="utf-8") as file:
    file.write(json.dumps(words, indent=4))

1 Ответ

1 голос
/ 13 марта 2020

Если вы хотите использовать модуль requests, вам нужно использовать сеанс.

Чтобы инициализировать сеанс, вы выполните:

session_requests = requests.session()

Затем вам понадобится полезная нагрузка с именем пользователя и пароль

payload = {
    "username":<USERNAME>,
    "password":<PASSWORD>}

Затем для входа в систему вы делаете:

result = session_requests.post(
    login_url, 
    data = payload, 
    headers = dict(referer=login_url)
)

Теперь ваш сеанс должен быть авторизован, так что go для любой другой страницы защиты паролем вы используете тот же сеанс:

result = session_requests.get(
    url, 
    headers = dict(referer = url)
)

Затем вы можете использовать result.content для просмотра содержимого этой страницы.

РЕДАКТИРОВАТЬ, если на вашем сайте есть токен CSRF, вам нужно будет включить его в полезную нагрузку ». Чтобы получить токен CSRF, замените раздел «полезные данные» на:

from lxml import html

tree = html.fromstring(result.text)
#you may need to manually inspect the tree to find how your CSRF token is specified.
authenticity_token = list(set(tree.xpath("//input[@name='csrfmiddlewaretoken']/@value")))[0]

payload = {
    "username":<USERNAME>,
    "password":<PASSWORD>,
    "csrfmiddlewaretoken":authenticity_token
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...