Я пытаюсь загрузить файл /home.htm, содержащий около 6000 http-адресов.Для скорости я попытался использовать греквесты, чтобы отправить их все сразу, но я получаю только около 200 ответов, большинство из которых выдает ошибку «отказано в соединении».Когда я разделяю адреса на куски по 100, а затем отправляю каждый отдельный блок, около 1200 адресов отвечают мне (= загрузка их /home.htm прошла успешно), даже если я использую те же адреса, что и раньше.
Я запускаю его с Python3.6 в Ubuntu 16.04.
import grequests
import requests
import sys
import os
import resource
# Counts exceptions and prints them
def exceptionh(request, exception):
...
# Yields succesive n-sized chunks
def make_chunks(req, n):
for i in range(0, len(req), n):
yield req[i:i+n]
def run(ipport):
# Make http links
http_links = []
for ip in ipport:
http_links.append('http://' + ip.strip() + '/home.htm')
# changing limit, without it there are too many Errno24 Exceptions
resource.setrlimit(resource.RLIMIT_NOFILE, (131072, 131072))
# Request making
rq = []
ctr = 0
for link in http_links:
rq.append(grequests.get(link, timeout=30, headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36'}, stream=False))
ctr += 1
rq = list(make_chunks(rq, 100))
# Send requests
results = []
for chunk in rq:
results.append(grequests.map(chunk, exception_handler=exceptionh))
# Save .html
for chunk in results:
for response in chunk:
if response is not None:
# write it in html file
Как я уже говорил выше, результаты отличаются.Когда я отправляю запросы порциями, я получаю больше результатов, чем когда отправляю все сразу.Это почему?Есть ли лучший подход к этой проблеме?