Пожалуйста, обратите внимание, что пользователь заблокирован
Всем привет, хочу поделиться частью кода из всего проекта.
Сегодня разберем https://geonode.com/, там существует бесплатный лист с прокси который мы научимся парсить асинхронно.
Рассмотрите код, там указаны комментарии почти к каждой строчке, а потом приступайте к сбору проекта, пожалуйста!
Приступим:
Сегодня разберем https://geonode.com/, там существует бесплатный лист с прокси который мы научимся парсить асинхронно.
Рассмотрите код, там указаны комментарии почти к каждой строчке, а потом приступайте к сбору проекта, пожалуйста!
Приступим:
Python:
async def check_count_pages(session):
try:
async with session.get('https://proxylist.geonode.com/api/proxy-list', headers=headers) as response: # запрос на страницу
data = await response.json() #принимаем информацию сайта в json
# print(data['total'])
total = int(data['total']) #Значение количеста прокси переводим в инт
pages = math.ceil(total / 500) #Теперь, делим количество прокси на 500, т.к 1 json запросе хранится 500 прокси. Таким образом узнаем количество страниц
pages = int(pages)
# print(pages)
return pages #Взращаем
except Exception as e:
print(e)
Python:
async def printsecs(session, i, k):
params = {
'limit': '500',
'page': f'{i}',
'sort_by': 'lastChecked',
'sort_type': 'desc',
}
async with session.get('https://proxylist.geonode.com/api/proxy-list', headers=headers,
params=params) as response: #запрос на сайт
proxies = await response.json() #сохраняем в json
for proxy in proxies['data']: #шагаем по дате
if proxy['protocols'][0] == 'socks4': #если протокол равен сокс4
async with socks4lock: #Блокируем поток для корректной записи
async with aiof.open(r'socks4.txt', 'a') as file: #открываем файл для дозаписи
await file.write(f"{proxy['ip']}:{proxy['port']}\n") #Записываем прокси
await file.flush()
elif proxy['protocols'][0] == 'socks5': #Все тоже самое что и выше, только другой протокол прокси
async with socks5lock:
async with aiof.open(r'socks5.txt', 'a') as file:
await file.write(f"{proxy['ip']}:{proxy['port']}\n")
await file.flush()
elif proxy['protocols'][0] == 'https':
async with httpslock:
async with aiof.open(r'https.txt', 'a') as file:
await file.write(f"{proxy['ip']}:{proxy['port']}\n")
await file.flush()
elif proxy['protocols'][0] == 'http':
async with httplock:
async with aiof.open(r'http.txt', 'a') as file:
await file.write(f"{proxy['ip']}:{proxy['port']}\n")
await file.flush()
print(f'Обработано страниц с первого сайта - {k}')
Python:
async def main_first_site():
async with aiohttp.ClientSession() as session:
tasks = [] # Создаем лист с нашими тасками
k = 1 # Счетчик для проверки количества отработанных страниц
pages = await check_count_pages(session) #вызов функции чтобы узнать количество страниц
for i in range(0, pages): #Шагаем по количеству страниц
task = asyncio.create_task(printsecs(session, i, k)) #Передаем в нашу основную функцию сессию, страницу и счетчик
tasks.append(task) #упаковываем таск
k = k + 1 #счетчик
await asyncio.gather(*tasks) #распаковываем таски
Python:
import asyncio
import aiohttp
import math
import aiofiles as aiof
socks4lock = asyncio.Lock() # обязательные локи, чтобы запись файла была корректной
socks5lock = asyncio.Lock()
httpslock = asyncio.Lock()
httplock = asyncio.Lock()
headers = {
'authority': 'proxylist.geonode.com',
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'ru-RU,ru;q=0.9',
'sec-ch-ua': '"Chromium";v="110", "Not A(Brand";v="24", "Google Chrome";v="110"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36',
}
async def printsecs(session, i, k):
params = {
'limit': '500',
'page': f'{i}',
'sort_by': 'lastChecked',
'sort_type': 'desc',
}
async with session.get('https://proxylist.geonode.com/api/proxy-list', headers=headers,
params=params) as response: #запрос на сайт
proxies = await response.json() #сохраняем в json
for proxy in proxies['data']: #шагаем по дате
if proxy['protocols'][0] == 'socks4': #если протокол равен сокс4
async with socks4lock: #Блокируем поток для корректной записи
async with aiof.open(r'socks4.txt', 'a') as file: #открываем файл для дозаписи
await file.write(f"{proxy['ip']}:{proxy['port']}\n")
await file.flush()
elif proxy['protocols'][0] == 'socks5':
async with socks5lock:
async with aiof.open(r'socks5.txt', 'a') as file:
await file.write(f"{proxy['ip']}:{proxy['port']}\n")
await file.flush()
elif proxy['protocols'][0] == 'https':
async with httpslock:
async with aiof.open(r'https.txt', 'a') as file:
await file.write(f"{proxy['ip']}:{proxy['port']}\n")
await file.flush()
elif proxy['protocols'][0] == 'http':
async with httplock:
async with aiof.open(r'http.txt', 'a') as file:
await file.write(f"{proxy['ip']}:{proxy['port']}\n")
await file.flush()
print(f'Обработано страниц с первого сайта - {k}')
# async def write_to_file(filename, text):
# async with aiofiles.open(filename, 'a') as f:
# await f.write(text)
async def check_count_pages(session):
try:
async with session.get('https://proxylist.geonode.com/api/proxy-list', headers=headers) as response: # запрос на страницу
data = await response.json() #принимаем информацию сайта в json
# print(data['total'])
total = int(data['total']) #Значение количеста прокси переводим в инт
pages = math.ceil(total / 500) #Теперь, делим количество прокси на 500, т.к 1 json запрсе хранится 500 прокси. Таким образом узнаем количество страниц
pages = int(pages)
# print(pages)
return pages #Взращаем
except Exception as e:
print(e)
async def main_first_site():
async with aiohttp.ClientSession() as session:
tasks = [] # Создаем лист с нашими тасками
k = 1 # Счетчик для проверки количества отработанных страниц
pages = await check_count_pages(session) #вызов функции чтобы узнать количество страниц
for i in range(0, pages): #Шагаем по количеству страниц
task = asyncio.create_task(printsecs(session, i, k)) #Передаем в нашу основную функцию сессию, страницу и счетчик
tasks.append(task) #упаковываем таск
k = k + 1 #счетчик
await asyncio.gather(*tasks) #распаковываем таски
return 1
if __name__ == '__main__':
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
asyncio.run(main_first_site())
Последнее редактирование модератором: