我正在使用python運行腳本,它使用urllib2從天氣api獲取數據並將其顯示在屏幕上。我有問題,當我查詢服務器時,我得到一個「沒有與主機名關聯的地址」錯誤。我可以使用Web瀏覽器查看api的輸出,並且可以使用wget下載該文件,但我必須強制IPv4才能使其工作。使用urllib2.urlopen時,是否可以在urllib2中強制使用IPv4?Python urllib2 force IPv4
4
A
回答
9
不直接,沒有。
那麼,你可以做什麼?
一種可能性是自己明確地將主機名解析爲IPv4,然後使用IPv4地址而不是名稱作爲主機。例如:
host = socket.gethostbyname('example.com')
page = urllib2.urlopen('http://{}/path'.format(host))
然而,一些虛擬服務器站點可能需要Host: example.com
頭,他們反而會得到一個Host: 93.184.216.119
。您可以解決這通過重寫頭:
host = socket.gethostbyname('example.com')
request = urllib2.Request('http://{}/path'.format(host),
headers = {'Host': 'example.com'})
page = urllib2.urlopen(request)
或者,您也可以在代替標準的人提供自己的處理程序。但標準處理程序大多隻是圍繞httplib.HTTPConnection
的包裝,而真正的問題在於HTTPConnection.connect
。
所以,乾淨的方式做,這是創建自己的httplib.HTTPConnection
子類,它覆蓋connect
這樣的:
def connect(self):
host = socket.gethostbyname(self.host)
self.sock = socket.create_connection((host, self.post),
self.timeout, self.source_address)
if self._tunnel_host:
self._tunnel()
然後創建自己的urllib2.HTTPHandler
重寫http_open
使用你的子類的子類:
def http_open(self, req):
return self.do_open(my wrapper.MyHTTPConnection, req)
...同樣地,對於HTTPSHandler
,然後適當地鉤出來的東西如圖所示urllib2
文檔。
快速&骯髒的方式做同樣的事情只是monkeypatch httplib.HTTPConnection.connect
以上功能。
最後,您可以使用不同的庫而不是urllib2
。從我記得,requests
並沒有使這更容易(最終,你必須重寫或monkeypatch略有不同的方法,但它是有效的相同)。但是,任何libcurl
包裝將允許您執行相當於curl_easy_setopt(h, CURLOPT_IPRESOLVE, CURLOPT_IPRESOLVE_V4)
。
相關問題
- 1. Force下載 - Python
- 2. urllib2 python等效python
- 3. Python urllib2錯誤
- 4. python urllib2和unicode
- 5. Urllib2 Python錯誤
- 6. python csv linux urllib2
- 7. 使用urllib2 python
- 8. 與Python的urllib2
- 9. Python mod json + urllib2
- 10. urllib2.HTTPError Python
- 11. Python - Heroku urllib2.HTTPError
- 12. Python,Urllib2和Openers
- 13. Python urllib2錯誤
- 14. python urllib2 return JSON
- 15. Python ttk.combobox force post/open
- 16. 的Python的urllib2 + Beautifulsoup
- 17. python urllib2.URLError處理
- 18. 的Python的urllib2庫
- 19. 的Python的urllib2與
- 20. Python urllib2.Request.get_header文檔?
- 21. Python Urllib2 SSL錯誤
- 22. Python urllib2 URLError異常?
- 23. Python 2.7.3 urllib2錯誤
- 24. Python的URLLib/URLLib2 POST
- 25. python 2.7 urllib2.Request KeyError
- 26. Python urllib2:從網站阻止?
- 27. Python urllib,urllib2填寫表單
- 28. Python進程被urllib2阻止
- 29. Python urllib2發送POST數據
- 30. Python urllib2返回noscript-content
是套接字的一類urllib2? – TheDoctor
@TheDoctor:否,['socket'](http://docs.python.org/2/library/socket.html)是一個模塊,'socket.socket'是'socket'模塊的一個類。 – abarnert
我已經得到它使用套接字,但現在我得到HTTP錯誤596:REST服務不可用。我不知道如何解決這個問題,不過謝謝 – TheDoctor