无法使用请求连接到 Tor,而我使用硒做了同样的事情

Unable to connect to Tor using requests whereas I did the same using selenium

我在 python 中编写了两个脚本:一个使用 selenium,另一个使用 requests 连接到 http://check.torproject.org 使用 Tor 得到这段文字 恭喜。此浏览器配置为从那里使用 Tor,以确保我以正确的方式做事。

当我使用下面的脚本时,我能顺利地得到文本:

from selenium import webdriver
import os

torexe = os.popen(r"C:\Users\WCS\Desktop\Tor Browser\Browser\TorBrowser\Tor\tor.exe")

options = webdriver.ChromeOptions()
options.add_argument('--proxy-server=socks5://localhost:9050')
driver = webdriver.Chrome(chrome_options=options)

driver.get("http://check.torproject.org")
item = driver.find_element_by_css_selector("h1.not").text
print(item)

driver.quit()

但是,当我尝试使用 requests 执行相同操作时,出现错误 AttributeError: 'NoneType' object has no attribute 'text':

import requests
from bs4 import BeautifulSoup
import os

torexe = os.popen(r"C:\Users\WCS\Desktop\Tor Browser\Browser\TorBrowser\Tor\tor.exe")

with requests.Session() as s:
    s.proxies['http'] = 'socks5://localhost:9050'
    res = s.get("http://check.torproject.org")
    soup = BeautifulSoup(res.text,"lxml")
    item = soup.select_one("h1.not").text
    print(item)

如何使用 requests 从该站点获取相同的文本?

当我使用这个 print(soup.title.text) 时,我可以得到这个文本 Sorry. You are not using Tor.,它清楚地表明 requests 不是通过 Tor 生成的。

check.torproject.org 强制使用 HTTPS,因此当请求遵循重定向到 https://check.torproject.org 时,您不再使用 SOCKS 代理,因为它仅指定用于 http 协议。

确保为 HTTP 和 HTTPS 设置代理。此外,要通过 Tor 解析 DNS 名称而不泄漏 DNS 请求,请使用 socks5h.

s.proxies['http']  = 'socks5h://localhost:9050'
s.proxies['https'] = 'socks5h://localhost:9050'

这应该会使您的测试正常工作。