LINUX.ORG.RU

TOR, распараллеливание питона и другие вопросы

 , ,


0

3

Привет всем!

Есть скриптик на python 3, он ходит по сайтам через TOR, скачивает отдельные странички, парсит и собирает полезные ссылки на ресурсы.
Через n запросов тор перезапускается (в будущем планируется дописать общение с тором по tcp) для создания новой цепочки.

Через тор он ходит вот так:

socks.set_default_proxy(socks.SOCKS5, "127.0.0.1",9050)
socket.socket = socks.socksocket

Для получения контента используется httplib2, парсится полученное безобразие с помощью BeautifulSoup.

Вопрос первый:
Довольно часто случается исключение IncompleteRead, а если тор не использовать, то не случается. Как правильно готовить питона под соусом из тора? Сейчас проблема решается множеством повторений запросов.

Вопрос второй:
Посоветуйте, чего почитать про распараллеливание для такой связки, какую библиотеку использовать. Запросы к сайтам могут висеть достаточно долго, зависит от сайтов, тора и погоды на Марсе. Конечные ссылки собираются в несколько этапов: стянуть с сайта страничку со ссылками верхнего уровня (разделы), отобрать чего надо, повторить n раз, получить конечные ссылки на ресурсы. Также в планах есть проверка конечных ссылок с помощью некоторой софтины на локальном хосте, т.е. через запросы http://127.0.0.1/chechGrabbedURLPlease?url=<url>
В итоге получается три списка, которые могут обрабатываться параллельно:
1. Список запросов к сайтам верхнего уровня.
2. Список запросов к 127.0.0.1 для проверки.
3. Список проверенных ссылок для записи в файл.

UPD
Ах, да... Забыл написать, что было бы неплохо использовать несколько торов одновременно (на разных портах). И, в связи с этим, насколько я понимаю, используемый код для работы с тором не подойдет, т.к. это изменения на весь процесс, а надо на поток. Чем его заменить?

★★★★★

Параллелить удобно с asyncio. Мне лень гуглить, как пустить asyncio через socks, но на крайний случай всегда есть tsocks.

x3al ★★★★★ ()

Используй не потоки, а процессы тогда, пока хватает памяти. Потоки нетривиальны из-за GIL и местами очень странного шедулинга. Сейчас уже не вспомню, но были проблемы с просыпанием в сетевом коде именно из-за потоков - когда переделал на процессы, стало лучше.

Еще попробуй юзать select (он в одноименном модуле), по идее он должен работать норм и с тором.

lu4nik ★★★ ()
Ответ на: комментарий от lu4nik

Используй не потоки, а процессы тогда

А через чего между ними организовать двунаправленное общение? И как-то надо пасти стадо воркеров, раздавать им урлы на скачку. С чего начать?

ls-h ★★★★★ ()
Ответ на: комментарий от x3al

tsocks заставит работать

Так это тоже будет один тор на процесс. А мне бы хотелось один тор на поток или n торов, m потоков. Тор ведь вносит ощутимую задержку. Я в апдейте об этом написал.

ls-h ★★★★★ ()

для настоящей параллельности - mpi4py

silw ★★★★★ ()
Ответ на: комментарий от ls-h

Можно и в несколько процессов, у тебя же tor'ов меньше, чем предполагаемых параллельных закачек, не?

x3al ★★★★★ ()
Ответ на: комментарий от ls-h

Как мне кажется, проще всего создать одну очередь (multiprocessing.Queue), в которую процесс-диспетчер будет сбрасывать урлы, которые будут разбираться по мере поступления воркерами. Сигнал на выключение можно подать через ту же очередь. Почитай про пайпы и очереди на странице модуля multiprocessing.

UPD: Если надо в обратную сторону (от воркеров к диспетчеру) передавать данные, то наверн это +1 очередь.

lu4nik ★★★ ()
Последнее исправление: lu4nik (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.