Работа здесь , чтобы очистить АНИ сайт , который начинается с https://xxx.xxx.xxx/xxx/1.json
к https://xxx.xxx.xxx/xxx/1417749.json
и записать его точно MongoDB. Для этого у меня есть следующий код:
client = pymongo.MongoClient("mongodb://127.0.0.1:27017")
db = client["thread1"]
com = db["threadcol"]
start_time = time.time()
write_log = open("logging.log", "a")
min = 1
max = 1417749
for n in range(min, max):
response = requests.get("https:/xx.xxx.xxx/{}.json".format(str(n)))
if response.status_code == 200:
parsed = json.loads(response.text)
inserted = com.insert_one(parsed)
write_log.write(str(n) + "\t" + str(inserted) + "\n")
print(str(n) + "\t" + str(inserted) + "\n")
write_log.close()
Но это занимает много времени, чтобы сделать задачу. Вопрос в том, как я могу ускорить этот процесс.
python
mongodb
web-scraping
pymongo
Тек Натх
источник
источник
Ответы:
Asyncio также является решением, если вы не хотите использовать многопоточность
источник
Есть несколько вещей, которые вы могли бы сделать:
Параллельный код отсюда
Сроки из этого вопроса для многоразового подключения
источник
Вы можете улучшить свой код по двум аспектам:
Использование a
Session
, чтобы соединение не перестраивалось при каждом запросе и оставалось открытым;Использование параллелизма в вашем коде с
asyncio
;Посмотрите здесь https://pawelmhm.github.io/asyncio/python/aiohttp/2016/04/22/asyncio-aiohttp.html
источник
То, что вы, вероятно, ищете, это асинхронная очистка. Я бы порекомендовал вам создать несколько пакетов URL-адресов, то есть 5 URL-адресов (постарайтесь не перебивать веб-сайт), и очищать их асинхронно. Если вы не знаете много об async, поищите в Google asyncio. Я надеюсь, что смогу помочь вам :)
источник
Попробуйте разделить запросы на части и использовать операцию массовой записи MongoDB.
Это может сэкономить много времени следующими способами: * Задержка записи MongoDB * Задержка синхронного сетевого вызова.
Но не увеличивайте количество параллельных запросов (размер чанка), это увеличит сетевую нагрузку на сервер, и сервер может подумать, что это DDoS-атака.
источник
Предполагая, что вы не будете заблокированы API и что нет ограничений по скорости, этот код должен сделать процесс в 50 раз быстрее (возможно, больше, потому что все запросы теперь отправляются с использованием одного и того же сеанса).
источник
У меня случился такой же вопрос много лет назад. Меня никогда не устраивают основанные на Python ответы, которые довольно медленные или слишком сложные. После того, как я переключаюсь на другие зрелые инструменты, скорость становится высокой, и я никогда не возвращаюсь.
В последнее время я использую такие шаги для ускорения процесса следующим образом.
aria2c -x16 -d ~/Downloads -i /path/to/urls.txt
для загрузки этих файловЭто самый быстрый процесс, который я когда-либо делал.
Что касается очистки веб-страниц, я даже загружаю необходимый * .html вместо того, чтобы посещать страницу по одному, что на самом деле не имеет значения. Когда вы нажимаете на страницу, с помощью таких инструментов Python, как
requests
илиscrapy
илиurllib
, она все равно кэшируется и загружает весь веб-контент для вас.источник
Сначала создайте список всех ссылок, потому что все они одинаковые, просто измените его.
Просто увеличивая или уменьшая t_no, вы можете изменить ни одного из потоков.
источник