Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > разбираясь с urllib2


Автор: kulibinka 20.2.2007, 17:17
Обьясните пожалуйста разницу между этими ф-ями:

Код


import urllib, urllib2

def text_to_file (text, f_name):
    f = open(f_name, 'w')
    f.write(text)
    f.close()
    
def send_yandex_query1 (query):
    url = 'http://www.yandex.ru/yandsearch'

    txheaders = {
        'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
        'Accept-Language': 'en-us',
        'Cache-Control': 'max-age=0',
        'Referer':'http://www.google.com.ua/advanced_search?hl=uk',
    }

    data = {'text':query}
    data = urllib.urlencode(data)

    req = urllib2.Request(url, data, txheaders)
    u = urllib2.urlopen(req)
    page = u.read()

    text_to_file(page, 'yandex.html')
    return page


def send_yandex_query2 (query):
    url = 'http://www.yandex.ru/yandsearch'

    data = {'text':query}
    data = urllib.urlencode(data)

    full_url = url + '?' + data
    u = urllib2.urlopen(full_url)
    page = u.read()

    text_to_file(page, 'yandex.html')
    return page

send_yandex_query1('find_me')


и первая, и вторая на мой взлгляд должны работать абсолютно одинаково. 
Но!
первая не работает так как надо (не отсылает запрос, а открывает страницу "Задан пустой поисковый запрос"), а вторая отлично все отсылает.

Автор: _Viper_ 20.2.2007, 19:31
В первом случае, скорее всего, используется POST, во втором GET. Если yandex не поддерживает запросы через POST, то тогда понятно почему выдаёт страницу "Задан пустой поисковый запрос".

Автор: kulibinka 20.2.2007, 22:32
Попробовал проверить Ваше "скорее всего"

Тут http://www.diveintopython.org/http_web_services/user_agent.html код, который теоретически должен был бы показать все заголовки:

Код

import httplib

httplib.HTTPConnection.debuglevel = 1
request = urllib2.Request('http://google.com.ua') 
opener = urllib2.build_opener()
feeddata = opener.open(request).read()


Почему в ответ просто черный экран, где обещанные connect, send и т.д.?

Автор: albertn 21.2.2007, 09:55
http://docs.python.org/lib/module-urllib2.html
Цитата

the HTTP request will be a POST instead of a GET when the data parameter is provided.

Автор: _Viper_ 21.2.2007, 11:40
Цитата(albertn @  21.2.2007,  09:55 Найти цитируемый пост)
the HTTP request will be a POST instead of a GET when the data parameter is provided.
Не подходит, поскольку параметр data, как раз, не задан.

Цитата(kulibinka @  20.2.2007,  22:32 Найти цитируемый пост)
Почему в ответ просто черный экран, где обещанные connect, send и т.д.?
Просто в urllib2 debuglevel явно изменяется, поэтому рабочий код выглядит так:
Код

import urllib2
http = urllib2.HTTPHandler(debuglevel=1)
request = urllib2.Request('http://google.com.ua')

opener = urllib2.build_opener(http)
feeddata = opener.open(request).read()

Автор: kulibinka 23.2.2007, 14:30
Используя debuglevel=1 проверил - первая ф-ю посылает пост, вторая гет. И яндекс действительно не поддреживает пост.

Спасибо огромное!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)