Статьи

Как отправить веб-форму в Python

Сегодня мы потратим некоторое время на изучение трех разных способов заставить Python отправить веб-форму. В этом случае мы будем выполнять поиск в Интернете с помощью поиска duckduckgo.com по термину «python» и сохранять результаты в виде файла HTML. Мы будем использовать включенные в Python модули urllib и два сторонних пакета: запросы и механизация . У нас есть три небольших сценария, так что давайте приступим к взлому!

Отправка веб-формы с помощью urllib

 

Мы начнем с urllib и urllib2, так как они включены в стандартную библиотеку Python. Мы также импортируем веб- браузер, чтобы открыть результаты поиска для просмотра. Вот код:

import urllib
import urllib2
import webbrowser

url = "http://duckduckgo.com/html"
data = urllib.urlencode({'q': 'Python'})
results = urllib2.urlopen(url, data)
with open("results.html", "w") as f:
    f.write(results.read())

webbrowser.open("results.html")

 Первое, что вам нужно сделать, когда вы хотите отправить веб-форму, это выяснить, как называется форма и какой URL-адрес вы будете публиковать. Если вы зайдете на сайт duckduckgo и просмотрите источник, вы заметите, что его действие указывает на относительную ссылку «/ html». Таким образом, наш URL-адрес «http://duckduckgo.com/html». Поле ввода называется «q», поэтому, чтобы передать duckduckgo поисковый термин, мы должны передать его в поле «q». Вот где появляется строка urllib.urlencode . Она правильно кодирует наш поисковый запрос, а затем мы открываем URL и выполняем поиск. Результаты читаются и записываются на диск. Наконец, мы открываем наши сохраненные результаты с помощью модуля webbrowser . Теперь давайте выясним, как этот процесс отличается при использовании пакета запросов .

Отправка веб-формы с запросами

 

Пакет запросов формирует представления немного более элегантно. Давайте взглянем:

import requests

url = "http://duckduckgo.com/html"
payload = {'q':'python'}
r = requests.post(url, payload)
with open("requests_results.html", "w") as f:
    f.write(r.content)

С запросами вам просто нужно создать словарь с именем поля в качестве ключа и поисковым термином в качестве значения. Затем вы используете request.post для поиска. Наконец, вы используете получившийся объект запросов «r» и получаете доступ к его свойству содержимого, которое сохраняете на диск. Мы пропустили часть веб-браузера в этом примере (и в следующем) для краткости. Теперь мы должны быть готовы увидеть, как механизация делает свое дело.

Отправка веб-формы с Mechanize

 

Модуль Mechanize имеет множество интересных функций для работы в Интернете с помощью Python. К сожалению, он не поддерживает JavaScript. В любом случае, давайте продолжим шоу!

import mechanize

url = "http://duckduckgo.com/html"
br = mechanize.Browser()
br.set_handle_robots(False) # ignore robots
br.open(url)
br.select_form(name="x")
br["q"] = "python"
res = br.submit()
content = res.read()
with open("mechanize_results.html", "w") as f:
    f.write(content)

Как вы можете видеть, механизация более многословна, чем два других метода. Мы также должны указать ей игнорировать директиву robots.txt, иначе она потерпит неудачу. Конечно, если вы хотите быть хорошим пользователем сети, то не стоит игнорировать это. В любом случае, для начала вам нужен объект Browser. Затем вы открываете URL, выбираете форму (в данном случае «x») и настраиваете словарь с параметрами поиска, как и раньше. Обратите внимание, что в каждом методе установка dict немного отличается. Далее вы отправляете запрос и читаете результат. Наконец вы сохраняете результат на диск и все готово!

Завершение

 

Вероятно, из трех запросов запросы были самыми простыми, а urllib был вторым. Механизация создана для того, чтобы делать намного больше, чем две другие. Он создан для скриншотов и тестирования веб-сайтов, поэтому неудивительно, что он немного более многословен. Вы также можете сделать отправку формы с селеном, но вы можете прочитать об этом в архивах этого блога . Я надеюсь, что вы нашли эту статью интересной и, возможно, вдохновляющей. Увидимся в следующий раз!