0

Python でカスタム DNS サーバーを使用するのに本当に問題があります。私はこれに従っていますカスタムDNSを使用するよう にurllib2に指示しますself.hostとself.portを指定しない場合、ブロックせずに通過します。

コードは次のとおりです。

import urllib2
import httplib
import socket
class MyHTTPConnection (httplib.HTTPConnection):
    def connect (self):
        if self.host == 'www.porn.com':
            self.host = '208.67.222.123' #OpenDNS FamilyShield
            self.port = 53
        self.sock = socket.create_connection ((self.host, self.port))
class MyHTTPHandler (urllib2.HTTPHandler):
    def http_open (self, req):
        return self.do_open (MyHTTPConnection, req)

opener = urllib2.build_opener(MyHTTPHandler)
urllib2.install_opener (opener)
f = urllib2.urlopen ('http://www.porn.com/videos/anime-toon.html')
data = f.read ()
print data

"raise BadStatusLine(line)" エラーが発生し続けます

エラーログ:

Traceback (most recent call last):
  File "K:\Desktop\rte\dns2.py", line 16, in <module>
    f = urllib2.urlopen ('http://www.porn.com/videos/anime-toon.html')
  File "C:\Python27\lib\urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "C:\Python27\lib\urllib2.py", line 394, in open
    response = self._open(req, data)
  File "C:\Python27\lib\urllib2.py", line 412, in _open
    '_open', req)
  File "C:\Python27\lib\urllib2.py", line 372, in _call_chain
    result = func(*args)
  File "K:\Desktop\rte\dns2.py", line 12, in http_open
    return self.do_open (MyHTTPConnection, req)
  File "C:\Python27\lib\urllib2.py", line 1170, in do_open
    r = h.getresponse(buffering=True)
  File "C:\Python27\lib\httplib.py", line 1027, in getresponse
    response.begin()
  File "C:\Python27\lib\httplib.py", line 407, in begin
    version, status, reason = self._read_status()
  File "C:\Python27\lib\httplib.py", line 371, in _read_status
    raise BadStatusLine(line)
BadStatusLine: ''

編集:私が間違った方法で行っていたことを、isedev応答に続けます。

ネームサーバーへの変更がurllib2に登録されていないようです

import dns.resolver
import urllib2

resolver = dns.resolver.Resolver()
resolver.nameservers = ['208.67.222.123']
answer = resolver.query('www.porn.com','A')
web_url = 'http://www.porn.com/videos/anime-toon.html'
req1 = urllib2.Request(web_url)
req1.add_header('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3')
response1 = urllib2.urlopen(req1)
html=response1.read()
print html
4

1 に答える 1

2

あなたが参照している「カスタム DNS」の回答で何が行われているかを誤解していると思います。そのソリューションで示されている例は、実際にはカスタム DNS サーバーを設定していません。MyResolver クラスは例としてのみ示され、「news.bbc.co.uk」のハードコーディングされた名前から IP への変換を実行します。

したがって、コードが実際に行っているのは、「www.porn.com」(ポート 80) への HTTP 要求を OpenDNS Family Shield DNS サーバー (ポート 53) にリダイレクトすることです...これは明らかにエラーにつながります。 .

したがって、次のように置き換える必要があります。

if self.host == 'www.porn.com':
    self.host = '208.67.222.123' #OpenDNS FamilyShield
    self.port = 53

選択した DNS サーバーに対して直接「www.porn.com」を解決するコードを使用します (たとえば dnspython を使用)。

dnspython パッケージがインストールされていると仮定すると、次のようなことができます。

import urllib2
import httplib
import socket
import dns.resolver

class MyHTTPConnection (httplib.HTTPConnection):
    def connect (self):
        if self.host == 'www.porn.com':
            resolver = dns.resolver.Resolver()
            resolver.nameservers = ['208.67.222.123']
            answer = resolver.query(self.host,'A')
            self.host = answer.rrset.items[0].address
        self.sock = socket.create_connection ((self.host, self.port))

class MyHTTPHandler (urllib2.HTTPHandler):
    def http_open (self, req):
        return self.do_open (MyHTTPConnection, req)

opener = urllib2.build_opener(MyHTTPHandler)
urllib2.install_opener (opener)
f = urllib2.urlopen ('http://www.porn.com/videos/anime-toon.html')
data = f.read ()
print data

このコードは '404 - not found' を返し、ネットワーク トレースは 'hit-adult.opendns.com' への HTTP リクエストを示しています。

dig @208.67.222.123 www.porn.com A
;; ANSWER SECTION:
www.porn.com.           0       IN      A       67.215.65.130

nslookup 67.215.65.130
130.65.215.67.in-addr.arpa      name = hit-adult.opendns.com.

上記はあくまで一例です。実際のコードではエラーチェックなどが必要になります...

于 2013-01-27T22:15:17.503 に答える