Не могу заставить мой скрипт продолжать попытки с разными прокси, пока он не запустится успешно - PullRequest
0 голосов
/ 14 мая 2019

Я написал сценарий в сочетании с селеном для написания прокси-запросов с использованием вновь сгенерированных прокси по методу get_proxies().Я использовал модуль запросов, чтобы получить прокси для повторного использования в скрипте.Я пытаюсь разобрать все ссылки на посты с целевой страницы , а затем извлечь название каждого заголовка с его целевой страницы .

Мой следующий скрипт работает непоследовательно, потому что когда функция get_random_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()

Ответы [ 3 ]

1 голос
/ 09 июня 2019

Вы можете использовать библиотеку requests при выборе случайного прокси, чтобы проверить, работает ли прокси.Прокрутите прокси:

  1. Перемешайте и выберите (pop) случайный прокси
  2. Проверьте с помощью requests, в случае успеха верните прокси, в противном случае перейдите к шагу 1

Измените get_random_proxy на что-то вроде этого:

def get_random_proxy(proxy_vault):
    while proxy_vault:
        random.shuffle(proxy_vault)
        proxy_url = proxy_vault.pop()
        proxy_dict = {
            'http': proxy_url,
            'https': proxy_url
        }
        try:
            res = requests.get("http://example.com", proxies=proxy_dict, timeout=10)
            res.raise_for_status()
            return proxy_url
        except:
            continue

Если get_random_proxy возвращает None, это означает, что ни один из прокси не работает.В этом случае опустите аргумент --proxy-server.

def start_script():
    proxy = get_proxies()
    chrome_options = webdriver.ChromeOptions()
    random_proxy = get_random_proxy(proxy)
    if random_proxy: # only when we successfully find a working proxy
        chrome_options.add_argument(f'--proxy-server={random_proxy}')
    driver = webdriver.Chrome(options=chrome_options)
    return driver
0 голосов
/ 09 июня 2019

Вы можете попробовать использовать scrapy-rotated-proxy

Вот еще одна ссылка, которая может быть вам полезна: https://www.scrapehero.com/how-to-rotate-proxies-and-ip-addresses-using-python-3/

Проверьте деталь:

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

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

Попробуйте это в своих настройках, и вы обязательно получите то, что хотели.Надеюсь, это поможет вам.

0 голосов
/ 09 июня 2019

Поскольку вы пометили , используя только Селен , вы можете отправлять запросы через прокси, используя новые активные прокси, которые перечислены в списке бесплатных прокси , используяследующее решение:

Примечание : эта программа будет вызывать прокси из списка прокси по одному, пока не будет установлено успешное прокси-соединение и не проверено с помощью Проверка прокси страница 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
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...