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

Я написал скрипт на python в сочетании с селеном для извлечения различных постов с веб-сайта, используя ротацию прокси.Скрипт пытается только один раз и затем завершается.Теперь я хочу, чтобы мой сценарий продолжал пробовать разные прокси, чтобы получить правильный ответ, пока список не будет исчерпан.

Я думал, что моя реализация верна, но скрипт пытается один раз, а затем завершает работу.Поскольку он не выдает никакой ошибки, я не могу позволить сценарию продолжать попытки, даже если есть предложение try/except.

import random
from selenium import webdriver
from random import choice

link = 'https://stackoverflow.com/questions/tagged/web-scraping'

proxies = ['103.110.37.244:36022', '180.254.218.229:8080', '110.74.197.207:50632', '1.20.101.95:49001']

def start_script():
    random.shuffle(proxies)
    proxy_url = choice(proxies)
    print("implementing:",proxy_url)
    options = webdriver.ChromeOptions()
    options.add_argument(f'--proxy-server={proxy_url}')
    driver = webdriver.Chrome(options=options)
    return driver

def get_links(url):
    driver = start_script()
    try:
        driver.get(url)
        items = [item.get_attribute("href") for item in driver.find_elements_by_css_selector(".summary .question-hyperlink")]
        for item in items:
            print(item)

    except Exception:
        driver.quit()
        get_links(url)

if __name__ == '__main__':
    get_links(link)

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

from selenium import webdriver

link = 'https://stackoverflow.com/questions/tagged/web-scraping'

def get_links(url):
    driver = webdriver.Chrome()
    driver.get(url)
    items = [item.get_attribute("href") for item in driver.find_elements_by_css_selector(".summary .question-hyperlink")]
    for item in items:
        print(item)

if __name__ == '__main__':
    get_links(link)

PS The proxy list are the placeholders. They are not working ones.

Как я могуразрешить моему сценарию пытаться использовать разные прокси для получения правильного ответа, пока список не будет исчерпан?

1 Ответ

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

Я верю, что это сделает то, что вам нужно. Я перетасовал прокси и перебрал их. Если хороший результат найден, он обрабатывает элементы, выходит из цикла и завершается. Если что-то идет не так или не находит результата, он просто пытается найти следующий прокси в списке.

import random
from selenium import webdriver
from random import choice

link = 'https://stackoverflow.com/questions/tagged/web-scraping'

proxies = ['103.110.37.244:36022', '180.254.218.229:8080', '110.74.197.207:50632', '1.20.101.95:49001']

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

def get_links(url):
    random.shuffle(proxies)
    for proxy in proxies:
        driver = start_script(proxy)
        try:
            driver.get(url)
            print('Url {} retrieved, get elements'.format(url))
            elements = driver.find_elements_by_css_selector(".summary .question-hyperlink")
            print('Selected elements, check for None')
            if elements is not None:
                print('Found {} elements'.format(len(elements)))
                items = [item.get_attribute("href") for item in elements]
                if items is not None and len(items) > 0:
                    for item in items:
                        print(item)
                    break;
        except Exception:
            print('Proxy {} failed, trying next'.format(proxy))
        finally:
            driver.quit()

if __name__ == '__main__':
    get_links(link)
...