python urllib2: сброс соединения по пиру - PullRequest
9 голосов
/ 28 мая 2011

У меня есть Perl-программа, которая извлекает данные из базы данных моей университетской библиотеки, и она работает хорошо.Теперь я хочу переписать его на python, но столкнулся с проблемой <urlopen error [errno 104] connection reset by peer>

Код perl:

    my $ua = LWP::UserAgent->new;
    $ua->cookie_jar( HTTP::Cookies->new() );
    $ua->timeout(30);
    $ua->env_proxy;
    my $response = $ua->get($url); 

Код Python, который я написал:

    cj = CookieJar();
    request = urllib2.Request(url); # url: target web page 
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj));
    opener = urllib2.install_opener(opener);
    data = urllib2.urlopen(request); 

Я использую VPN (виртуальную частную сеть) для входа в библиотеку моего университета дома, и я попробовал и код perl, и код python.Код Perl работает, как я и ожидал, но код Python всегда сталкивался с «ошибкой urlopen».

Я погуглил проблему, и кажется, что urllib2 не может загрузить прокси-сервер среды.Но согласно документу urllib2, функция urlopen () прозрачно работает с прокси, которые не требуют аутентификации.Теперь я чувствую себя довольно запутанным.Кто-нибудь может мне помочь с этой проблемой?

Ответы [ 4 ]

8 голосов
/ 29 мая 2011

Я попытался подделать заголовки User-Agent, как предложили Uku Loskit и Mikko Ohtamaa, и решил мою проблему.Код выглядит следующим образом:

    proxy = "YOUR_PROXY_GOES_HERE"
    proxies = {"http":"http://%s" % proxy}
    headers={'User-agent' : 'Mozilla/5.0'}
    proxy_support = urllib2.ProxyHandler(proxies)
    opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler(debuglevel=1))
    urllib2.install_opener(opener)

    req = urllib2.Request(url, None, headers)
    html = urllib2.urlopen(req).read()
    print html

Надеюсь, это будет полезно для кого-то еще!

2 голосов
/ 28 мая 2011

Во-первых, как сказал Стив, вам нужен response.read (), но это не ваша проблема

import urllib2
response = urllib2.urlopen('http://python.org/')
html = response.read()

Можете ли вы сообщить подробности ошибки? Вы можете получить это так:

try:
    urllib2.urlopen(req)
except URLError, e:
     print e.code
     print e.read()

Источник: http://www.voidspace.org.uk/python/articles/urllib2.shtml

(я поставил это в комментарии, но он ел мои новые строки)

1 голос
/ 29 мая 2011

Вы можете обнаружить, что модуль запросы является гораздо более простой в использовании заменой urllib2.

0 голосов
/ 28 мая 2011

Вы пытались указать прокси вручную?

proxy = urllib2.ProxyHandler({'http': 'your_proxy_ip'})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
urllib2.urlopen('http://www.uni-database.com')

, если он все еще не работает, попробуйте подделать заголовки User-Agent, чтобы создать впечатление, что запрос исходит из реального браузера.

...