Как имитировать HTTP-запрос после использования модуля Python Requests? - программирование

Как имитировать HTTP-запрос после использования модуля Python Requests?

Это - модуль, который я пытаюсь использовать, и есть форма, которую я пытаюсь заполнить автоматически. Причина, по которой я хотел бы использовать Requests over Mechanize, заключается в том, что с Mechanize я должен сначала загрузить страницу входа в систему, прежде чем я смогу ее заполнить и отправить, тогда как с помощью запросов я могу пропустить этап загрузки и перейти прямо к сообщению POSTing (с надеждой). В основном, я пытаюсь заставить процесс входа в систему потреблять как можно меньше полосы пропускания.

Мой второй вопрос: после процесса входа в систему и перенаправления можно ли полностью загрузить всю страницу, но только получить название страницы? В принципе, только заголовок скажет мне, удалось ли войти в систему или нет, поэтому я хочу свести к минимуму использование полосы пропускания.

Я вроде как noob, когда дело доходит до HTTP-запросов и еще чего-то, поэтому любая помощь будет оценена. FYI, это для школьного проекта.

edit. На первую часть вопроса был дан ответ. Мой вопрос сейчас для второй части

4b9b3361

Ответ 1

Пример кода:

import requests

URL = 'https://www.yourlibrary.ca/account/index.cfm'
payload = {
    'barcode': 'your user name/login',
    'telephone_primary': 'your password',
    'persistent': '1'  # remember me
}

session = requests.session()
r = requests.post(URL, data=payload)
print r.cookies

Первым шагом является просмотр исходной страницы и идентификация элемента form, который отправляется (используйте инструменты Firebug/Chrome/IE независимо (или просто глядя на источник)). Затем найдите элементы input и определите требуемые атрибуты name (см. Выше).

В указанном вами URL-адресе есть "Remember Me", который, хотя я еще не пробовал (потому что не могу), подразумевает, что он выдает cookie в течение некоторого периода времени, чтобы избежать дальнейших логинов - это cookie хранится в request.session.

Затем просто используйте session.get(someurl, ...) для извлечения страниц и т.д.

Ответ 2

Чтобы использовать аутентификацию в запросах get или post, вы просто указываете аргумент auth. Вот так:

response = requests.get(url, auth = ('username', 'password')) Подробнее см. В запросах Документация по проверке подлинности.

Используя инструменты разработчика Chrome, вы можете проверить элементы своей страницы html, содержащей форму, которую вы хотите заполнить и отправить. Для объяснения того, как это делается, перейдите here. Вы можете найти данные, необходимые для заполнения аргумента данных запроса сообщения. Если вас не беспокоит проверка сертификата безопасности сайта, к которому вы обращаетесь, вы также можете указать это в списке аргументов get.

Если ваша страница html содержит эти элементы для публикации вашей веб-формы:

<textarea id="text" class="wikitext" name="text" cols="80" rows="20">
This is where your edited text will go
</textarea>
<input type="submit" id="save" name="save" value="Submit changes">

Затем код python для отправки в эту форму выглядит следующим образом:

import requests
from bs4 import BeautifulSoup

url = "http://www.someurl.com"

username = "your_username"
password = "your_password"

response = requests.get(url, auth=(username, password), verify=False)

# Getting the text of the page from the response data       
page = BeautifulSoup(response.text)

# Finding the text contained in a specific element, for instance, the 
# textarea element that contains the area where you would write a forum post
txt = page.find('textarea', id="text").string

# Finding the value of a specific attribute with name = "version" and 
# extracting the contents of the value attribute
tag = page.find('input', attrs = {'name':'version'})
ver = tag['value']

# Changing the text to whatever you want
txt = "Your text here, this will be what is written to the textarea for the post"

# construct the POST request
form_data = {
    'save' : 'Submit changes'
    'text' : txt
} 

post = requests.post(url,auth=(username, password),data=form_data,verify=False)