Python, несколько потоков, выборка веб-страниц, загрузка веб-страниц
Я хочу, чтобы загружать веб-страницы на одном сайте. В моем файле "urls.txt" содержится 5000000 URL-адресов. Это около 300 миллионов. Как заставить многопоточность связывать эти URL-адреса и загружать эти веб-страницы? или Как пакет загружает эти веб-страницы?
мои идеи:
with open('urls.txt','r') as f:
for el in f:
##fetch these urls
или скрученный?
Есть ли для этого хорошее решение?
Ответы
Ответ 1
Если это не является частью более крупной программы, то notnoop идея использовать какой-то существующий инструмент для достижения этого довольно хороша. Если цикл оболочки, вызывающий wget, решает вашу проблему, это будет намного проще, чем что-либо, что связано с более специализированной разработкой программного обеспечения.
Однако, если вам нужно извлечь эти ресурсы как часть более крупной программы, то делать это с оболочкой может быть не идеальным. В этом случае я настоятельно рекомендую Twisted, что упростит параллельное выполнение многих запросов.
Несколько лет назад я написал пример того, как это сделать. Взгляните на http://jcalderone.livejournal.com/24285.html.
Ответ 2
Определенная загрузка веб-страниц 5M за один раз не является хорошей идеей, потому что вы сможете максимально использовать многие из них, включая пропускную способность сети и дескрипторы файлов ОС. Я бы пошел в партии 100-1000. Вы можете использовать urllib.urlopen для получения сокета, а затем просто прочитать() в нескольких потоках. Вы можете использовать select.select. Если это так, тогда перейдите и скачайте все 1000 сразу и распределите каждый дескриптор файла, который выбирает, возвращает, чтобы сказать 10 рабочих потоков. Если выбор не будет работать, ограничьте количество партий до 100 загрузок и используйте один поток для загрузки. Конечно, вы не должны запускать более 100 потоков, поскольку ваша ОС может взорваться или, по крайней мере, немного замедлить работу.
Ответ 3
Сначала проанализируйте файл и нажмите URL-адреса в очередь, затем создайте 5-10 рабочих потоков, чтобы вытащить URL-адреса из очереди и загрузить. Очередь - ваш друг с этим.
Ответ 4
A wget script, вероятно, простейший, но если вы ищете решение для сканирования с помощью python, посмотрите scrapy