Запросы Python раздражающе медленно - PullRequest
0 голосов
/ 24 октября 2019

Я сделал программу для поиска доступных / id / в Steam по запросам, но это занимает очень много времени. Если кто-нибудь знает какой-либо способ сделать запросы быстрее, пожалуйста, сообщите мне об этом.



w = open("not taken.txt", "a")
f = open("og_users.txt", "r")

def is_steam_customurl_taken(id):
    r = requests.get("https://steamcommunity.com/id/%s" % id)
    if ("The specified profile could not be found.".lower() in r.text.lower()):
        return False
    return True

lines = f.readlines()
for line in lines:
    username = line.strip()
    if is_steam_customurl_taken(username):
        print("%s is taken" % username)
    if not is_steam_customurl_taken(username):
        w.write(username)
        w.write("\n")
        print("%s is not taken" % username)
w.close()
f.close()

Ответы [ 2 ]

2 голосов
/ 24 октября 2019

Ваши узкие места здесь, в основном, две вещи:

  • сеть
  • тот факт, что вы обрабатываете имена пользователей одно за другим синхронно, блокирующим образом . Другими словами, вы не обрабатываете следующее имя пользователя, пока не закончите с текущим.

Есть несколько простых побед, которые вы можете получить, чтобы улучшить свой текущий «синхронный» подход:

  • создать экземпляр requests.Session() и повторно использовать его для сетевых запросов. Это должно значительно ускорить процесс, поскольку вы делаете запросы на один и тот же хост:

    , если вы делаете несколько запросов на один и тот же хост, базовое TCP-соединение будет использовано повторно, что может привести кзначительное повышение производительности

  • не вызывайте is_steam_customurl_taken() дважды за одну строку. Сделайте это один раз и запомните результат в переменную:

    is_taken = is_steam_customurl_taken(username)
    if is_taken:
        print("%s is taken" % username)
    else:
        w.write(username + "\n")
        print("%s is not taken" % username)
    

Что касается асинхронности и неблокирования, вы можете посмотреть на такие пакеты, как grequests или Scrapy, что позволит вам не ждать в сети и обрабатывать больше имен пользователей одновременно.

1 голос
/ 24 октября 2019

Если у вас есть идентификаторы Steam, ознакомьтесь с информацией о получении ключа Steam Web API и используйте соответствующий API (на некоторых сайтах предусмотрены меры по обнаружению и блокировке веб-скребков). Их API имеет конечную точку игроков , которая позволяет вам отправлять 100 идентификаторов на запрос.

Если у вас есть только имена, попробуйте использовать xml=1 параметр запроса (например, * 1009). * для более легкого ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...