Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Can';不要让我的脚本在成功运行之前一直尝试使用不同的代理_Python_Python 3.x_Selenium_Web Scraping_Scrapy - Fatal编程技术网

Python Can';不要让我的脚本在成功运行之前一直尝试使用不同的代理

Python Can';不要让我的脚本在成功运行之前一直尝试使用不同的代理,python,python-3.x,selenium,web-scraping,scrapy,Python,Python 3.x,Selenium,Web Scraping,Scrapy,我已经用scrapy和selenium编写了一个脚本,通过get\u proxies()方法使用新生成的代理发出代理请求。我使用requests模块获取代理,以便在脚本中重用它们。我试图做的是解析它的所有帖子链接,然后从它的链接中获取每个标题的名称 我下面的脚本工作不一致,因为当get\u random\u proxy函数生成一个可用的代理时,我会让脚本工作,否则它会失败 如何让我的脚本继续尝试不同的代理,直到它成功运行? 到目前为止,我写过: import scrapy import rand

我已经用scrapy和selenium编写了一个脚本,通过
get\u proxies()
方法使用新生成的代理发出代理请求。我使用requests模块获取代理,以便在脚本中重用它们。我试图做的是解析它的所有帖子链接,然后从它的链接中获取每个标题的名称


我下面的脚本工作不一致,因为当
get\u random\u proxy
函数生成一个可用的代理时,我会让脚本工作,否则它会失败

如何让我的脚本继续尝试不同的代理,直到它成功运行?

到目前为止,我写过:

import scrapy
import random
import requests
from itertools import cycle
from bs4 import BeautifulSoup
from selenium import webdriver
from scrapy.crawler import CrawlerProcess
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support import expected_conditions as EC

def get_proxies():   
    response = requests.get("https://www.sslproxies.org/")
    soup = BeautifulSoup(response.text,"lxml")
    proxies = [':'.join([item.select_one("td").text,item.select_one("td:nth-of-type(2)").text]) for item in soup.select("table.table tr") if "yes" in item.text]
    return proxies

def get_random_proxy(proxy_vault):
    random.shuffle(proxy_vault)
    proxy_url = next(cycle(proxy_vault))
    return proxy_url

def start_script():
    proxy = get_proxies()
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument(f'--proxy-server={get_random_proxy(proxy)}')
    driver = webdriver.Chrome(options=chrome_options)
    return driver

class StackBotSpider(scrapy.Spider):
    name = "stackoverflow"

    start_urls = [
        'https://stackoverflow.com/questions/tagged/web-scraping'
    ]

    def __init__(self):
        self.driver = start_script()
        self.wait = WebDriverWait(self.driver, 10)

    def parse(self,response):
        self.driver.get(response.url)
        for elem in self.wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".summary .question-hyperlink"))):
            yield scrapy.Request(elem.get_attribute("href"),callback=self.parse_details)

    def parse_details(self,response):
        self.driver.get(response.url)
        for elem in self.wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "h1[itemprop='name'] > a"))):
            yield {"post_title":elem.text}

c = CrawlerProcess({
    'USER_AGENT': 'Mozilla/5.0',   
})
c.crawl(StackBotSpider)
c.start()
如您所标记的,仅使用,您可以使用新活动的代理发出代理请求,该代理将在中列出,并使用以下解决方案:

注意:此程序将从代理列表中逐个调用代理,直到成功建立代理连接并通过
https://www.whatismyip.com/

  • 代码块:

    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.common.exceptions import TimeoutException
    
    options = webdriver.ChromeOptions()
    options.add_argument('start-maximized')
    options.add_argument('disable-infobars')
    options.add_argument('--disable-extensions')
    driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
    driver.get("https://sslproxies.org/")
    driver.execute_script("return arguments[0].scrollIntoView(true);", WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//table[@class='table table-striped table-bordered dataTable']//th[contains(., 'IP Address')]"))))
    ips = [my_elem.get_attribute("innerHTML") for my_elem in WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.XPATH, "//table[@class='table table-striped table-bordered dataTable']//tbody//tr[@role='row']/td[position() = 1]")))]
    ports = [my_elem.get_attribute("innerHTML") for my_elem in WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.XPATH, "//table[@class='table table-striped table-bordered dataTable']//tbody//tr[@role='row']/td[position() = 2]")))]
    driver.quit()
    proxies = []
    for i in range(0, len(ips)):
        proxies.append(ips[i]+':'+ports[i])
    print(proxies)
    for i in range(0, len(proxies)):
        try:
            print("Proxy selected: {}".format(proxies[i]))
            options = webdriver.ChromeOptions()
            options.add_argument('--proxy-server={}'.format(proxies[i]))
            driver = webdriver.Chrome(options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
            driver.get("https://www.whatismyip.com/proxy-check/?iref=home")
            if "Proxy Type" in WebDriverWait(driver, 5).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "p.card-text"))):
                break
        except Exception:
            driver.quit()
    print("Proxy Invoked")
    
  • 控制台输出:

    ['190.7.158.58:39871', '175.139.179.65:54980', '186.225.45.146:45672', '185.41.99.100:41258', '43.230.157.153:52986', '182.23.32.66:30898', '36.37.160.253:31450', '93.170.15.214:56305', '36.67.223.67:43628', '78.26.172.44:52490', '36.83.135.183:3128', '34.74.180.144:3128', '206.189.122.177:3128', '103.194.192.42:55546', '70.102.86.204:8080', '117.254.216.97:23500', '171.100.221.137:8080', '125.166.176.153:8080', '185.146.112.24:8080', '35.237.104.97:3128']
    
    Proxy selected: 190.7.158.58:39871
    
    Proxy selected: 175.139.179.65:54980
    
    Proxy selected: 186.225.45.146:45672
    
    Proxy selected: 185.41.99.100:41258
    
您可以尝试使用

以下是另一个可能对您有帮助的参考:

检查部件:

DOWNLOADER_MIDDLEWARES = {
    'rotating_proxies.middlewares.RotatingProxyMiddleware': 610,
}

ROTATING_PROXY_LIST = [
    'proxy1.com:8000',
    'proxy2.com:8031',
    # ...
]

在你的环境中试试这个,你肯定会得到你想要的。希望这能对您有所帮助。

您可以在选择随机代理时使用
请求
库来检查代理是否工作。通过代理循环:

  • 随机移动并拾取(
    pop
    )一个随机代理
  • 检查
    请求
    ,如果成功,则返回代理,否则转到步骤1

  • 将您的
    get\u random\u proxy
    更改为如下内容:

    def get_random_代理(代理库):
    在使用vault时:
    随机移动(代理库)
    proxy\u url=proxy\u vault.pop()
    代理记录={
    “http”:代理服务器url,
    “https”:代理服务器url
    }
    尝试:
    res=requests.get(“http://example.com,代理服务器=代理服务器,超时时间=10)
    res.为_状态提高_()
    返回代理服务器url
    除:
    持续
    

    如果
    get\u random\u proxy
    返回
    None
    ,则表示所有代理均不工作。在这种情况下,省略
    --proxy server
    参数

    def start_script():
    proxy=get_proxies()
    chrome\u options=webdriver.ChromeOptions()
    随机\u代理=获取随机\u代理(代理)
    if random_proxy:#仅当我们成功找到工作代理时
    chrome_选项。添加_参数(f'--proxy server={random_proxy}')
    driver=webdriver.Chrome(选项=Chrome\u选项)
    返回驱动器
    
    问题在于你的
    CrawlerProcess
    crawl()
    方法你应该用
    try
    except
    封装它的一些内部调用,但是从你的问题中缺少那部分代码很难帮助你。你的代码使用了scrapy和selenium,除非scrapy在这里什么都不做。您应该坚持使用硒或scrapy,或者研究scrapy的硒整合。对于scrapy代理管理插件,请查看selenium是否在运行时切换代理有点复杂。如果在scrapy中使用代理的旋转,我发现首屈一指的是,它不依赖于任何插件,并且可以按照@Granitosaurus的方式执行。问题不在于我在尝试使用selenium时如何使用代理的旋转(我已经知道);更确切地说,这是关于我如何在与scrapy结合时也能做到这一点。希望你能找到我。感谢.@robots.txt,因为您已经添加了标签,因此我尝试构建一个规范的解决方案来帮助您完全基于。但是,Scrapy是基于请求的,可以以类似的方式执行相同的任务。
    get\u random\u proxy()
    将永远不会无法生成某些代理,除非出现连接错误。我已经测试过好几次了。你需要从另一个角度来解决这个问题@Mezbaメ. 谢谢。@robots.txt您想确保获得一个工作代理,这不是目标吗
    get_random_proxy
    通过测试随机代理来解决这个问题。只要
    requests.get
    使用代理工作,它就不会失败。我不太确定你到底想要什么。我把你搞错了@Mezbaメ. 你的解决方案似乎奏效了。我检查完后再打给你。谢谢