Python urllib2 автоматическое заполнение форм и получение результатов - PullRequest
9 голосов
/ 14 апреля 2011

Я ищу возможность запрашивать информацию о гарантии на компьютере, на котором будет работать этот скрипт. Он должен иметь возможность заполнить форму, если необходимо (как, например, в случае, например, с сайта службы HP), и затем сможет получить полученную веб-страницу.

У меня уже есть биты для анализа полученного html, о котором сообщается. У меня просто проблемы с тем, что нужно сделать, чтобы сделать POST-данные, которые нужно поместить в поля, а затем возможность получить получившуюся страницу.

Ответы [ 3 ]

16 голосов
/ 14 апреля 2011

Если вам абсолютно нужно для использования urllib2, основная суть такова:

import urllib
import urllib2
url = 'http://whatever.foo/form.html'
form_data = {'field1': 'value1', 'field2': 'value2'}
params = urllib.urlencode(form_data)
response = urllib2.urlopen(url, params)
data = response.read()

Если вы отправляете данные POST (2-й аргумент urlopen()), метод запроса автоматически устанавливается на POST.

Я предлагаю вам сделать одолжение и использовать механизировать , полноценную замену urllib2, которая действует точно так же, как настоящий браузер. Многие сайты используют скрытые поля, файлы cookie и перенаправления, ни один из которых по умолчанию не обрабатывает urllib2, как это делает Mechanize.

Посмотрите Хороший пример - эмуляция браузера в Python с помощью механизма .

1 голос
/ 14 апреля 2011

Использование urllib и urllib2 вместе,

data = urllib.urlencode([('field1',val1), ('field2',val2)]) # list of two-element tuples
content = urllib2.urlopen('post-url', data)

содержание даст вам источник страницы.

0 голосов
/ 14 апреля 2011

Я только немного сделал, но:

  1. Вы получили HTML-код страницы формы. Извлеките атрибут name для каждого поля формы, которое необходимо заполнить.
  2. Создайте словарь, сопоставляющий имена каждого поля формы со значениями, которые вы хотите отправить.
  3. Используйте urllib.urlencode, чтобы превратить словарь в тело вашего почтового запроса.
  4. Включить эти закодированные данные в качестве второго аргумента urllib2.Request() после URL-адреса, на который должна быть отправлена ​​форма.

Сервер либо вернет получившуюся веб-страницу, либо вернет перенаправление на результирующую веб-страницу. Если это не так, вам нужно отправить запрос GET на URL, указанный в ответе на перенаправление.

Надеюсь, это имеет какой-то смысл?

...