2015-08-20 3 views
0

Таким образом, каждый второй я делаю кучу запросов к веб-X каждую секунду, как сейчас со стандартными urllib пакетами, как это (в requestreturns JSon):Повторное использование соединения HTTP Python 3

import urllib.request 
import threading, time 

def makerequests(): 
    request = urllib.request.Request('http://www.X.com/Y') 
    while True: 
     time.sleep(0.2) 
     response = urllib.request.urlopen(request) 
     data = json.loads(response.read().decode('utf-8')) 

for i in range(4): 
    t = threading.Thread(target=makerequests) 
    t.start() 

Однако, поскольку я делаю так много запросов после 500 запросов, сайт возвращает HTTPError 429: Too manyrequests. Я думал, что это может помочь, если я повторно использую исходное TCP-соединение, однако я заметил, что это невозможно сделать с помощью пакетов urllib.

Так что я сделал некоторые погуглите и обнаружил, что следующие пакеты могут помочь:

  • Requests
  • http.client
  • socket?

У меня есть вопрос: какой из них лучше всего подходит для моей ситуации, и может ли кто-нибудь показать пример одного из них (для Python 3)?

+4

Чтобы ответить на ваш вопрос, '' запрос' (вероятно) лучший - он обрабатывает автоматически. Однако на самом деле может помочь уменьшить количество запросов. – mhawke

+3

Если веб-сайт является запросом на ограничение скорости, повторное использование подключения tcp, вероятно, не будет работать. – Alasdair

+0

Я предполагаю, что администратор веб-сайта знает, что вы делаете и почему. Если цикл не повторяется, то один и тот же запрос можно рассматривать как атаку, а IP-адрес заканчивается черным списком. –

ответ

2

requests ручки keep alive автоматически если вы используете сеанс. Это может фактически не помочь вам, если на сервере установлены ограничения по скорости, однако requests также обрабатывает разбор JSON, поэтому это является хорошей причиной для его использования. Вот пример:

import requests 

s = requests.Session() 
while True: 
    time.sleep(0.2) 
    response = s.get('http://www.X.com/y') 
    data = response.json() 
Смежные вопросы