Я пытаюсь экстраполировать данные с веб-страницы. Данных много, около 50 строк на страницу, и мне приходится слишком часто заходить на один и тот же сайт за короткое время. Очевидно, что сайт блокирует мой IP, если я получаю доступ слишком быстро. Если я добавлю: time.sleep (4), я могу немного решить проблему, но если у меня есть 300 страниц для экстраполяции, это всего лишь 20 минут ожидания. Я пытаюсь реализовать proxybroker:
async def show(proxies):
while True:
proxy = await proxies.get()
if proxy is None: break
print(proxy.host)
#print(dir(proxy))
#print("https://"+ str(proxy.host)+":"+str(proxy.port))
p.append(proxy.port)
h.append(proxy.host)
proxies = asyncio.Queue()
broker = Broker(proxies)
tasks = asyncio.gather(
broker.find(types=['HTTP', 'HTTPS'], limit=10),
show(proxies))
loop = asyncio.get_event_loop()
loop.run_until_complete(tasks)
PB находит x прокси для использования: я помещаю их в два массива, один для хоста и один для порта.
Я делать текст с сайта: https://httpbin.org/ip. Я блокируюсь, если я пытаюсь войти в систему слишком много раз. если я использую этот код:
for z in range (0.11):
j = random.randint (0.9)
print (j)
my_url = "https://httpbin.org/ip"
prox = {
"http": "https: //" + str (h [j]) + ":" + str (p [j]),
"https": "https: //" + str (h [j]) + ":" + str (p [j]),
}
r = requests.get (my_url, proxies = prox)
while ((r.status_code == 429) or (r.status_code == 400)):
print ("error 429, try again with another j random proxies")
time.sleep (1)
j = random.randint (0.9)
print (j)
prox = {
"http": "https: //" + str (h [j]) + ":" + str (p [j]),
"https": "https: //" + str (h [j]) + ":" + str (p [j]),
}
r = requests.get (my_url, proxies = prox)
print (r.status_code)
print ( "cycle" + str (z))
print (r.json ())
time.sleep (1)
Я пытаюсь получить доступ к одной и той же странице 10 раз с хостами: порт отличается. Но эта ошибка всегда возвращает:
requests.exceptions.ProxyError: HTTPSConnectionPool (host = 'httpbin.org', port = 443): Max retries exceeded with url: / ip (Caused by ProxyError ('Cannot connect to proxy.', ConnectionResetError ( 10054, "Connection in progress forcibly terminated by the remote host", None, 10054, None)))
На inte rnet я обнаружил, что, вероятно, добавив verify = False в request.get, который я могу разрешить. На самом деле это делает 10 циклов, где я возвращаю использованный хост, который почти всегда отличается и соответствует массивам прокси, взятым PB. Но это предупреждение возвращается ко мне:
C: \ Users \ scart \ anaconda3 \ lib \ site-packages \ urllib3 \ connectionpool.py: 1004: InsecureRequestWarning: Unverified HTTPS request is being made to host '51 .158.107.202 '. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
Может ли это последнее предупреждение быть проблемой на других сайтах? Вы знаете о рабочем или более эффективном альтернативном методе? Цель состоит в том, чтобы создать список из 20 хостов, чтобы 10 хостов использовали один поток и 10 других для максимизации скорости извлечения.
Спасибо всем