Python запрашивает дополнительный вход в поле - PullRequest
0 голосов
/ 29 декабря 2018

Я новичок в Python и Python Requests.

Я пытаюсь войти на сайт, используя Python Requests, чтобы загрузить некоторые файлы, но он не работает.Когда я смотрю на данные формы, появляется дополнительное поле / переменная, называемая signInSecurity, которая передает значение, которое меняется с каждым входом в систему (токен).Я не знаю, как добавить это в мой код.

Кто-нибудь знает, что мне нужно добавить в свой код для успешного входа в систему?

import requests

with requests.session() as c:
    url = 'https://www.somewebsite.net/User/Sign-in/'
    USERNAME = 'address@example.com'
    PASSWORD = '*********'
r = c.get(url)
login_data = dict(username=USERNAME, password=PASSWORD)
cookie = {'PHPSESSID': requests.utils.dict_from_cookiejar(c.cookies) ['PHPSESSID']}
r = c.post(url, data=login_data, cookies=cookie, headers={"referer": "https://www.somewebsite.net/User/Sign-in/"})
page = c.get('https://www.somewebsite.net')

print(page.content)

Ответы [ 3 ]

0 голосов
/ 29 декабря 2018

В вашем первом запросе к веб-странице в HTML есть значение signInSecurity.Это значение, которое вы упомянули, должно быть включено.

Перейдите к url выше и просмотрите HTML (щелкните правой кнопкой мыши> Inspect).Ищите этот элемент в HTML (значение, конечно, будет другим:):

<input type="hidden" name="signInSecurity" value="3c9c0f517618937924df9711cef6d148-0555a66568a7d12ffcfe656f8718ab22">

Вам нужно включить это значение в login_data перед тем, как сделать запрос POST.

Попробуйте что-то вроде этого:

from requests_html import HTMLSession

with HTMLSession() as c:

    url = 'https://www.stock-analysis-on.net/User/Sign-in/%252F'
    USERNAME = 'address@example.com'
    PASSWORD = '*********'

    r = c.get(url)
    input_element = r.html.find('input[name=signInSecurity]', first=True)
    sign_in_security_value = input_element.attrs.get('value')

    login_data = dict(username=USERNAME, password=PASSWORD, signInSecurity=sign_in_security_value)
    r = c.post(url, data=login_data)

    page = c.get('https://www.stock-analysis-on.net')
    print(page.content)

Примечание:

  • Я пропустил cookie;запросы должны обрабатывать куки в течение сеанса.
  • Я пропустил данные реферера в заголовке, я не думаю, что вам понадобится какая-либо информация заголовка в этом случае.
  • Я использовал запросы-html вместо запросов ... обе библиотеки написаны одним и тем же автором, в него встроены возможности синтаксического анализа, упрощающие анализ HTML.

Удачи!

0 голосов
/ 29 декабря 2018

Спасибо, Лиам!Я добавил свой код, и мне кажется, что мне удается войти в систему.

Мне не удалось загрузить файлы.Можете посмотреть, правильный ли мой код?

from requests_html import HTMLSession
import requests
import os
import shutil

with HTMLSession() as c:

    url = 'https://www.stock-analysis-on.net/User/Sign-in/%252F'
    USERNAME = 'address@example.com'
    PASSWORD = '*********'

    r = c.get(url)
    input_element = r.html.find('input[name=signInSecurity]', first=True)
    sign_in_security_value = input_element.attrs.get('value')

    login_data = dict(username=USERNAME, password=PASSWORD, signInSecurity=sign_in_security_value)
    r = c.post(url, data=login_data)

    fil1 ="https://www.stock-analysis-on.net/Spreadsheet/NASDAQ/Company/Adobe-Systems-Inc/Financial-Statement/Income-Statement.xlsx"
    response = c.get(fil1)
    filing = response.content

    location = os.path.abspath("C:/Users/roderickjohn/Downloads")
    with open("Income-Statement.xlsx", 'wb') as location:
        location.write(filing)
    del filing
0 голосов
/ 29 декабря 2018

Каждый сайт отличается тем, как он обрабатывает логины пользователей.Вы всегда должны заходить в окно «Инструменты разработчика» на этом веб-сайте, чтобы просматривать каждый элемент на странице при входе в систему (извините, если это плохо сформулировано).Чтобы обойти эту проблему;мое предположение было бы найти эту переменную внутри HTML-скрипта на странице.Однако я не уверен, как бы вы поступили так.Лично кажется, что невозможно получить токен, который меняется каждый раз, когда вы формируете запрос, если только он не присутствует в HTML-скрипте.

Не уверен, что вам это нужно, но Google предлагает API Google Sheets и Google Drive API, где вы можетеиспользуйте python для доступа к документам Google (таким как JSON или электронные таблицы).Это то, что я использую при доступе к данным из базы данных.

-Ryan

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...