Python Selenium 控制运行 Tor 的最后一个障碍

问题描述

我使用以下代码在 Lubuntu 中运行由 Selenium 控制的 Tor:

import pandas as pd
import requests

headers = {'User-Agent': 'Chrome/70.0.3538.110'}  # PEP8: spaces around `=`

payload = {
     'continent[0]': 'Europa','continent[1]': 'nordamerika','continent[2]': 'Asien - Pazifik','PROFIT_PER_SHARE[enabled]': 1,'PROFIT_KGV[enabled]': 1,'MARKET_CAPITALIZATION[enabled]': 1,'PERFORMANCE_6_MONTHS[enabled]': 1,'PERFORMANCE_4_WEEKS[enabled]': 1,'SCREENER_INTEREST[enabled]': 1,'SCREENER_RISK_ZONE[enabled]': 1,'PROFIT_PER_SHARE[year]': 2020,'PROFIT_KGV[year]': 2020,'MARKET_CAPITALIZATION[year]': 2020,'offset': 0,}

url = 'https://www.onvista.de/aktien/finder/'

table_dfs = []  # list

for offset in range(0,3*50,50):

    payload['offset'] = offset

    response = requests.get(url,params=payload,headers=headers)
 
    all_tables = pd.read_html(response.text)
    table_dfs.append( all_tables[0] )  # `[0]` - first DataFrame from list
    
    #print(type(all_tables),all_tables)
    #print(type(all_tables[0]),all_tables[0])
    
df = pd.concat(table_dfs,ignore_index=True)

print(len(df))
print(df)

它有效,但方式有些奇怪。运行它会打开两个窗口,一个窗口是 Tor 的,另一个是 Firefox 的。 Selenium 仅控制 FF 窗口。 Tor 窗口只是闲置在那里。

并不是说这让生活变得难以忍受,正如我所说的每件事都有效,但我只是想知道如何“让它完全正确”(我的意思是在唯一的窗口中执行 Selenium 脚本) Tor)。

解决方法

我想通了。为了使用 Selenium 启动 Tor,请运行以下代码(它仍然启动 Firefox,这次没有任何 Tor 窗口,但它使用 Tor 服务):

from selenium import webdriver
profile = webdriver.FirefoxProfile()
profile.set_preference('network.proxy.type',1)
profile.set_preference('network.proxy.socks','127.0.0.1')
profile.set_preference('network.proxy.socks_port',9050)
profile.set_preference("network.proxy.socks_remote_dns",False)
profile.update_preferences()
driver = webdriver.Firefox(profile)

您可能需要添加以下三行来验证 Tor 服务为您的 Firefox 实例提供新 IP:

driver.get("http://icanhazip.com")
current_IP = driver.find_element_by_css_selector("body > pre:nth-child(1)")
print(current_IP.get_attribute("innerHTML"))

这个网站 icanhazip.com 允许人们查看他的外部 IP,而无需通过可恶的验证码测试。