Я сохраняю прокси-серверы из ответа API в файле proxies.txt в следующем формате:носки5!192.168.1.1!80 /n
носки5!202.218.6.9!8080 /n
носки5!182.204.57.912!8080 /n
...
Там около 500 прокси и портов, разделенных восклицательным знаком-разделителем и далее новой строкой. (Я использовал этот разделитель, потому что он предпочтительнее двоеточия (:), согласно документации модуля.
Используя функцию socks.parseproxy(), я собираюсь передавать каждую строку как кортеж в функцию adddefaultproxy(), а затем распаковать аргументы (socks5, proxy, port) в функцию, а затем проанализировать их и добавить в цепочку.
Использование функции все как в документации модуля, за исключением того, что в документации цепочка представляет собой список прокси.
Когда я запускаю код, он выводит следующую ошибку:
"С сервера были получены неожиданные данные"
Когда я просмотрел спецификации ошибок в репозитории GitHub, ошибка относится к классу GeneralProxyError. Вот она:
class GeneralProxyError — при возникновении указывает на проблему, которая не попадает
в другую категорию. Параметр представляет собой кортеж, содержащий код ошибки и
описание. ошибка из следующего списка:
1 - неверные данные. Эта ошибка означает, что с
сервера были получены непредвиденные данные. Наиболее распространенная причина заключается в том, что сервер, указанный в качестве прокси,
на самом деле не является прокси-сервером Socks4/Socks5/HTTP, или, возможно, указан неправильный тип прокси.
Из API geonode , прокси — это socks5, и это то, что также используется в коде.
Вот код:
Код: Выделить всё
#Importing dependencies
import pyChainedProxy as socks
import socket
import requests
url = 'https://proxylist.geonode.com/api/proxy-list?anonymityLevel=elite&protocols=socks5&filterUpTime=90&speed=fast&limit=500&page=1&sort_by=lastChecked&sort_type=desc'
#Making request to the API
response = requests.get(url)
response.raise_for_status() # Check for HTTP request errors
page = response.json()
proxies = page['data']
# Loop through the list of proxies and passing the IP and each corresponding PORT value to a txt file
with open('proxies.txt', 'w') as file:
for proxy in proxies:
ip = proxy.get('ip')
port = proxy.get('port')
protocols = proxy.get('protocols')
proxy_type = ", ".join(protocols)
file.write(f"{proxy_type}!{ip}!{port}\n")
with open('proxies.txt', 'r') as file:
#Read the entire file content
content = file.read()
print(content)
def DEBUG(msg):
print(msg)
socks.DEBUG = DEBUG
print("Check IP w/o proxyfying: ", requests.get('http://ip-api.com/json').content)
#PROXY_TYPE = socks.PROXY_TYPE_SOCKS5
with open('proxies.txt', 'r') as file:
chain = [line.strip() for line in file.readlines()] # Read proxies from file and strip any newlines
socks.setdefaultproxy()
for hop in chain:
try:
# Expect format: proxy:port
proxy_address = hop.strip() # No need to split, we assume the type is SOCKS5
socks.adddefaultproxy(*socks.parseproxy(hop))
except Exception as e:
print(f"Error processing proxy entry '{hop}': {e}")
# Replace socket with proxy-enabled one
rawsocket = socket.socket
socket.socket = socks.socksocket
# Print IP with proxy chain
print("Check IP with proxyfying: ", requests.get('http://ip-api.com/json').content)
Я пробовал заменить восклицательный знак двоеточием, а также напрямую получить тип прокси из json. вместо того, чтобы указывать это в коде.
Подробнее здесь: https://stackoverflow.com/questions/790 ... hon-module
Мобильная версия