Pull to refresh

Comments 16

Просто и подробно о сложном — это о статье

Статья интересна, спасибо. Прошу рассмотреть парсинг сайтов с использованием lxml, urlib3 и pyparcing.

А потом банят на неделю за слишком большую частоту запросов.

На данном сайте нет защиты по IP. Но если вас это беспокоит IP-сервера можете найти в моей статье здесь.
для каждого пула можно заюзать прокси + паузы в потоках, что бы не попасть под бан. Если сайт еще работает на ipv6, то покупаешь 100шт за 50 рублей и радуешься.

Для многопоточного парсинга я бы рекомендовал Scrapy. У нее внутри twisted, код будет менее многословным, чем кастомное решение на bs4 и шататных питоновских возможностях работы с потоками/процессами. К тому же работа с разметкой там гораздо лаконичнее. Как-то на работе появилась задача напистать скрипт для периодического парсинга примерно 20 ресурсов на предмет упоминаний о компании клиента. Со scrapy получилось уложиться в несколько часов.


И позвольте на минуту включить зануду и немного покритиковать оформление кода. У вас импорты не по PEP8 оформлены. В кучу смешаны вендорные пакеты и встроеные. В функции get_all_links зачем-то идут строки очистки файла, но, судя по названию, её задача — вытащить ссылки с главной страницы. Принцип одной отвественности говорит, что котлеты с рыбой смешивать не нужно. Да и все ссылки на сайты, имена файлов и подобное хорошо бы вынести вверх скрипта в константы. Если захотите сохранять результаты не в coin.csv, а в foobar.csv, то придется править код в двух местах. В небольшом скрипте такое, конечно, не критично, но в реальных прикладных проектах может сэкономить время и нервы коллег, поддерживающих ваш код

А за что минус? Почитайте, что ли, как twisted работает и что такое асинхронность. Scrapy работает в одном процессе, в одном потоке.


Ну, при желании можно запускать много отдельных процессов с помощью Scrapyd или распределённый краулинг в Scrapy Cluster, но сам Scrapy — однопоточный.

  1. Зачем вам многопоточность? Я не верю, что вы упираетесь в CPU.
  2. Почему вы пишете про многопоточность, но в коде используете multiprocessing?
  3. Зачем писать это всё самому, когда есть Scrapy (как уже заметил комментатор выше)?
Не про питон, но по поводу парсинга сайтов: Make Collection. Из плюсов: можно качать на выбор картинки, видео, текст, звук. И есть возможность генерировать имена файлов используя окружение. Ну и до кучи — экспорт в SQLite.
Более ужасно нечитаемого кода еще поискать.
Везет вам на питоне, я вот на node.js недавно парсер писал, так там обратная история, пришлось заморачиваться чтобы ограничить число потоков так как сервера не успевали отдать всю информацию и умирали от таймаута из за чего данные получались битыми =(
Увы, плодить потоки проще и дешевле процессов. А с потоками у Python «проблема». В итоге сделать так, чтобы работало быстро можно, но не просто и не так лаконично, как в примерах выше. А пот Windows так и вообще фантастика. Хотя, я мог пропустить некий переломный момент произошедший с момента выхода Python 3.4.

2017 год… А люди до сих пор используют блокирующий I/O для работы с сетью и плодят потоки, чтобы ждать ответа от сервера.

*и плодят потоки, чтобы не ждать ответа от сервера.

Не делайте так никогда
massiv_price = [pn.find('b').text for pn in soup.find('div', class_ = 'wm_exchange').find_all('a', class_ = 'button', target = False)]+[pr.text for pr in soup.find('div', class_ = 'wm_exchange').find_all('td', class_ = 'amount')]

А еще лучше прогоните код через Flake
Sign up to leave a comment.

Articles