簡體   English   中英

python urllib2:對等方重置連接

[英]python urllib2: connection reset by peer

我有一個 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() function 可以透明地與不需要身份驗證的代理一起工作。 現在我感覺很混亂。 有人可以幫我解決這個問題嗎?

我嘗試按照 Uku Loskit 和 Mikko Ohtamaa 的建議偽造 User-Agent 標頭,並解決了我的問題。 代碼如下:

    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

希望對其他人有用!

首先,正如史蒂夫所說,你需要 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

(我把它放在評論中,但它吃掉了我的換行符)

您可能會發現requests模塊是 urllib2 的更易於使用的替代品。

您是否嘗試手動指定代理?

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 標頭,以使請求看起來像是來自真實的瀏覽器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM