问题描述
我使用以下代码在 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,而无需通过可恶的验证码测试。