带有Tor代理的Python urllib2抛出'HTTP错误403`

带有Tor代理的Python urllib2抛出'HTTP错误403`,python,urllib2,tor,socks,Python,Urllib2,Tor,Socks,我正在尝试使用如下解决方案解析网页: from bs4 import BeautifulSoup as bs import re import time import random ---------------------- import socks import socket # Can be socks4/5 socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5,'127.0.0.1', 9050) socket.socket = socks.so

我正在尝试使用如下解决方案解析网页:

from bs4 import BeautifulSoup as bs
import re
import time
import random

----------------------
import socks
import socket

# Can be socks4/5
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5,'127.0.0.1', 9050)
socket.socket = socks.socksocket

# Magic!
def getaddrinfo(*args):
    return [(socket.AF_INET, socket.SOCK_STREAM, 6, '', (args[0], args[1]))]

socket.getaddrinfo = getaddrinfo
----------------------

import urllib2


# define urls
start_url = 'http://www.exmple.com'

# get web page
hdr = request_header()
req = urllib2.Request(start_url)
for key, value in hdr.items():
    req.add_header(key, value)

page = urllib2.urlopen(req)
soup = bs(page.read(), 'lxml')
import socks    # Import this first no matter what
import socket    
import re
import time
import random
from bs4 import BeautifulSoup as bs 
但我得到了这个错误:

Traceback (most recent call last):
  File "soupParse.py", line 159, in <module>
    all_r = main()
  File "soupParse.py", line 35, in main
    page = urllib2.urlopen(req)
  File "/usr/lib/python2.7/urllib2.py", line 127, in urlopen
    return _opener.open(url, data, timeout)
  File "/usr/lib/python2.7/urllib2.py", line 410, in open
    response = meth(req, response)
  File "/usr/lib/python2.7/urllib2.py", line 523, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/lib/python2.7/urllib2.py", line 448, in error
    return self._call_chain(*args)
  File "/usr/lib/python2.7/urllib2.py", line 382, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.7/urllib2.py", line 531, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 403: Forbidden
我对这个话题不太熟悉,所以我很难理解这个问题。请帮忙。多谢各位

更新

我能够确定,这个错误只发生在
urllib2
中。例如,如果使用
请求
,则不会出现错误。我没有回答这个问题,因为我不知道为什么会存在这个问题。如果有人知道,我会很高兴听到的


祝你好运和快乐

我强烈建议启动Wireshark并确保您的请求被代理为您认为的那样

BeautifulSoup可能是罪魁祸首,因为它在逻辑上会首先导入套接字模块,因此请尝试将您的导入设置为以下内容:

from bs4 import BeautifulSoup as bs
import re
import time
import random

----------------------
import socks
import socket

# Can be socks4/5
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5,'127.0.0.1', 9050)
socket.socket = socks.socksocket

# Magic!
def getaddrinfo(*args):
    return [(socket.AF_INET, socket.SOCK_STREAM, 6, '', (args[0], args[1]))]

socket.getaddrinfo = getaddrinfo
----------------------

import urllib2


# define urls
start_url = 'http://www.exmple.com'

# get web page
hdr = request_header()
req = urllib2.Request(start_url)
for key, value in hdr.items():
    req.add_header(key, value)

page = urllib2.urlopen(req)
soup = bs(page.read(), 'lxml')
import socks    # Import this first no matter what
import socket    
import re
import time
import random
from bs4 import BeautifulSoup as bs 

该页面需要登录吗?@NunoAndré,不需要。它在不设置socks块的情况下工作正常。标题可能有问题。你要发送哪些标题?@NunoAndré,请参阅我的编辑。但是它可以在没有袜子的情况下使用相同的标题。谢谢你回到这个问题,但是你的选择对我不起作用。我也犯了同样的错误。其他建议?如果您得到403禁止,这意味着您的代理服务器没有正确地对您进行身份验证(或者具有auth,而您没有指定任何内容),或者您预期的其他事情没有发生。此时,您唯一的操作过程是获取代码实际执行情况的数据包捕获,并找出未按预期发生的情况。如果我使用
请求
而不是
urllib2
,则不会显示错误。我怎样才能检查http和dns是否两者都有问题?如果
请求
起作用,但
urlib2
不起作用,这在您使用
urlib2
时是一个错误,因为
请求
使用
urlib2
IIRC。您唯一的做法是使用wireshark获取数据包捕获,并查看
请求
urllib2
之间的实际请求差异。还有,如果有效,为什么不直接使用
请求
?:)这正是我要做的。谢谢你的帮助。