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