Я написал сценарий в сочетании с селеном для написания прокси-запросов с использованием вновь сгенерированных прокси по методу 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()