@Kactus

Почему выдаёт ошибку 429 при использовании прокси?

Здравствуйте, появилась такая проблема, нужно за минуту обработать 10000 предметов в маркете steam. Т.е. я получаю файл с ценами с сайта market.csgo.net и начинаю у каждого названия предмета проверять цену уже в steam маркете. Вот на этом этапе 2-3 товара выдают код 200, остальные 429. Я решил делать череп прокси, но ничего не поменялось, при этом прокси работают точно. После подключил User-Agent, но тоже нет результата. Чтобы обработать столько запросов использую библиотеку threading. Если же делать без неё то скрипт работает более 5 часов, но успешно
Код:
import re
import requests
import json
from bs4 import BeautifulSoup
from pycbrf.toolbox import ExchangeRates
import random
from threading import Thread
import time
from fake_headers import Headers

rates = ExchangeRates()
val = float(rates['TRY'].rate)

def listing(i, items, proxies_list, val):
	stop = False
	while not stop:
		item = items[i]["market_hash_name"]
		price_tl = round(float(items[i]["price"]) / val, 2)
		headers = Headers(os="win", headers=True).generate()
		k=1
		while k==1:
			try:
				proxies = {
	    			'http': random.choice(proxies_list)
				}
				test = requests.get("http://ifconfig.me/ip", headers=headers, proxies=proxies, timeout=5).text
				if test != "":
					k=2
			except:
				k=1
		full_page = requests.get(f"https://steamcommunity.com/market/listings/570/{item}", headers=headers, proxies=proxies)
		print(full_page.status_code)
		result = re.findall(r'Market_LoadOrderSpread\(\s*(\d+)\s*\)', str(full_page.content))
		print(item)
		if result != []:
			parse = requests.get(f"https://steamcommunity.com/market/itemordershistogram?country=TL&language=english&currency=17&item_nameid={result[0]}&two_factor=0", headers=headers, proxies=proxies)
			res = json.loads(parse.content)
			buy_order_graph = res["buy_order_graph"]
			if buy_order_graph == []:
				print("Skip...")
				break
			sell = buy_order_graph[0]
			buy = res["sell_order_graph"][0][0]
			soup = BeautifulSoup(full_page.text, 'lxml')
			name = str(soup.find_all('title')[0]).replace("</title>", "").split("for ")[1]
			print(sell[0] - price_tl)
			if sell[0] - price_tl > 10:
				text = f"""AHTUNG!!!
				Название товара: {name}
				Цена автопродажи: {sell[0]} TL
				Минимальная цена у продавцов: {buy} TL
				Количество покупателей: {sell[1]}
				Цена на маркете: {float(items[i]["price"])}
				Выгода: {sell[0] - price_tl}"""
				print(text)
			stop = True

proxies_list = []
f = open('proxy-scraper-master\\output.txt', 'r')
for line in f:
	proxies_list += [line.replace("\n", "")]

items = json.loads(requests.get("https://market.dota2.net/api/v2/prices/RUB.json").content)["items"]
for i in range(len(items)):
	Thread(target=listing, args=(i, items, proxies_list, val)).start()
	time.sleep(10)
  • Вопрос задан
  • 2938 просмотров
Решения вопроса 3
Viji
@Viji
Associate DevOps Engineer
Итак, те которые выдали 429 ответ, должны быть положены в буфер и перезапрошены !
Ответ написан
Комментировать
Нужен код чтобы понять в чем ошибка. От себя скажу, что обновляю цены 15000 предметов где-то за 10 минут на asyncio и проксях, так что в теории все должно работать. На каждый вызов через прокси используется пауза, тем самым ошибки 429 не встречаются.
Ответ написан
@justabit
Возможные проблемы:
1. Прокси не транспарентный (передаёт ваш ИП в заголовках)
2. Публичный прокси который так же используют 20000 других человек

Решение, использовать сторонние сервисы для получения цен.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы