使用 selenium 和 Tor 旋转 IP

Rotating IP with selenium and Tor

我有一个用于 抓取 特定 HTTP 请求的 selenium 配置,仅当我单击网站的特定 REACT 元素时才会发送此请求。 这就是我使用硒的原因...找不到其他方法。

我必须更新我的 IP,每次我想 抓取 这个特定的 HTTP 请求。 为此,我使用 Tor。 当我启动我的 python 脚本时,它工作得很好,Tor 设置了一个新的 ip 并抓取我想要的东西。 我在我的脚本中添加了一个try/catch,如果我的脚本第一次无法运行,它将重试10次。

问题是当我的脚本再次尝试时,IP 无法再轮换....

如何做到这一点?



import time
from random import randint
from time import sleep
import os
import subprocess
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
from seleniumwire import webdriver
from selenium.webdriver.firefox.options import Options
from fake_useragent import UserAgent



options_wire = {
    'proxy': {
        'http': 'http://localhost:8088',
        'https': 'https://localhost:8088',
        'no_proxy': ''
    }
}

def firefox_init():
    os.system("killall tor")
    time.sleep(1)
    ua = UserAgent()
    user_agent = ua.random
    subprocess.Popen(("tor --HTTPTunnelPort 8088"),shell=True)
    time.sleep(2)
    return user_agent


def profile_firefox():
    profile = FirefoxProfile()
    profile.set_preference('permissions.default.image', 2)
    profile.set_preference('dom.ipc.plugins.enabled.libflashplayer.so', 'false')
    profile.set_preference("general.useragent.override", firefox_init())
    profile.set_preference("driver.privatebrowsing.autostart", True)
    profile.update_preferences()
    return profile



def options_firefox():
    options = Options()
    options.headless = False
    return options


def firefox_closing(driver):
    driver.quit()
    time.sleep(3)
    os.system('killall tor')
      


def headless(url):
    for x in range(0, 10):
        profile = profile_firefox()
        options = options_firefox()
        driver = webdriver.Firefox(seleniumwire_options=options_wire,firefox_profile=profile, options=options, executable_path='******/headless_browser/geckodriver')
        driver.set_window_position(0, 0)
        driver.set_window_size(randint(1024, 2060), randint(1024, 4100))
        # time.sleep(randint(3,10))
        driver.get(url)
        time.sleep(randint(3,8))
        try:
            if driver.find_element_by_xpath("//*[@id=\"*******\"]/main/div/div/div[1]/div[2]/form/div/div[2]/div[1]/button"):
                # driver.find_element_by_xpath("//*[@id=\"*******\"]/main/div/div/div[1]/div[2]/form/div/div[2]/div[1]/button").click()
                # time.sleep(randint(8,10))
                driver.find_element_by_xpath("//*[@id=\"*******\"]/main/div/div/div[1]/div[2]/form/div/div[2]/div[1]/button").click()
                time.sleep(randint(3,6))
                for request in driver.requests:
                    if request.path == "https://api.*********.***/*******/*********":
                        request_api = request
                        raw = str(request_api.body)
                        request_api = raw.split(('b\''))
                        payload_raw = request_api[1]
                        payload = payload_raw[:-1]
                        if payload:
                            header = request.headers
                            print(header, payload)
                            break
                else:
                    continue
                break
    
        except:
            firefox_closing(driver)
            time.sleep(5)
        finally:
            firefox_closing(driver)

            
    return header, payload


url="https://check.torproject.org/?lang=fr"
headless(url)

谢谢

好吧,自从您终止 tor 进程后,我不可能知道它为什么不更新 IP 地址。即使你将 tor 作为 Systemd 中的一项服务,它也会在你重新启动服务时更新,当然。但我可能会给你一些指导:

  • 在假代理模块上,尝试禁用缓存以避免在 /tmp 目录中缓存或使用托管缓存服务器:

    ua = UserAgent(cache=False, use_cache_server=False)

  • 将 Tor 放在 systemd 上并避免使用 os.system(),它不安全,并且当您直接在脚本中输入系统命令时会出现很多缺陷。使用服务文件,您可能只需重新启动服务即可更新您的 IP 地址。您可能想使用 Arch Linux Wiki 参考在 here!
  • 中配置您自己的 TOR 环境

所以为了实现这个,我使用了另一个代理,selenium-wire很好,但需要修复。

我使用了 Browsermob 代理并设置了一个上游代理。 结果是您可以捕获每个 HTTP 请求或响应解析它,并且 ip 每次都旋转并使用 HTTPTunnelPort 配置。

    proxy_params = {'httpProxy': 'localhost:8088', 'httpsProxy': 'localhost:8088'}
    proxy_b = server.create_proxy(params=proxy_params)

谢谢