Python Can';不要让我的脚本在成功运行之前一直尝试使用不同的代理
我已经用scrapy和selenium编写了一个脚本,通过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
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メ. 你的解决方案似乎奏效了。我检查完后再打给你。谢谢