ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python – 使用tor代理时的多线程爬虫

2019-10-02 18:56:29  阅读:549  来源: 互联网

标签:python multithreading tor socks


我正在尝试构建使用tor代理的多线程爬虫:
我正在使用以下建立tor连接:

from stem import Signal
from stem.control import Controller
controller = Controller.from_port(port=9151)
def connectTor():
    socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9150)
    socket.socket = socks.socksocket


def renew_tor():
    global request_headers
    request_headers = {
        "Accept-Language": "en-US,en;q=0.5",
        "User-Agent": random.choice(BROWSERS),
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
        "Referer": "http://thewebsite2.com",
        "Connection": "close"
    }

    controller.authenticate()
    controller.signal(Signal.NEWNYM)

这是url fetcher:

def get_soup(url):
    while True:
        try:
            connectTor()
            r = requests.Session()
            response = r.get(url, headers=request_headers)
            the_page = response.content.decode('utf-8',errors='ignore')
            the_soup = BeautifulSoup(the_page, 'html.parser')
            if "captcha" in the_page.lower():
                print("flag condition matched while url: ", url)
                #print(the_page)
                renew_tor()
            else:
                return the_soup
                break
        except Exception as e:
            print ("Error while URL :", url, str(e))

然后我创建多线程获取作业:

with futures.ThreadPoolExecutor(200) as executor:
            for url in zurls:
                future = executor.submit(fetchjob,url)

然后我得到以下错误,我在使用多处理时没有看到:

 Socket connection failed (Socket error: 0x01: General SOCKS server failure)

我将不胜感激任何建议,以避免袜子错误和提高爬行方法的性能,使其多线程.

解决方法:

这是为什么猴子修补socket.socket是坏的一个完美的例子.

这将使用SOCKS套接字替换所有套接字连接(大多数情况下)使用的套接字.

当您稍后再连接到控制器时,它会尝试使用SOCKS协议进行通信,而不是建立直接连接.

由于您已经在使用请求,我建议删除SocksiPy和socks.socket = socks.socksocket代码并使用内置于请求中的SOCKS proxy功能:

proxies = {
    'http': 'socks5h://127.0.0.1:9050',
    'https': 'socks5h://127.0.0.1:9050'
}

response = r.get(url, headers=request_headers, proxies=proxies)

标签:python,multithreading,tor,socks
来源: https://codeday.me/bug/20191002/1843952.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有