Python, многопоточность, загрузка веб-страниц, загрузка веб-страниц - PullRequest
5 голосов
/ 25 января 2010

Я хочу пакетно загрузить веб-страницы на одном сайте. В моем файле 'urls.txt' есть 5000000 ссылок. Это около 300М. Как заставить многопоточность связать эти URL-адреса и загрузить эти веб-страницы? или Как пакетно загрузить эти веб-страницы?

мои идеи:

with open('urls.txt','r') as f:
    for el in f:
        ##fetch these urls

или витая?

Есть ли хорошее решение для этого?

Ответы [ 4 ]

3 голосов
/ 25 января 2010

Если это не является частью более крупной программы, то идея notnoop об использовании какого-либо существующего инструмента для достижения этой цели является довольно хорошей. Если цикл оболочки, вызывающий wget, решит вашу проблему, это будет намного проще, чем что-либо, связанное с разработкой специального программного обеспечения.

Однако, если вам нужно извлечь эти ресурсы как часть более крупной программы, то выполнение этого с оболочкой может быть не идеальным. В этом случае я настоятельно рекомендую Twisted, что облегчит параллельное выполнение многих запросов.

Несколько лет назад я написал пример того, как это сделать. Взгляните на http://jcalderone.livejournal.com/24285.html.

1 голос
/ 26 января 2010

Сначала проанализируйте ваш файл и поместите URL-адреса в очередь, затем создайте 5-10 рабочих потоков, чтобы извлечь URL-адреса из очереди и загрузить. Очередь твой друг с этим.

1 голос
/ 25 января 2010

Однозначно скачивать 5M веб-страниц за один раз - не очень хорошая идея, потому что вы сможете максимально использовать множество возможностей, включая пропускную способность сети и файловые дескрипторы вашей ОС. Я бы пошел партиями по 100-1000. Вы можете использовать urllib.urlopen, чтобы получить сокет, а затем просто прочитать () в нескольких потоках. Вы можете использовать select.select. Если это так, тогда загрузите все 1000 сразу и раздайте каждый дескриптор файла, который выбирает, возвращая, скажем, 10 рабочих потоков. Если выбор не сработает, ограничьте количество загрузок до 100 загрузок и используйте один поток для каждой загрузки. Конечно, вы не должны запускать более 100 потоков, так как ваша ОС может взорваться или, по крайней мере, работать медленно.

0 голосов
/ 26 января 2010

Сценарий wget, вероятно, является самым простым, но если вы ищете решение для обхода с помощью python-twisted, посмотрите scrapy

...