Быстрый парсинг данных с сайта несколькими процессами с экспортом в csv на Python 3

Поделиться
HTML-код
  • Опубликовано: 21 дек 2024

Комментарии • 360

  • @RRaijin
    @RRaijin 6 лет назад +6

    Шикарно! Огромнейшая благодарность, особенно за то, как Вы подаете материал! Важные вещи и все всегда отлично работает.

    • @zaemiel
      @zaemiel  6 лет назад

      Спасибо, рад, что материал был вам полезен

  • @elenak.8368
    @elenak.8368 8 лет назад +3

    Олег, спасибо Вам ещё раз за видео! Все очень доступно и понятно

    • @zaemiel
      @zaemiel  8 лет назад

      Всегда, пожалуйста.
      Спасибо вам за вопрос

  • @xvostov_k
    @xvostov_k 3 года назад +2

    Спасибо, лишний раз убеждаюсь, что вы один из топ авторов по python рунета. Все четко и понятно.

  • @vovayaax111
    @vovayaax111 7 лет назад +4

    офигенное видео. Пока лучшее, что видел по пайтону

    • @zaemiel
      @zaemiel  7 лет назад +1

      Спасибо

  • @Роман-ч3х5е
    @Роман-ч3х5е 6 лет назад +1

    НЕРЕАЛЬНО ОБАЛДЕННОЕ ВИДЕО! ОЛЕГ, ОГРОМНОЕ СПАСИБО! ВСЕ ЧТО Я НАМАТЫВАЛ НА УС ДО ПРОСМОТРА ЭТОГО РОЛИКА ПРОСТО РАЗЬЯСНИЛОСЬ, ПРИЯТНО СЛУШАТЬ ГРАМОТНОГО И ЗНАЮЩЕГО СВОЕ ДЕЛО ЧЕЛОВЕКА!

  • @MrYoklmn
    @MrYoklmn 6 лет назад +4

    Ну какое же офигенное видео! Просто супер) спасибо!
    С удовольствием посмотрел полностью и очень удивился, что мультипроцессинг был только в самом конце и совсем немного) но все равно круто!

    • @zaemiel
      @zaemiel  6 лет назад

      Спасибо

    • @MrYoklmn
      @MrYoklmn 6 лет назад

      Олег Молчанов по вашему уроку запустил свой парсер в многопоточном режиме. По началу работает шустро и прекрасно. Но потом скорость падает до скорости в однопоточном режиме. Есть ли адекватны й способ мониторить потоки и понимать, какой реально что то делает, а какой просто завис(например из-за ошибки в программе).

  • @eclipseGhostZ
    @eclipseGhostZ 5 лет назад +11

    Топ фраза автора: "Мы будем парсить этот несчастный сайт 40 процессами".

  • @Vanteyable
    @Vanteyable 7 лет назад +5

    top3 туториалов на ютюбе! тебе надо на udemy выкладываться с таким качеством контента!

  • @yodapunishes
    @yodapunishes 5 лет назад

    после видосов по Scrapy я думал, что ещё полгода буду учиться, прежде чем напишу хоть какой-нибудь парсер. Не думал, что это так просто и быстро можно сделать. Спасибо!

  • @ЕгорСмирнов-ь8ъ
    @ЕгорСмирнов-ь8ъ 5 лет назад +1

    Хорошая подборка видео,да с криптой надо поковыряться,сменилась верстка и появилась защита,посмотрев все видео автора про парсинг(опытпрограммирования три мес)-скрестил проги из этого видео и урока с проксями, задержкой и юзерагентами- если в один поток 2370 пунктов парсит примерно за 3ч 20м, если поставить пул 100 то за 1ч 30(оперативки мало-на один процесс уходит 12мб).Не знаю быстро это или нет,но все работает за что автору большое спасибо, оформлю платную подписку)

    • @danilv2001
      @danilv2001 5 лет назад

      Егор Смирнов братан можешь ссылку дать на соц сеть или как с тобой связаться ?(вопрос с проксями)

  • @Dmitriy_Sentinel
    @Dmitriy_Sentinel 4 года назад

    Лайк и безумное уважение за объяснение (26:57) подобных вещей!
    Серьезно, мелочь но очень очень полезно для новичка и показывает уважение автора канала к его зрителям. Мало кто даже сейчас так делает... и это печально.

  • @NMelis
    @NMelis 8 лет назад +1

    приятно смотреть ваши виде-уроки)), на 1.25 ускорением смотрю)

  • @АлексейСмолов-ш2ь
    @АлексейСмолов-ш2ь 4 года назад +2

    лучшее, как по мне, объяснение нюансов парсинга. если бы еще асинхронный код для этого рассмотреть...

    • @yuzeless
      @yuzeless 3 года назад

      Зачем тут асинхронность? Мне кажется ты просто не до конца понимаешь что это такое)

  • @abenderbey
    @abenderbey 7 лет назад +14

    Биткоин по 700 баксов, как давно это было)

  • @me2beats313
    @me2beats313 6 лет назад +3

    450-й лайк мой
    попутно подписка)
    Все четко и понятно

  • @youssr5302
    @youssr5302 5 лет назад

    Очень доходчиво. Учитывая, что у меня уровень знаний в питоне - Хелло ворлд, я смог во всем разобраться и перенастроить скрипт на текущее состояние страницы.

  • @user-sv4zm5jc2g
    @user-sv4zm5jc2g 7 лет назад +1

    Спасибо большое ! Шикарно как всегда !

    • @zaemiel
      @zaemiel  7 лет назад +2

      Спасибо

  • @hnariman_
    @hnariman_ 5 лет назад

    Отличное видео, подача, голос, код и комментарии (в смысле документация) все отлично. Сразу подписался. Особенно помогли с мультизадачностью, как раз для моего проекта с автоматизацией очень пригодится. Ждём новые видео. Удачи!

  • @smeshnajapolli
    @smeshnajapolli 7 лет назад +1

    СПАСИБО. УЧУСЬ НА ВАШИХ УРОКАХ. ВСЕМ СТАВИМ LIKE И КОММЕНТ

  • @faStwOw4ik
    @faStwOw4ik 8 лет назад +1

    Отлично объясняете, спасибо за видео :)

    • @zaemiel
      @zaemiel  8 лет назад

      Спасибо

    • @NMelis
      @NMelis 8 лет назад

      слушай а чем хуже потоки?, почему ты выбрал именно процессамми?

    • @zaemiel
      @zaemiel  8 лет назад

      в данной ситуации у процессов только один недостаток - это потребление памяти и сравнительно медленный запуск (на Windows это более ощутимо), но в остальном применительно к данной конкретной задаче разницы нет.
      Ведь использование потоков или процессов в большей степени зависит от конкретной задачи. А здесь - не нужна параллельность вычислений, общих данных у процессов нет, задачи сэкономить потребления ресурсов тоже не было... как-то так.
      Такую обработку процессов написать очень просто, наверное, поэтому взял процессы

    • @NMelis
      @NMelis 8 лет назад

      Олег Молчанов понятно)

  • @ДмитрийКотик-е1е
    @ДмитрийКотик-е1е 7 лет назад

    ЗА-ме-ча-тель-но! Мне очень понравилось. Всё чётко, понятно, без лишней информации

  • @nikmarkiz1416
    @nikmarkiz1416 4 года назад +2

    медленно но понятно! ты красавчик пирожочек ты наш :)

  • @sergeisumarokov
    @sergeisumarokov 8 лет назад

    Спасибо за отличный и подробный разбор!

    • @zaemiel
      @zaemiel  8 лет назад

      Спасибо

  • @avaaren2854
    @avaaren2854 4 года назад +2

    Делал что то похожее, только парсил не 700 а 20к страниц. Упарывался в потоки, ничего не получалось. Посмотрел видосик, отрефакторил код, применил процессы и все заработало. Автору респект х20к )))

    • @eugenefedoryachenko8793
      @eugenefedoryachenko8793 4 года назад

      о, я щас буду парсить 1700 000 страниц))

    • @ИгорьСоболев-п4й
      @ИгорьСоболев-п4й 4 года назад

      я вот щас тоже пытаюсь , но чет скорости на потоке нету. Потом как парсить динамические данные кто что знает, щас использую Selenium, но что то медленно.

    • @eugenefedoryachenko8793
      @eugenefedoryachenko8793 4 года назад

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

    • @ИгорьСоболев-п4й
      @ИгорьСоболев-п4й 4 года назад

      @@eugenefedoryachenko8793 мне нужны данные изменяющиеся динамически AJAX-ом как это по другому сделать?

    • @eugenefedoryachenko8793
      @eugenefedoryachenko8793 4 года назад

      @@ИгорьСоболев-п4й можно делать запросы к ajxa через scrapy. Но у селентиума есть веб драйвер который может рендерить js без браузера. Ты его так и используешь? Или нет?

  • @Ilushkoo123
    @Ilushkoo123 6 лет назад +1

    Спасибо большое за видео! Очень полезно и все понятно разжевано !

  • @heyter1579
    @heyter1579 4 года назад +7

    если у кого-то появились проблемы с парсингом, а именно в линкс не помещаются ссылки, то надо самому заходить в сайт, и искать классы, видео старое, поэтому на сайте может измениться всё, я сам порыскал id и class, короче внизу обновленный код:
    tds = soup.find('tbody').find_all('tr', class_ = 'cmc-table-row')

    • @OleksiiLysenko-b2w
      @OleksiiLysenko-b2w 3 года назад +2

      а чуть ниже через две строчки сразу в цикле исправить на a = td.find('a', class_='cmc-link').get('href')

  • @sledleo
    @sledleo 7 лет назад +1

    Отлично! Понятно все! Как раз для чайников!

  • @InfoVideoCenter
    @InfoVideoCenter 5 лет назад

    Огромная благодарность за пример. Я не знаю языка python, только Object pascal. Но данный пример помог понять общие принципы языка , создания функций и парсинга.

  • @advkov
    @advkov 2 года назад +1

    Привет! Очень понятное объяснение. Запиши пожалуйста видео по работе с Excel с помощью python

  • @evgeniydoronin
    @evgeniydoronin 6 лет назад

    Олег, добрый вечер! Спасибо за отличные уроки!

  • @vangog63
    @vangog63 7 лет назад +4

    Спасибо за видео!
    При использовании модуля multiprocessing как работает запись в csv файл? Почему не возникает ошибки одновременной записи в файл? Спасибо

  • @itkrasnodar956
    @itkrasnodar956 4 года назад

    Олег, спасибо, очень все подробно и понятно рассказываешь, ставлю палец вверх, становлюсь подписчиком )))

  • @vitalykholodov947
    @vitalykholodov947 7 лет назад +1

    Небольшая идея для монетизации Вашего труда: заливайте проекты на bitbucker и сделайте продажу инвайтов в проект (микромагазин с онлайн оплатой), что означает доступ к исходному коду, либо просто питоновский файл с кодом продавать, если проект небольшой. Я когда-то проходил этот урок, но исходников у меня не осталось, сейчас мне нужно потратить время, просмотреть все видео, найти нужные мне моменты, делать паузы, чтобы вникнуть в код. Короче гемморой и куча времени. Был бы у меня исходник, я бы быстро просмотрел его, просмотрел видео в нужных местах и начал бы внедрять в свой проект. А если у Вас будут целые курсы, по Django, например и т.д. где подразумевается более или менее большие проекты, так это вообще необходимость!

    • @zaemiel
      @zaemiel  7 лет назад +2

      Спасибо за совет.
      Думаю, что я сделаю такое

  • @mittenwald3679
    @mittenwald3679 3 года назад

    rabotu tscheres functions() sdorowo i ponjatno objasnils, sps !

  • @АндрейСерохвостов-ж1о

    Отличная подача материала, просьба давайте текст программы хотя бы ссылкой на github

  • @batukaraev513
    @batukaraev513 6 лет назад

    Однозначно подписка, спасибо, очень доступно

  • @Smartd88
    @Smartd88 7 лет назад

    Можно еще короткий урок по модулю multiprocessing? Там есть вроде что-то встроеное, что само определяет, сколько можно процессов создать.

  • @alexandrasuleymanova5653
    @alexandrasuleymanova5653 7 лет назад

    Толковое видел, спасибо))

  • @VladislavFinogeev
    @VladislavFinogeev 5 лет назад +2

    Сайт немного обновили. Изменилось название и адрес основной страницы, на сайт поставили защиту от большого количества запросов. Но всё это можно исправить, посмотрев видео. Смог спарсить только 2-мя потоками с использованием time.sleep. Спасибо большое за видео!
    pastebin.com/ZHr5LLMN -так можно поменять первые две функции, если совсем ничего не ищется.

    • @xopekyt8224
      @xopekyt8224 5 лет назад +1

      сколько секунд ставил задержку по времени?

    • @ivanbednyakov1852
      @ivanbednyakov1852 5 лет назад

      Please turn JavaScript on and reload the page. ? -защита это ?

    • @xopekyt8224
      @xopekyt8224 5 лет назад

      @@ivanbednyakov1852 какая защита?

  • @alanjones2770
    @alanjones2770 5 лет назад +2

    print(index, end='. ')
    write_csv(data)

  • @artem88able
    @artem88able 3 года назад +3

    Привет Олег! Спасибо за интересные и качественные уроки!
    А почему бы тебе на сделать материал по Scrapy? Было бы здорово. А вообще было бы круто, если выпустишь курс по данной теме. Сейчас это очень актуально. Я бы сразу купил!

  • @gudvin2001
    @gudvin2001 7 лет назад +1

    Привет, очень хорошо показываешь. Начал недавно изучать python и вот сталкнулся с достаточно распространенной задачей, мультипотоковый парсинг в частности. Есть сайт, но он блокирует если частота обращений слишком высокая, его можно парсить, только залогинившись. Для этого можно создать несколко аккаунтов и использовать session и proxy
    Я сделал с использованием модулей treaading и requests, но потом выяснил, что requests подклюяается в одном потоке. Накопал , что есть некий модуль grequests, но по нему мало примеров. Сейчас такой вопрос, что если нужно из 10000 страниц, найти ту страницу на которой, например есть секретное слово, после чего остановить все потоки, чтоб зря не тратить время и распечатать , как передовать свои параметры в каждый поток? Былоб круто если б сделал такой туториал с объяснениями, все остальное былоб производным от него.

  • @IT_psychopath
    @IT_psychopath Год назад

    Олег молодец. не устаю пересматривать его видео. надо освежить память по python? значит к Олегу надо идти.)))
    за дидосил бедный сайтик. может канал свой забил, я про интернет. он тоже имеет свою пропускную способность. или то и другое + проц. окуратнее с процессами ребят, а то ПК спалите..😂 linux мог с дуру в swap пихнуть или не успевать кеш менять. такие приколы иногда бывают. или реально дидостнул сайт и пока там поднялся еще процесс уже все повисло.🤣мы делали 1к асинков на один сайтик, бан мгновенный.🤣

  • @Krasnolesye
    @Krasnolesye 3 года назад

    классс! главное Доходчиво!!!
    СПАСИБО!!!

  • @Dmitrii-Kalashnikov
    @Dmitrii-Kalashnikov 6 лет назад +3

    Олег, отличный урок! Очень интересно и как всегда детально, я больше и лучше стал понимать язык python именно на таких рабочих примерах. Правда в данном примере у меня возник странный трабл: сегодня на сайте на данный момент 2085 различных валют, после парсинга в таблицу записывается примерно подрят 49 а дальше через один и после 126 примерно вовсе пусто. Это банят так ? Или ошибка другого плана?

    • @zaemiel
      @zaemiel  6 лет назад

      Я не могу ничего определенного сказать

  • @NikolaTeslaIsGreat
    @NikolaTeslaIsGreat 2 года назад +2

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

  • @denzelkoshuba5702
    @denzelkoshuba5702 4 года назад +1

    Вы все конечно молодцы. Но я пока что не встречал человека, который объяснял бы решение вопроса с позиции того, кто только пытается что-то понять. Все объясняют с позиции, как будто вокруг все уже в курсе почти всего, о чём идёт речь.
    Почитайте очень хорошую книгу. "Исскуство объяснять". Очень хорошая и полезная книга. Я по ней своего ребёнка учу жизни.

    • @ВиталийГорбачёв-ю8в
      @ВиталийГорбачёв-ю8в 4 года назад +4

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

    • @denzelkoshuba5702
      @denzelkoshuba5702 4 года назад +1

      @@ВиталийГорбачёв-ю8в, если я изучу всё то, что Вы перечислили, то в просмотре видео Олега у меня не будет необходимости))). В данной ситуации, я нашёл это видео, чтобы решить конкретную задачу, без получения знаний. Был готов полностью повторить все действия. Пошагово. Есть хорошая поговорка:
      *Расскажи мне как это делать - я ничего не пойму.
      Покажи как это делать - мне станет понятно о чём речь.
      Давай сделаем это вместе - следующий раз я сделаю это сам.*
      Но как и в предыдущих видео по этой теме, я в определенный момент столкнулся с вопросом, который автор считает не важным. Настолько, что даже внимание на это не обращает. А для меня и таких как я - это СТОП. Дальше нет смысла смотреть, потому что необходимо искать ответ на вопрос, которому автор видео не уделил внимание. И поплыл дальше в глубину интернета и Ютуба))).
      Я не зря написал про книгу "Исскуство объяснять". Всё, что вы знаете и хотите кому-то объяснить необходимо привести в такой вид, чтобы это поняли как можно больше людей. С разными уровнями знания. Тогда вас ждёт успех.
      P.S. на вопрос ребёнка откуда берётся дождь, можно ответить по разному. И про конденсат и о разном состоянии воды и т.д. Но он не поймёт))) А если привести пример с чайником из которого идёт пар и поднимается вверх, а после капельками падает вниз. То поймёте не только ребёнок, но и все кому и первый вариант объяснения не подходит, в силу наличия знаний.

    • @ИгорьСоболев-п4й
      @ИгорьСоболев-п4й 4 года назад +1

      @@denzelkoshuba5702 Ваше желание понятно, но к сожалению не возможно взять и в один момент все понять это приходит только с опытом и практикой. А объяснять это придется очень долго, даже если очень стараться.

    • @АлексД-о3ю
      @АлексД-о3ю 4 года назад +5

      @@denzelkoshuba5702 а вы попробуйте объяснить ребенку как решать дифференциальные уравнения, а не откуда берется дождь. Это примерно тоже самое. Хотели без основ решить задачу уровнем повыше вот вам и результат. Если опускаться в уроке до разбора элементарного синтаксиса, на это уйдет несколько часов и появятся другие недовольные. Объяснение вполне адекватное, сравните с другими горе учителями в сети

  • @alishamsoglu2010
    @alishamsoglu2010 7 лет назад

    Олег, в первую очередь огромное спасибо! Все очень интересно и полезно, много чего узнал нового
    у меня также есть к вам вопрос - вы продемонстрировали парсинг на примере "View All", что следовало бы изменить в скрипте в случае если бы этой опции не было бы (как это часто бывает на других страницах) и нам пришлось бы обратиться к "Next 100" если говорить на примере этого же сайта

    • @alishamsoglu2010
      @alishamsoglu2010 7 лет назад

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

    • @zaemiel
      @zaemiel  7 лет назад

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

  • @АзатШарипов-д9й
    @АзатШарипов-д9й 4 года назад

    Спасибо тебе за видео!

  • @ChannelMWC
    @ChannelMWC 6 лет назад +3

    Огромное спасибо. Не понял только почему у меня в этой табличке нет значений? Или всего несколько названий и все? Код в точности такой же, также сверялся с сайтом -ничего не поменялось. В чем может быть проблема?

    • @zaemiel
      @zaemiel  6 лет назад +1

      проблема в том, что вы где-то ошиблись.

    • @Простовидео-з5т
      @Простовидео-з5т 6 лет назад +1

      У меня такая же хрень. До 37-40 нормально, а потом пустые значения... Банят значит))

    • @zaemiel
      @zaemiel  6 лет назад

      не факт, что у него такая же проблема.

  • @dessan7167
    @dessan7167 6 лет назад +2

    чтоб это всё работало нужно ещё lxml библиотеку иметь pip install lxml

  • @accidiet
    @accidiet 6 лет назад

    АЙ как все хорошо ,,,, ммм ,,, просто волшебно ,,, я счастлив ,,, БЛАГОДАРЮ

  • @devZu9
    @devZu9 7 лет назад

    Олег видео шикарно. Понятно и главное доступно. Вопрос а возможно ли каждый процесс допустим через проксю пустить? На много код увеличится?

    • @zaemiel
      @zaemiel  7 лет назад

      Есть видео по использованию прокси.
      Код практически не отличается, т.к. просто запрос к серверу идет через прокси.

  • @overparser
    @overparser 5 лет назад +3

    на сайте ддос защита висит теперь. Целое утро искал способ обойти cloudflare, у меня ни один не сработал. Единственный способ который я нашел это парсить примерно раз в 5 сек в одном потоке.

  • @esthetik_life
    @esthetik_life 6 лет назад

    спасибо за урок ! лайк

  • @0rendl050
    @0rendl050 Год назад

    37:54 тут начинается жара)

  • @baldinma7663
    @baldinma7663 4 года назад +1

    Спасибо!

  • @free115
    @free115 4 года назад

    Пересмотрел почти все видео, всё отлично. Не хватает чуть-чуть, а именно рассмотреть архитектуру. На пример патерны. Но не хочется смотреть пустые примеры, а вот на примере парсеров на мой взгляд было бы круто. И полезно, и приятно.

    • @free115
      @free115 4 года назад

      ​@@vyacheslav_kapitonov Делаешь полный цыкл парсинга для одного аккаунта, с авторизацией. И уже этот готовый парсер запускаешь в нескольких процессах.

    • @free115
      @free115 4 года назад

      @@vyacheslav_kapitonov ограничение запросов в секунду - sleep(random.randint(2,5))
      Несколько аккаунтов - добавить разный прокси на каждый аккаунт

    • @free115
      @free115 4 года назад

      @@vyacheslav_kapitonov Ну так заходи под вторым аккаунтом

    • @free115
      @free115 4 года назад +3

      @@vyacheslav_kapitonov Вы на меня тратите время? Зачем вы вообще ко мне обращались? А вообще у вас неправильное понимание процесса парсинга. На каждый процесс, один аккаунт, один прокси. На другой процесс другой аккаунт и так далее.

  • @yurikfirst
    @yurikfirst 4 года назад +1

    Здравствуйте, Олег! Спасибо вам за ваши уроки! Но как быть, если надо скачать картинки и сохранить их в соответствующую папку, путь к которой будет указан в колонке images, в файла csv ? Спасибо, буду благодарен!

  • @Leaf.
    @Leaf. 4 года назад +3

    я думаю для этого лучше нужно использовать aiohttp

  • @derekt9363
    @derekt9363 4 года назад

    спасибо за хороший урок !!

  • @Перспектива-ы3в
    @Перспектива-ы3в 4 года назад +4

    Вопрос: как найти таблицу, у которой нету класса или id?( Почему-то, если просто указать как аргумент только 'table', не находится((

    • @johnyrden8861
      @johnyrden8861 4 года назад

      Прописать путь через xpath

  • @amanovt
    @amanovt 3 года назад

    В конце вообще топ

  • @seserere4591
    @seserere4591 4 года назад +4

    кто нибудь может суинуть актуальную версию кода:
    tds = soup.find('div', class_=' ') и тд

  • @ЛеонидЗайцев-ц9я
    @ЛеонидЗайцев-ц9я 6 лет назад +2

    правильнее написать в строке 13 # pip install beautifulsoup4

    • @zaemiel
      @zaemiel  6 лет назад

      да, верно. Опечатка.

  • @Timoha-new-life
    @Timoha-new-life Год назад

    Спасибо, кайф

  • @_pheax
    @_pheax 4 года назад

    спасибо, все понятно

  • @merv8543
    @merv8543 4 года назад

    Отлично, а по Scrapy не планируется видео?

  • @ASDIXER
    @ASDIXER 7 лет назад +1

    А разве не затратно каждый раз для записи в файл заново его открывать и закрывать? Может лучше сделать сразу общий список для всех словарей и потом просто его записать в файл?

    • @zaemiel
      @zaemiel  7 лет назад

      я, вроде бы, об этом прямо говорил... уже не помню.
      Да, это затратно по времени и ресурсам. И да, быстрее все записать в список, а потом записать его в файл.
      Я просто показываю принцип, как это сделать. Это не рецепт.

  • @ЕвгенийМитюшин-ь1р

    Подскажите, как можно забрать кусок кода вместе с тегами, что бы его потом записать в csv

  • @mammut-lip
    @mammut-lip 5 лет назад

    надо писать pip install beautifulsoup4

  • @endyudo5386
    @endyudo5386 Год назад

    Привет! Не знаю, актуально ли, но селениум (как минимум, на питоне) умеет составные айдишники пережевывать, просто вместо пробелов надо точки поставить...

  • @anonimanonim458
    @anonimanonim458 2 года назад

    увидеть бы парсер ютуба с api по поисковому запросу. сылки на видео было бы здорово

  • @kenich8441
    @kenich8441 6 лет назад

    Хотел бы поинтересоваться сможете ли рассказать как работать с сайтом при двухфакторке. Пока нашел для себя выход с использованием selenium. Но возможно имеются другие способы?

  • @sashamc309
    @sashamc309 7 лет назад

    Можно исходный код скрипта? Хочется сравнить по скорости с аналогом на Node.JS

    • @zaemiel
      @zaemiel  7 лет назад

      У меня его больше нет.
      Я не храню такие скрипты - в этом нет никакого смысла

  • @АртёмДавыдов-ы5э
    @АртёмДавыдов-ы5э 4 года назад

    Добрый вечер можете сделать урок как сделать парсинг ютуб каналов

  • @ПростоУлыбка-ш2о
    @ПростоУлыбка-ш2о 6 лет назад

    _Добрый день, Олег. Вы когда-нибудь делали парсеры для 2гис?_

  • @ivanchenkow
    @ivanchenkow 4 года назад +2

    Если я правильно понимаю, сейчас структура сайта изменилась и строка tds = soup.find('table', id='currencies-all').find_all('td', class_='currency-name') уже не актуальна. Но я никак не могу понять, как будет верно :( Подскажите, пожалуйста!

    • @ivanchenkow
      @ivanchenkow 4 года назад +4

      Помогло замена строчки на:
      tds = soup.find_all('td', class_='cmc-table__cell cmc-table__cell--sticky cmc-table__cell--sortable cmc-table__cell--left cmc-table__cell--sort-by__name')

    • @vladjasvki2148
      @vladjasvki2148 4 года назад +1

      @@ivanchenkow
      soup = BeautifulSoup(html, "lxml")

      links = []
      for names in soup.findAll('div',class_='cmc-table__column-name sc-1kxikfi-0 eTVhdN'):
      name = names.find('a').get('href')
      link = 'coinmarketcap.com/'+ name
      links.append(link)
      return links

    • @АлексейАнохин-е2г
      @АлексейАнохин-е2г 4 года назад +1

      @@vladjasvki2148 Спасибо тебе ! Может сейчас заработает :)

    • @АлексейАнохин-е2г
      @АлексейАнохин-е2г 4 года назад

      @@vladjasvki2148 Можешь обьяснить почему ты выдернул это и сделал так ? А не как выше писали

    • @vladjasvki2148
      @vladjasvki2148 4 года назад +1

      @@АлексейАнохин-е2г Да долгий класс у него какой то вышел, не помню точно, но вроде с тем классом , что выше , у меня не находило ,что мне надо, поэтому взял другой класс. У вас всё получилось?

  • @ДмитрийКотик-и1р
    @ДмитрийКотик-и1р 6 лет назад

    Подскажи пожалуйста, у меня следующая проблема. На 20 минута , когда нужно получить список ссылок, у емня вываливается ошибка:
    tds = soup.find('table', id_='currencies-all').find_all('td', class_='currency-name')
    AttributeError: 'NoneType' object has no attribute 'find_all'
    Когда я убираю из метода find айдишник, то все работает. Правильно я понимаю, что если мы ищем по id, по в результате сразу получаем html а не объект soup?

  • @vitalykholodov947
    @vitalykholodov947 7 лет назад +1

    Не могу установить beautifulsoup, пробовал python setup.py install, папка bs4 не появляется, хотя установка вроде как проходит успешно. Через pip выдает (windows 10):
    PS C:\Users\VIK\AppData\Local\Programs\Python\Python36-32\Scripts> pip install beautifulsoup
    Collecting beautifulsoup
    Using cached BeautifulSoup-3.2.1.tar.gz
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
    File "", line 1, in
    File "C:\Users\VIK\AppData\Local\Temp\pip-build-vzhk4v3o\beautifulsoup\setup.py", line 22
    print "Unit tests have failed!"
    ^
    SyntaxError: Missing parentheses in call to 'print'
    ----------------------------------------
    Command "python setup.py egg_info" failed with error code 1 in C:\Users\VIK\AppData\Local\Temp\pip-build-vzhk4v3o\beautifulsoup\
    Или PS C:\Users\VIK\AppData\Local\Programs\Python\Python36-32\Scripts> pip install beautifulsoup4
    Requirement already satisfied: beautifulsoup4 in c:\users\vik\appdata\local\programs\python\python36-32\lib\site-packages\beautifulsoup4-4.6.0-py3.6.egg

    • @zaemiel
      @zaemiel  7 лет назад

      pip freeze
      что выдает?

    • @sc0ut32
      @sc0ut32 7 лет назад

      Vitaly Kholodov , если я правильно понял, используйте pip3 а не просто pip. Я на Вин10 давно ставил, но именно из-за этого ловил кучу проблем)

    • @vitalykholodov947
      @vitalykholodov947 7 лет назад

      beautifulsoup4==4.6.0
      certifi==2017.4.17
      chardet==3.0.4
      idna==2.5
      requests==2.18.2
      urllib3==1.22

    • @zaemiel
      @zaemiel  7 лет назад

      вот... BeautifulSoup у вас установлен

    • @vitalykholodov947
      @vitalykholodov947 7 лет назад

      Но from bs4 import beautifulsoup выделен серым цветом, beautifulsoup подчеркнут волнистой красной линией

  • @kiril9ndi9
    @kiril9ndi9 6 лет назад

    Знать бы в 2016 году, что можно было купить хотя бы несколько десятков эфира!))

  • @romanbond1060
    @romanbond1060 3 года назад

    счетчик мы из процесса убрали... а как его обратно вернуть для мульти процессинга?

  • @shogun7sk
    @shogun7sk 4 года назад

    оперативку мы видели 42,5МБ, что с CPU и LAN?

  • @MrNagios
    @MrNagios 6 лет назад

    Олег, скажите как получать обновления сайта, мониторить его обновления? Его надо спамить запросами, или еще как?

    • @9keepa
      @9keepa 6 лет назад

      ставишь таймер например заходить раз в сутки и проверять данные если есть изменение запускать скрипт парсинга

  • @daniil-shamraev
    @daniil-shamraev 5 лет назад

    Думаю в функции get_all_links лучше было бы использовать генератор списка вместо цикла

  • @vitalykholodov947
    @vitalykholodov947 7 лет назад

    Получился рабочий парсер, но все значения в 1 столбце, пробовал delimiter = ',' - не помогло. Подскажите как записывать в разные столбцы переменные name и price

    • @zaemiel
      @zaemiel  7 лет назад

      у вас ошибка в коде. Проверьте еще раз все.

  • @denisivanov9541
    @denisivanov9541 6 лет назад +1

    что-то не пойму, а что вот этот кусок кода делает?
    if _name_ == ' _main_ ':
    main()
    Traceback (most recent call last):
    if _name_ == ' _main_ ':
    NameError: name '_name_' is not defined - ошибка....

    • @zaemiel
      @zaemiel  6 лет назад +1

      я этого не писал.
      Есть отдельное видео на эту тему - посмотрите в плейлисте "Python casts"

    • @denisivanov9541
      @denisivanov9541 6 лет назад

      да, уже нашел, все работает, спасибо. Очень интересные видео!

  • @kamolrahimov117
    @kamolrahimov117 6 лет назад +1

    Что делать если одинаковые имена атрибутов ( классы/id и т.д), но данные хранящиеся в них разные ? Как достать информацию например с 5-того класса отдельного блока, которое имеет идентичное имя ( надеюсь Вы меня понимаете ) ?

    • @ПростоУлыбка-ш2о
      @ПростоУлыбка-ш2о 6 лет назад

      _выбери все и укажи порядковый номер_

    • @dessan7167
      @dessan7167 6 лет назад

      id всегда уникален и можно прямо указывать номер класса, тебе ООП нужно, посмотри в jquery как всё это находится

    • @zaemiel
      @zaemiel  6 лет назад +2

      боже мой... вы хоть сами понимаете, что вы пишите?
      Какое еще ООП? Какой jquery? Здесь о CSS-классах речь идет.

    • @TV-lb7ti
      @TV-lb7ti 6 лет назад

      Ахах, убило просто :)))))

    • @dessan7167
      @dessan7167 6 лет назад

      Что вас так веселит , парни? Человеку нужно объектное ориентирование понять. Если ему сложно это на питоне, то легче всего будет на примере CSS разобраться, согласен. Я написал про jquery - мне так веселей было и материала куча с примерами, поймёт сразу всё и с питоном потом легче будет.

  • @man-jj7rc
    @man-jj7rc 6 лет назад +1

    Графики как парсить

  • @Борис-ч6я
    @Борис-ч6я 7 лет назад

    Олег здравствуйте.
    А подскажите по количеству процессов. В уроке вы используете 40 процессов. А вообще от чего зависит количество процессов? Например на 2х или 4х ядерном процессоре, как подобрать количество процессов ? Если я сделаю например не 40, а 100 или 500 процессов, но у меня 2х ядерный процессор и допустим нет ограничения в ОЗУ. Они же не будут все выполнятся одновременно.
    Может где то можно про это почитать в русскоязычной литературе? А то языком вероятного противника пока владею слабо.

    • @zaemiel
      @zaemiel  7 лет назад

      Добрый день, Борис
      Я это количество просто выдумал. Подумалось, что так разница во времени будет нагляднее.
      Ограничение в памяти все-таки есть. Насколько я помню 40 процессов отъели около 1,5 ОЗУ. Мне кажется, что это много.
      Они стартуют по-очереди, но при длительной работе эта разница во времени старта сглаживается. Выполняются они, можно сказать, одновременно.
      Нагрузка на процессор тоже возрастает, поскольку этим процессам приходится делить между собой процессорное время.
      Где об этом почитать - не могу вам сказать.

    • @ЮрийЛогунов-ь8б
      @ЮрийЛогунов-ь8б 7 лет назад

      Я пробывал на своем компьюторе разбивать на процессы функцией Pool.1 процесс длился 1 сек, всего процессов было от 1500 до 3000(это предполагаемый объем строк, который я хотел парсить). Быстрее всего парсер работал от 60 до 120 процессов( для конкретной задачи получается разное оптимальное количество процессов). Когда ставил 1000 процессов, компьютер зависал. 1 процесс занимал 5Мб оперативной памяти.

  • @yanketzer5480
    @yanketzer5480 6 лет назад

    Олег, здравствуйте! Подскажите, чем отличается этот бесплатный курс от платного, выложенного Вами? Какие преимущества платного курса? Стоит ли сначала проходить этот цикл видео для поднятия, собственно, платного материала?

    • @zaemiel
      @zaemiel  6 лет назад +1

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

  • @ПростоУлыбка-ш2о
    @ПростоУлыбка-ш2о 6 лет назад

    _Добрый вечер, Олег. Скажи, пожалуйста, как данные в excel под виндой записывать?_

  • @y.k.2176
    @y.k.2176 8 лет назад

    В файл csv имя и цена записываются в одну ячейку ([имя, цена]). Как сделать в 2 ячейки ([имя][цена])?
    з.ы. Спасибо за видео!

    • @zaemiel
      @zaemiel  8 лет назад

      у нас есть словарь {'name': 'vasja', 'surname': 'pupkin'}
      чтобы записать это в csv в две ячейки
      writer.writerow( (our_dict['name'],
      our_dict['surname']
      ))
      Вряд ли я это в видео написал по-другому.
      Функция записи на вход принимает исходный словарь.
      Метод csv-писателя принимает кортеж - будьте внимательны.

    • @y.k.2176
      @y.k.2176 8 лет назад

      Спасибо за ответ. Да, на видео так и было. Просто совсем не знаком с csv. Оказывается, можно было выбрать разделитель ",".

  • @goshaposhlyy
    @goshaposhlyy 4 года назад

    Никак не пойму , а как сделать такую многопоточность с респонсом 200.соответственно 200 строк за раз

  • @tonick74
    @tonick74 4 года назад

    Здравствуйте, подскажите можете объяснить условие с if. Что таке __name__?

    • @bakhtiyartayirov2685
      @bakhtiyartayirov2685 4 года назад

      ruclips.net/video/cW_-zGG4ef4/видео.html

    • @tonick74
      @tonick74 4 года назад

      @@bakhtiyartayirov2685 спасибо

  • @ПростоУлыбка-ш2о
    @ПростоУлыбка-ш2о 6 лет назад

    _Олег, добрый вечер. Можно ли в парсинге использовать многопоточность?_

    • @zaemiel
      @zaemiel  6 лет назад

      Добрый день,
      Вы имеете в виду multithreading?
      Да, можно.
      Но при использовании multiprocessing можно использовать несколько ядер. А потоки в Python привязывают нас к одному ядру.

    • @ПростоУлыбка-ш2о
      @ПростоУлыбка-ш2о 6 лет назад

      Олег Молчанов, я не совсем понимаю как это сделать. сначала ф-ция собирает все данные в один список, а дальше это список другая ф-ция через многопоточность разбирает в несколько процессов? можете сделать видео на эту тему?

    • @zaemiel
      @zaemiel  6 лет назад

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

    • @ПростоУлыбка-ш2о
      @ПростоУлыбка-ш2о 6 лет назад

      _я хотел именно сбор данных. чтобы это быстрее как-то происходило._

    • @zaemiel
      @zaemiel  6 лет назад

      Все-таки я не очень понял проблему. Чем не подходит мультипроцессинг?
      Из недостатков у него только расход оперативной памяти.

  • @duck0154
    @duck0154 5 лет назад

    9:09 должно быть pip install bs4

    • @zaemiel
      @zaemiel  5 лет назад

      www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-beautiful-soup

    • @duck0154
      @duck0154 5 лет назад +1

      @@zaemiel Я пишу bs4, мне норм :)

  • @DDD-bt8gj
    @DDD-bt8gj 7 лет назад

    Добрый день, уважаемый Олег! У меня появилась проблема в коде на 39:07 с Pool. Я сделал все как Вы сказали у меня создается на рабочем столе файл csv, но в Питоне не отображается процесс парсинга. Подскажите, пожалуйста, как это исправить. Вот мой код:
    # 1. Парсер однопоточный.
    # 2. Замер времени.
    # 3. multiprocessing Pool.
    # 4. Замер времени.
    # 5. Экспорт в csv.
    import requests
    from bs4 import BeautifulSoup
    import csv
    from datetime import datetime
    from multiprocessing import Pool
    def get_html(url):
    r = requests.get(url) #Response
    return r.text #возвращает HTML-код страницы
    def get_all_links(html):
    soup = BeautifulSoup(html, 'lxml')
    tds = soup.find('table', id='currencies-all').find_all('td', class_='currency-name')
    links = []
    for td in tds:
    a = td.find('a').get('href') #string
    link = 'coinmarketcap.com' + a #/currencies/bitcoin/
    links.append(link)
    return links
    def get_page_data(html):
    soup = BeautifulSoup(html, 'lxml')
    try:
    name = soup.find('h1', class_='text-large').text.strip()
    except:
    name = ''
    try:
    price = soup.find('span', id = 'quote_price').text.strip()
    except:
    price = ''
    data = {'name': name,
    'price': price}
    return data
    def write_csv(data):
    with open ('coinmarketcap.csv', 'a')as f:
    writer = csv.writer(f)
    writer.writerow( (data['name'],
    data['price']) )
    print(data['name'],'parsed')
    def make_all(url):
    html = get_html(url)
    data = get_page_data(html)
    write_csv(data)
    def main():
    #8 minutes
    start = datetime.now()
    url = 'coinmarketcap.com/all/views/all/'
    all_links = get_all_links(get_html(url))
    #for index, url in enumerate(all_links):
    #html = get_html(url)
    #data = get_page_data(html)
    #write_csv(data)
    #print(index)
    #map(function, list)
    with Pool(8) as p:
    p.map(make_all, all_links)
    end = datetime.now()
    total = end - start
    print(str(total))

    if __name__ == '__main__':
    main()

    • @zaemiel
      @zaemiel  7 лет назад

      Код, конечно, лучше заливать на какой-нибудь сервис типа pastebin и т.п.
      Мне кажется, что у вас у условия if _name_ только одно подчеркивание, а нужно два.
      Парсинг в итоге продвигается или нет?

    • @DDD-bt8gj
      @DDD-bt8gj 7 лет назад

      Олег Молчанов создаётся файл таблицы и просто записываются названия валют и все. Добавил второе нижнее подчеркивание и результат тот же

    • @zaemiel
      @zaemiel  7 лет назад

      т.е. данные парсятся?

    • @DDD-bt8gj
      @DDD-bt8gj 7 лет назад

      Олег Молчанов да, но только название валюты

    • @zaemiel
      @zaemiel  7 лет назад

      Значит у вас не отрабатывается это условие:
      writer.writerow( (data['name'],
      data['price']) )
      print(data['name'],'parsed')
      Желательно, чтобы вы выяснили сами причину того, почему data['name'] записалось в файл, а data['price'] нет.
      Если я вам это скажу, вы ничего от этого не получится.
      В любом случае, чтобы я мог посмотреть ваш код скопируйте его, пожалуйста, на Pastebin
      Так он выглядит нормальным, вроде.

  • @gregoryjenferd9740
    @gregoryjenferd9740 6 лет назад

    Олег, отличное видео. Но возникла 1 проблема: как вывести информацию в колонки, у меня, по неизвестной мне причине, заполняется все в 1 строку, хотя код идентичен Вашему. Чем это может быть вызвано?
    Вот код, что у меня получился:
    def write_csv(data):
    with open('freelance.ru.csv', 'a') as f:
    writer = csv.writer(f)
    writer.writerow( (data['title'],
    data['price'],
    data['about'],
    data['url']) )
    data = {'title' : title,
    'price' : price,
    'about' : about,
    'url' : url}

    • @zaemiel
      @zaemiel  6 лет назад

      это может быть связано и с операционной системой и с офисом и тем как он интерпретирует csv.
      Откройте csv в каком-нибудь редакторе кода или блокноте, если вы видите данные, указанные через запятую, то все нормально и проблема в Офисе и в Операционной системе.
      Решений два.
      1. Панель управления - Часы, язык и регион - Изменение форматов даты, времени и чисел - Дополнительные параметры - вкладка "Числа" пункт "разделитель элементов списка"
      У вас там стоит точка с запятой, скорее всего
      2. Открываете в Экселе новый файл - Данные - Импорт внешних данных - находите свой файл csv и кликаете кнопку Готово.
      Откроется мастер импорта на 2-м шаге вы снимаете галку с точки с запятой и ставите на запятую.
      На третьем шаге проверьте формат данных каждой колонки - лучше поставить для всех текст.

    • @gregoryjenferd9740
      @gregoryjenferd9740 6 лет назад

      Олег, спасибо Вам большое. Буду советовать всем друзьям Ваш канал)))

  • @ivanbudaev724
    @ivanbudaev724 Год назад

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

    • @Sergey-cz7ym
      @Sergey-cz7ym Год назад

      чуть выше код написал