НЕРЕАЛЬНО ОБАЛДЕННОЕ ВИДЕО! ОЛЕГ, ОГРОМНОЕ СПАСИБО! ВСЕ ЧТО Я НАМАТЫВАЛ НА УС ДО ПРОСМОТРА ЭТОГО РОЛИКА ПРОСТО РАЗЬЯСНИЛОСЬ, ПРИЯТНО СЛУШАТЬ ГРАМОТНОГО И ЗНАЮЩЕГО СВОЕ ДЕЛО ЧЕЛОВЕКА!
Ну какое же офигенное видео! Просто супер) спасибо! С удовольствием посмотрел полностью и очень удивился, что мультипроцессинг был только в самом конце и совсем немного) но все равно круто!
Олег Молчанов по вашему уроку запустил свой парсер в многопоточном режиме. По началу работает шустро и прекрасно. Но потом скорость падает до скорости в однопоточном режиме. Есть ли адекватны й способ мониторить потоки и понимать, какой реально что то делает, а какой просто завис(например из-за ошибки в программе).
после видосов по Scrapy я думал, что ещё полгода буду учиться, прежде чем напишу хоть какой-нибудь парсер. Не думал, что это так просто и быстро можно сделать. Спасибо!
Хорошая подборка видео,да с криптой надо поковыряться,сменилась верстка и появилась защита,посмотрев все видео автора про парсинг(опытпрограммирования три мес)-скрестил проги из этого видео и урока с проксями, задержкой и юзерагентами- если в один поток 2370 пунктов парсит примерно за 3ч 20м, если поставить пул 100 то за 1ч 30(оперативки мало-на один процесс уходит 12мб).Не знаю быстро это или нет,но все работает за что автору большое спасибо, оформлю платную подписку)
Лайк и безумное уважение за объяснение (26:57) подобных вещей! Серьезно, мелочь но очень очень полезно для новичка и показывает уважение автора канала к его зрителям. Мало кто даже сейчас так делает... и это печально.
Очень доходчиво. Учитывая, что у меня уровень знаний в питоне - Хелло ворлд, я смог во всем разобраться и перенастроить скрипт на текущее состояние страницы.
Отличное видео, подача, голос, код и комментарии (в смысле документация) все отлично. Сразу подписался. Особенно помогли с мультизадачностью, как раз для моего проекта с автоматизацией очень пригодится. Ждём новые видео. Удачи!
в данной ситуации у процессов только один недостаток - это потребление памяти и сравнительно медленный запуск (на Windows это более ощутимо), но в остальном применительно к данной конкретной задаче разницы нет. Ведь использование потоков или процессов в большей степени зависит от конкретной задачи. А здесь - не нужна параллельность вычислений, общих данных у процессов нет, задачи сэкономить потребления ресурсов тоже не было... как-то так. Такую обработку процессов написать очень просто, наверное, поэтому взял процессы
Делал что то похожее, только парсил не 700 а 20к страниц. Упарывался в потоки, ничего не получалось. Посмотрел видосик, отрефакторил код, применил процессы и все заработало. Автору респект х20к )))
я вот щас тоже пытаюсь , но чет скорости на потоке нету. Потом как парсить динамические данные кто что знает, щас использую Selenium, но что то медленно.
@@ИгорьСоболев-п4й тебе он обязателен? Он очень сильно нагружает систему. Скорость ты увидишь только в том что потоки работуют в разных процессах а не ждут друг друга.
@@ИгорьСоболев-п4й можно делать запросы к ajxa через scrapy. Но у селентиума есть веб драйвер который может рендерить js без браузера. Ты его так и используешь? Или нет?
если у кого-то появились проблемы с парсингом, а именно в линкс не помещаются ссылки, то надо самому заходить в сайт, и искать классы, видео старое, поэтому на сайте может измениться всё, я сам порыскал id и class, короче внизу обновленный код: tds = soup.find('tbody').find_all('tr', class_ = 'cmc-table-row')
Огромная благодарность за пример. Я не знаю языка python, только Object pascal. Но данный пример помог понять общие принципы языка , создания функций и парсинга.
Спасибо за видео! При использовании модуля multiprocessing как работает запись в csv файл? Почему не возникает ошибки одновременной записи в файл? Спасибо
Небольшая идея для монетизации Вашего труда: заливайте проекты на bitbucker и сделайте продажу инвайтов в проект (микромагазин с онлайн оплатой), что означает доступ к исходному коду, либо просто питоновский файл с кодом продавать, если проект небольшой. Я когда-то проходил этот урок, но исходников у меня не осталось, сейчас мне нужно потратить время, просмотреть все видео, найти нужные мне моменты, делать паузы, чтобы вникнуть в код. Короче гемморой и куча времени. Был бы у меня исходник, я бы быстро просмотрел его, просмотрел видео в нужных местах и начал бы внедрять в свой проект. А если у Вас будут целые курсы, по Django, например и т.д. где подразумевается более или менее большие проекты, так это вообще необходимость!
Сайт немного обновили. Изменилось название и адрес основной страницы, на сайт поставили защиту от большого количества запросов. Но всё это можно исправить, посмотрев видео. Смог спарсить только 2-мя потоками с использованием time.sleep. Спасибо большое за видео! pastebin.com/ZHr5LLMN -так можно поменять первые две функции, если совсем ничего не ищется.
Привет Олег! Спасибо за интересные и качественные уроки! А почему бы тебе на сделать материал по Scrapy? Было бы здорово. А вообще было бы круто, если выпустишь курс по данной теме. Сейчас это очень актуально. Я бы сразу купил!
Привет, очень хорошо показываешь. Начал недавно изучать python и вот сталкнулся с достаточно распространенной задачей, мультипотоковый парсинг в частности. Есть сайт, но он блокирует если частота обращений слишком высокая, его можно парсить, только залогинившись. Для этого можно создать несколко аккаунтов и использовать session и proxy Я сделал с использованием модулей treaading и requests, но потом выяснил, что requests подклюяается в одном потоке. Накопал , что есть некий модуль grequests, но по нему мало примеров. Сейчас такой вопрос, что если нужно из 10000 страниц, найти ту страницу на которой, например есть секретное слово, после чего остановить все потоки, чтоб зря не тратить время и распечатать , как передовать свои параметры в каждый поток? Былоб круто если б сделал такой туториал с объяснениями, все остальное былоб производным от него.
Олег молодец. не устаю пересматривать его видео. надо освежить память по python? значит к Олегу надо идти.))) за дидосил бедный сайтик. может канал свой забил, я про интернет. он тоже имеет свою пропускную способность. или то и другое + проц. окуратнее с процессами ребят, а то ПК спалите..😂 linux мог с дуру в swap пихнуть или не успевать кеш менять. такие приколы иногда бывают. или реально дидостнул сайт и пока там поднялся еще процесс уже все повисло.🤣мы делали 1к асинков на один сайтик, бан мгновенный.🤣
Олег, отличный урок! Очень интересно и как всегда детально, я больше и лучше стал понимать язык python именно на таких рабочих примерах. Правда в данном примере у меня возник странный трабл: сегодня на сайте на данный момент 2085 различных валют, после парсинга в таблицу записывается примерно подрят 49 а дальше через один и после 126 примерно вовсе пусто. Это банят так ? Или ошибка другого плана?
Сделайте плз темную тему в браузере, а то рябит аж в глазах от резкого переключения из компилятора в браузер. Особенно, если смотришь ночью с выключенным светом. И спасибо за ролики)
Вы все конечно молодцы. Но я пока что не встречал человека, который объяснял бы решение вопроса с позиции того, кто только пытается что-то понять. Все объясняют с позиции, как будто вокруг все уже в курсе почти всего, о чём идёт речь. Почитайте очень хорошую книгу. "Исскуство объяснять". Очень хорошая и полезная книга. Я по ней своего ребёнка учу жизни.
Олег прекрасно объясняет. Что бы понять о чём речь, желательно перед просмотром его уроков потратить годик-другой на изучение основ программирования, стека веб программирования и много всего попутного необходимого материала. И это вы только приоткроете завесу огромного пласта необходимых знаний, но Вам станет хотя бы понятно о чём рассказывает Олег.
@@ВиталийГорбачёв-ю8в, если я изучу всё то, что Вы перечислили, то в просмотре видео Олега у меня не будет необходимости))). В данной ситуации, я нашёл это видео, чтобы решить конкретную задачу, без получения знаний. Был готов полностью повторить все действия. Пошагово. Есть хорошая поговорка: *Расскажи мне как это делать - я ничего не пойму. Покажи как это делать - мне станет понятно о чём речь. Давай сделаем это вместе - следующий раз я сделаю это сам.* Но как и в предыдущих видео по этой теме, я в определенный момент столкнулся с вопросом, который автор считает не важным. Настолько, что даже внимание на это не обращает. А для меня и таких как я - это СТОП. Дальше нет смысла смотреть, потому что необходимо искать ответ на вопрос, которому автор видео не уделил внимание. И поплыл дальше в глубину интернета и Ютуба))). Я не зря написал про книгу "Исскуство объяснять". Всё, что вы знаете и хотите кому-то объяснить необходимо привести в такой вид, чтобы это поняли как можно больше людей. С разными уровнями знания. Тогда вас ждёт успех. P.S. на вопрос ребёнка откуда берётся дождь, можно ответить по разному. И про конденсат и о разном состоянии воды и т.д. Но он не поймёт))) А если привести пример с чайником из которого идёт пар и поднимается вверх, а после капельками падает вниз. То поймёте не только ребёнок, но и все кому и первый вариант объяснения не подходит, в силу наличия знаний.
@@denzelkoshuba5702 Ваше желание понятно, но к сожалению не возможно взять и в один момент все понять это приходит только с опытом и практикой. А объяснять это придется очень долго, даже если очень стараться.
@@denzelkoshuba5702 а вы попробуйте объяснить ребенку как решать дифференциальные уравнения, а не откуда берется дождь. Это примерно тоже самое. Хотели без основ решить задачу уровнем повыше вот вам и результат. Если опускаться в уроке до разбора элементарного синтаксиса, на это уйдет несколько часов и появятся другие недовольные. Объяснение вполне адекватное, сравните с другими горе учителями в сети
Олег, в первую очередь огромное спасибо! Все очень интересно и полезно, много чего узнал нового у меня также есть к вам вопрос - вы продемонстрировали парсинг на примере "View All", что следовало бы изменить в скрипте в случае если бы этой опции не было бы (как это часто бывает на других страницах) и нам пришлось бы обратиться к "Next 100" если говорить на примере этого же сайта
я попытался также добавить колонку с линзами как источник информации для каждой из валют, но не смог. посоветуйте пожалуйста как решить эти два вопроса - а именно переходить по страницам и как добавить колонку с ссылками как источник инфо
Спасибо. Про работу с пагинацией было в видео про парсинг Авито. Что такое линзы я не знаю, но в любом случае, добавление дополнительных данных должно осуществляться аналогичным образом.
Огромное спасибо. Не понял только почему у меня в этой табличке нет значений? Или всего несколько названий и все? Код в точности такой же, также сверялся с сайтом -ничего не поменялось. В чем может быть проблема?
на сайте ддос защита висит теперь. Целое утро искал способ обойти cloudflare, у меня ни один не сработал. Единственный способ который я нашел это парсить примерно раз в 5 сек в одном потоке.
Пересмотрел почти все видео, всё отлично. Не хватает чуть-чуть, а именно рассмотреть архитектуру. На пример патерны. Но не хочется смотреть пустые примеры, а вот на примере парсеров на мой взгляд было бы круто. И полезно, и приятно.
@@vyacheslav_kapitonov Вы на меня тратите время? Зачем вы вообще ко мне обращались? А вообще у вас неправильное понимание процесса парсинга. На каждый процесс, один аккаунт, один прокси. На другой процесс другой аккаунт и так далее.
Здравствуйте, Олег! Спасибо вам за ваши уроки! Но как быть, если надо скачать картинки и сохранить их в соответствующую папку, путь к которой будет указан в колонке images, в файла csv ? Спасибо, буду благодарен!
А разве не затратно каждый раз для записи в файл заново его открывать и закрывать? Может лучше сделать сразу общий список для всех словарей и потом просто его записать в файл?
я, вроде бы, об этом прямо говорил... уже не помню. Да, это затратно по времени и ресурсам. И да, быстрее все записать в список, а потом записать его в файл. Я просто показываю принцип, как это сделать. Это не рецепт.
Привет! Не знаю, актуально ли, но селениум (как минимум, на питоне) умеет составные айдишники пережевывать, просто вместо пробелов надо точки поставить...
Хотел бы поинтересоваться сможете ли рассказать как работать с сайтом при двухфакторке. Пока нашел для себя выход с использованием selenium. Но возможно имеются другие способы?
Если я правильно понимаю, сейчас структура сайта изменилась и строка tds = soup.find('table', id='currencies-all').find_all('td', class_='currency-name') уже не актуальна. Но я никак не могу понять, как будет верно :( Подскажите, пожалуйста!
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г Да долгий класс у него какой то вышел, не помню точно, но вроде с тем классом , что выше , у меня не находило ,что мне надо, поэтому взял другой класс. У вас всё получилось?
Подскажи пожалуйста, у меня следующая проблема. На 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?
Не могу установить 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
Получился рабочий парсер, но все значения в 1 столбце, пробовал delimiter = ',' - не помогло. Подскажите как записывать в разные столбцы переменные name и price
что-то не пойму, а что вот этот кусок кода делает? if _name_ == ' _main_ ': main() Traceback (most recent call last): if _name_ == ' _main_ ': NameError: name '_name_' is not defined - ошибка....
Что делать если одинаковые имена атрибутов ( классы/id и т.д), но данные хранящиеся в них разные ? Как достать информацию например с 5-того класса отдельного блока, которое имеет идентичное имя ( надеюсь Вы меня понимаете ) ?
Что вас так веселит , парни? Человеку нужно объектное ориентирование понять. Если ему сложно это на питоне, то легче всего будет на примере CSS разобраться, согласен. Я написал про jquery - мне так веселей было и материала куча с примерами, поймёт сразу всё и с питоном потом легче будет.
Олег здравствуйте. А подскажите по количеству процессов. В уроке вы используете 40 процессов. А вообще от чего зависит количество процессов? Например на 2х или 4х ядерном процессоре, как подобрать количество процессов ? Если я сделаю например не 40, а 100 или 500 процессов, но у меня 2х ядерный процессор и допустим нет ограничения в ОЗУ. Они же не будут все выполнятся одновременно. Может где то можно про это почитать в русскоязычной литературе? А то языком вероятного противника пока владею слабо.
Добрый день, Борис Я это количество просто выдумал. Подумалось, что так разница во времени будет нагляднее. Ограничение в памяти все-таки есть. Насколько я помню 40 процессов отъели около 1,5 ОЗУ. Мне кажется, что это много. Они стартуют по-очереди, но при длительной работе эта разница во времени старта сглаживается. Выполняются они, можно сказать, одновременно. Нагрузка на процессор тоже возрастает, поскольку этим процессам приходится делить между собой процессорное время. Где об этом почитать - не могу вам сказать.
Я пробывал на своем компьюторе разбивать на процессы функцией Pool.1 процесс длился 1 сек, всего процессов было от 1500 до 3000(это предполагаемый объем строк, который я хотел парсить). Быстрее всего парсер работал от 60 до 120 процессов( для конкретной задачи получается разное оптимальное количество процессов). Когда ставил 1000 процессов, компьютер зависал. 1 процесс занимал 5Мб оперативной памяти.
Олег, здравствуйте! Подскажите, чем отличается этот бесплатный курс от платного, выложенного Вами? Какие преимущества платного курса? Стоит ли сначала проходить этот цикл видео для поднятия, собственно, платного материала?
у нас есть словарь {'name': 'vasja', 'surname': 'pupkin'} чтобы записать это в csv в две ячейки writer.writerow( (our_dict['name'], our_dict['surname'] )) Вряд ли я это в видео написал по-другому. Функция записи на вход принимает исходный словарь. Метод csv-писателя принимает кортеж - будьте внимательны.
Добрый день, Вы имеете в виду multithreading? Да, можно. Но при использовании multiprocessing можно использовать несколько ядер. А потоки в Python привязывают нас к одному ядру.
Олег Молчанов, я не совсем понимаю как это сделать. сначала ф-ция собирает все данные в один список, а дальше это список другая ф-ция через многопоточность разбирает в несколько процессов? можете сделать видео на эту тему?
для этого не обязательно делать многопоточное приложение. В вашей задаче сбор данных и их разбор - это последовательные процессы. Или вы имеете в виду асинхронность? Если вы имеете в виду асинхронность, то requests так работать не может
Добрый день, уважаемый Олег! У меня появилась проблема в коде на 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))
Код, конечно, лучше заливать на какой-нибудь сервис типа pastebin и т.п. Мне кажется, что у вас у условия if _name_ только одно подчеркивание, а нужно два. Парсинг в итоге продвигается или нет?
Значит у вас не отрабатывается это условие: writer.writerow( (data['name'], data['price']) ) print(data['name'],'parsed') Желательно, чтобы вы выяснили сами причину того, почему data['name'] записалось в файл, а data['price'] нет. Если я вам это скажу, вы ничего от этого не получится. В любом случае, чтобы я мог посмотреть ваш код скопируйте его, пожалуйста, на Pastebin Так он выглядит нормальным, вроде.
Олег, отличное видео. Но возникла 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}
это может быть связано и с операционной системой и с офисом и тем как он интерпретирует csv. Откройте csv в каком-нибудь редакторе кода или блокноте, если вы видите данные, указанные через запятую, то все нормально и проблема в Офисе и в Операционной системе. Решений два. 1. Панель управления - Часы, язык и регион - Изменение форматов даты, времени и чисел - Дополнительные параметры - вкладка "Числа" пункт "разделитель элементов списка" У вас там стоит точка с запятой, скорее всего 2. Открываете в Экселе новый файл - Данные - Импорт внешних данных - находите свой файл csv и кликаете кнопку Готово. Откроется мастер импорта на 2-м шаге вы снимаете галку с точки с запятой и ставите на запятую. На третьем шаге проверьте формат данных каждой колонки - лучше поставить для всех текст.
Шикарно! Огромнейшая благодарность, особенно за то, как Вы подаете материал! Важные вещи и все всегда отлично работает.
Спасибо, рад, что материал был вам полезен
Олег, спасибо Вам ещё раз за видео! Все очень доступно и понятно
Всегда, пожалуйста.
Спасибо вам за вопрос
Спасибо, лишний раз убеждаюсь, что вы один из топ авторов по python рунета. Все четко и понятно.
офигенное видео. Пока лучшее, что видел по пайтону
Спасибо
НЕРЕАЛЬНО ОБАЛДЕННОЕ ВИДЕО! ОЛЕГ, ОГРОМНОЕ СПАСИБО! ВСЕ ЧТО Я НАМАТЫВАЛ НА УС ДО ПРОСМОТРА ЭТОГО РОЛИКА ПРОСТО РАЗЬЯСНИЛОСЬ, ПРИЯТНО СЛУШАТЬ ГРАМОТНОГО И ЗНАЮЩЕГО СВОЕ ДЕЛО ЧЕЛОВЕКА!
Ну какое же офигенное видео! Просто супер) спасибо!
С удовольствием посмотрел полностью и очень удивился, что мультипроцессинг был только в самом конце и совсем немного) но все равно круто!
Спасибо
Олег Молчанов по вашему уроку запустил свой парсер в многопоточном режиме. По началу работает шустро и прекрасно. Но потом скорость падает до скорости в однопоточном режиме. Есть ли адекватны й способ мониторить потоки и понимать, какой реально что то делает, а какой просто завис(например из-за ошибки в программе).
Топ фраза автора: "Мы будем парсить этот несчастный сайт 40 процессами".
top3 туториалов на ютюбе! тебе надо на udemy выкладываться с таким качеством контента!
после видосов по Scrapy я думал, что ещё полгода буду учиться, прежде чем напишу хоть какой-нибудь парсер. Не думал, что это так просто и быстро можно сделать. Спасибо!
Хорошая подборка видео,да с криптой надо поковыряться,сменилась верстка и появилась защита,посмотрев все видео автора про парсинг(опытпрограммирования три мес)-скрестил проги из этого видео и урока с проксями, задержкой и юзерагентами- если в один поток 2370 пунктов парсит примерно за 3ч 20м, если поставить пул 100 то за 1ч 30(оперативки мало-на один процесс уходит 12мб).Не знаю быстро это или нет,но все работает за что автору большое спасибо, оформлю платную подписку)
Егор Смирнов братан можешь ссылку дать на соц сеть или как с тобой связаться ?(вопрос с проксями)
Лайк и безумное уважение за объяснение (26:57) подобных вещей!
Серьезно, мелочь но очень очень полезно для новичка и показывает уважение автора канала к его зрителям. Мало кто даже сейчас так делает... и это печально.
приятно смотреть ваши виде-уроки)), на 1.25 ускорением смотрю)
Спасибо.
Приходите еще
Да и на 1,75 залетает.
лучшее, как по мне, объяснение нюансов парсинга. если бы еще асинхронный код для этого рассмотреть...
Зачем тут асинхронность? Мне кажется ты просто не до конца понимаешь что это такое)
Биткоин по 700 баксов, как давно это было)
450-й лайк мой
попутно подписка)
Все четко и понятно
Очень доходчиво. Учитывая, что у меня уровень знаний в питоне - Хелло ворлд, я смог во всем разобраться и перенастроить скрипт на текущее состояние страницы.
Спасибо большое ! Шикарно как всегда !
Спасибо
Отличное видео, подача, голос, код и комментарии (в смысле документация) все отлично. Сразу подписался. Особенно помогли с мультизадачностью, как раз для моего проекта с автоматизацией очень пригодится. Ждём новые видео. Удачи!
СПАСИБО. УЧУСЬ НА ВАШИХ УРОКАХ. ВСЕМ СТАВИМ LIKE И КОММЕНТ
Отлично объясняете, спасибо за видео :)
Спасибо
слушай а чем хуже потоки?, почему ты выбрал именно процессамми?
в данной ситуации у процессов только один недостаток - это потребление памяти и сравнительно медленный запуск (на Windows это более ощутимо), но в остальном применительно к данной конкретной задаче разницы нет.
Ведь использование потоков или процессов в большей степени зависит от конкретной задачи. А здесь - не нужна параллельность вычислений, общих данных у процессов нет, задачи сэкономить потребления ресурсов тоже не было... как-то так.
Такую обработку процессов написать очень просто, наверное, поэтому взял процессы
Олег Молчанов понятно)
ЗА-ме-ча-тель-но! Мне очень понравилось. Всё чётко, понятно, без лишней информации
медленно но понятно! ты красавчик пирожочек ты наш :)
Спасибо за отличный и подробный разбор!
Спасибо
Делал что то похожее, только парсил не 700 а 20к страниц. Упарывался в потоки, ничего не получалось. Посмотрел видосик, отрефакторил код, применил процессы и все заработало. Автору респект х20к )))
о, я щас буду парсить 1700 000 страниц))
я вот щас тоже пытаюсь , но чет скорости на потоке нету. Потом как парсить динамические данные кто что знает, щас использую Selenium, но что то медленно.
@@ИгорьСоболев-п4й тебе он обязателен? Он очень сильно нагружает систему. Скорость ты увидишь только в том что потоки работуют в разных процессах а не ждут друг друга.
@@eugenefedoryachenko8793 мне нужны данные изменяющиеся динамически AJAX-ом как это по другому сделать?
@@ИгорьСоболев-п4й можно делать запросы к ajxa через scrapy. Но у селентиума есть веб драйвер который может рендерить js без браузера. Ты его так и используешь? Или нет?
Спасибо большое за видео! Очень полезно и все понятно разжевано !
если у кого-то появились проблемы с парсингом, а именно в линкс не помещаются ссылки, то надо самому заходить в сайт, и искать классы, видео старое, поэтому на сайте может измениться всё, я сам порыскал id и class, короче внизу обновленный код:
tds = soup.find('tbody').find_all('tr', class_ = 'cmc-table-row')
а чуть ниже через две строчки сразу в цикле исправить на a = td.find('a', class_='cmc-link').get('href')
Отлично! Понятно все! Как раз для чайников!
Огромная благодарность за пример. Я не знаю языка python, только Object pascal. Но данный пример помог понять общие принципы языка , создания функций и парсинга.
Привет! Очень понятное объяснение. Запиши пожалуйста видео по работе с Excel с помощью python
Олег, добрый вечер! Спасибо за отличные уроки!
Спасибо за видео!
При использовании модуля multiprocessing как работает запись в csv файл? Почему не возникает ошибки одновременной записи в файл? Спасибо
Олег, спасибо, очень все подробно и понятно рассказываешь, ставлю палец вверх, становлюсь подписчиком )))
Небольшая идея для монетизации Вашего труда: заливайте проекты на bitbucker и сделайте продажу инвайтов в проект (микромагазин с онлайн оплатой), что означает доступ к исходному коду, либо просто питоновский файл с кодом продавать, если проект небольшой. Я когда-то проходил этот урок, но исходников у меня не осталось, сейчас мне нужно потратить время, просмотреть все видео, найти нужные мне моменты, делать паузы, чтобы вникнуть в код. Короче гемморой и куча времени. Был бы у меня исходник, я бы быстро просмотрел его, просмотрел видео в нужных местах и начал бы внедрять в свой проект. А если у Вас будут целые курсы, по Django, например и т.д. где подразумевается более или менее большие проекты, так это вообще необходимость!
Спасибо за совет.
Думаю, что я сделаю такое
rabotu tscheres functions() sdorowo i ponjatno objasnils, sps !
Отличная подача материала, просьба давайте текст программы хотя бы ссылкой на github
Однозначно подписка, спасибо, очень доступно
Можно еще короткий урок по модулю multiprocessing? Там есть вроде что-то встроеное, что само определяет, сколько можно процессов создать.
Толковое видел, спасибо))
Сайт немного обновили. Изменилось название и адрес основной страницы, на сайт поставили защиту от большого количества запросов. Но всё это можно исправить, посмотрев видео. Смог спарсить только 2-мя потоками с использованием time.sleep. Спасибо большое за видео!
pastebin.com/ZHr5LLMN -так можно поменять первые две функции, если совсем ничего не ищется.
сколько секунд ставил задержку по времени?
Please turn JavaScript on and reload the page. ? -защита это ?
@@ivanbednyakov1852 какая защита?
print(index, end='. ')
write_csv(data)
Привет Олег! Спасибо за интересные и качественные уроки!
А почему бы тебе на сделать материал по Scrapy? Было бы здорово. А вообще было бы круто, если выпустишь курс по данной теме. Сейчас это очень актуально. Я бы сразу купил!
Привет, очень хорошо показываешь. Начал недавно изучать python и вот сталкнулся с достаточно распространенной задачей, мультипотоковый парсинг в частности. Есть сайт, но он блокирует если частота обращений слишком высокая, его можно парсить, только залогинившись. Для этого можно создать несколко аккаунтов и использовать session и proxy
Я сделал с использованием модулей treaading и requests, но потом выяснил, что requests подклюяается в одном потоке. Накопал , что есть некий модуль grequests, но по нему мало примеров. Сейчас такой вопрос, что если нужно из 10000 страниц, найти ту страницу на которой, например есть секретное слово, после чего остановить все потоки, чтоб зря не тратить время и распечатать , как передовать свои параметры в каждый поток? Былоб круто если б сделал такой туториал с объяснениями, все остальное былоб производным от него.
Олег молодец. не устаю пересматривать его видео. надо освежить память по python? значит к Олегу надо идти.)))
за дидосил бедный сайтик. может канал свой забил, я про интернет. он тоже имеет свою пропускную способность. или то и другое + проц. окуратнее с процессами ребят, а то ПК спалите..😂 linux мог с дуру в swap пихнуть или не успевать кеш менять. такие приколы иногда бывают. или реально дидостнул сайт и пока там поднялся еще процесс уже все повисло.🤣мы делали 1к асинков на один сайтик, бан мгновенный.🤣
классс! главное Доходчиво!!!
СПАСИБО!!!
Олег, отличный урок! Очень интересно и как всегда детально, я больше и лучше стал понимать язык python именно на таких рабочих примерах. Правда в данном примере у меня возник странный трабл: сегодня на сайте на данный момент 2085 различных валют, после парсинга в таблицу записывается примерно подрят 49 а дальше через один и после 126 примерно вовсе пусто. Это банят так ? Или ошибка другого плана?
Я не могу ничего определенного сказать
Сделайте плз темную тему в браузере, а то рябит аж в глазах от резкого переключения из компилятора в браузер. Особенно, если смотришь ночью с выключенным светом. И спасибо за ролики)
Вы все конечно молодцы. Но я пока что не встречал человека, который объяснял бы решение вопроса с позиции того, кто только пытается что-то понять. Все объясняют с позиции, как будто вокруг все уже в курсе почти всего, о чём идёт речь.
Почитайте очень хорошую книгу. "Исскуство объяснять". Очень хорошая и полезная книга. Я по ней своего ребёнка учу жизни.
Олег прекрасно объясняет. Что бы понять о чём речь, желательно перед просмотром его уроков потратить годик-другой на изучение основ программирования, стека веб программирования и много всего попутного необходимого материала. И это вы только приоткроете завесу огромного пласта необходимых знаний, но Вам станет хотя бы понятно о чём рассказывает Олег.
@@ВиталийГорбачёв-ю8в, если я изучу всё то, что Вы перечислили, то в просмотре видео Олега у меня не будет необходимости))). В данной ситуации, я нашёл это видео, чтобы решить конкретную задачу, без получения знаний. Был готов полностью повторить все действия. Пошагово. Есть хорошая поговорка:
*Расскажи мне как это делать - я ничего не пойму.
Покажи как это делать - мне станет понятно о чём речь.
Давай сделаем это вместе - следующий раз я сделаю это сам.*
Но как и в предыдущих видео по этой теме, я в определенный момент столкнулся с вопросом, который автор считает не важным. Настолько, что даже внимание на это не обращает. А для меня и таких как я - это СТОП. Дальше нет смысла смотреть, потому что необходимо искать ответ на вопрос, которому автор видео не уделил внимание. И поплыл дальше в глубину интернета и Ютуба))).
Я не зря написал про книгу "Исскуство объяснять". Всё, что вы знаете и хотите кому-то объяснить необходимо привести в такой вид, чтобы это поняли как можно больше людей. С разными уровнями знания. Тогда вас ждёт успех.
P.S. на вопрос ребёнка откуда берётся дождь, можно ответить по разному. И про конденсат и о разном состоянии воды и т.д. Но он не поймёт))) А если привести пример с чайником из которого идёт пар и поднимается вверх, а после капельками падает вниз. То поймёте не только ребёнок, но и все кому и первый вариант объяснения не подходит, в силу наличия знаний.
@@denzelkoshuba5702 Ваше желание понятно, но к сожалению не возможно взять и в один момент все понять это приходит только с опытом и практикой. А объяснять это придется очень долго, даже если очень стараться.
@@denzelkoshuba5702 а вы попробуйте объяснить ребенку как решать дифференциальные уравнения, а не откуда берется дождь. Это примерно тоже самое. Хотели без основ решить задачу уровнем повыше вот вам и результат. Если опускаться в уроке до разбора элементарного синтаксиса, на это уйдет несколько часов и появятся другие недовольные. Объяснение вполне адекватное, сравните с другими горе учителями в сети
Олег, в первую очередь огромное спасибо! Все очень интересно и полезно, много чего узнал нового
у меня также есть к вам вопрос - вы продемонстрировали парсинг на примере "View All", что следовало бы изменить в скрипте в случае если бы этой опции не было бы (как это часто бывает на других страницах) и нам пришлось бы обратиться к "Next 100" если говорить на примере этого же сайта
я попытался также добавить колонку с линзами как источник информации для каждой из валют, но не смог. посоветуйте пожалуйста как решить эти два вопроса - а именно переходить по страницам и как добавить колонку с ссылками как источник инфо
Спасибо.
Про работу с пагинацией было в видео про парсинг Авито.
Что такое линзы я не знаю, но в любом случае, добавление дополнительных данных должно осуществляться аналогичным образом.
Спасибо тебе за видео!
Огромное спасибо. Не понял только почему у меня в этой табличке нет значений? Или всего несколько названий и все? Код в точности такой же, также сверялся с сайтом -ничего не поменялось. В чем может быть проблема?
проблема в том, что вы где-то ошиблись.
У меня такая же хрень. До 37-40 нормально, а потом пустые значения... Банят значит))
не факт, что у него такая же проблема.
чтоб это всё работало нужно ещё lxml библиотеку иметь pip install lxml
АЙ как все хорошо ,,,, ммм ,,, просто волшебно ,,, я счастлив ,,, БЛАГОДАРЮ
Олег видео шикарно. Понятно и главное доступно. Вопрос а возможно ли каждый процесс допустим через проксю пустить? На много код увеличится?
Есть видео по использованию прокси.
Код практически не отличается, т.к. просто запрос к серверу идет через прокси.
на сайте ддос защита висит теперь. Целое утро искал способ обойти cloudflare, у меня ни один не сработал. Единственный способ который я нашел это парсить примерно раз в 5 сек в одном потоке.
спасибо за урок ! лайк
37:54 тут начинается жара)
Спасибо!
Пересмотрел почти все видео, всё отлично. Не хватает чуть-чуть, а именно рассмотреть архитектуру. На пример патерны. Но не хочется смотреть пустые примеры, а вот на примере парсеров на мой взгляд было бы круто. И полезно, и приятно.
@@vyacheslav_kapitonov Делаешь полный цыкл парсинга для одного аккаунта, с авторизацией. И уже этот готовый парсер запускаешь в нескольких процессах.
@@vyacheslav_kapitonov ограничение запросов в секунду - sleep(random.randint(2,5))
Несколько аккаунтов - добавить разный прокси на каждый аккаунт
@@vyacheslav_kapitonov Ну так заходи под вторым аккаунтом
@@vyacheslav_kapitonov Вы на меня тратите время? Зачем вы вообще ко мне обращались? А вообще у вас неправильное понимание процесса парсинга. На каждый процесс, один аккаунт, один прокси. На другой процесс другой аккаунт и так далее.
Здравствуйте, Олег! Спасибо вам за ваши уроки! Но как быть, если надо скачать картинки и сохранить их в соответствующую папку, путь к которой будет указан в колонке images, в файла csv ? Спасибо, буду благодарен!
я думаю для этого лучше нужно использовать aiohttp
спасибо за хороший урок !!
Вопрос: как найти таблицу, у которой нету класса или id?( Почему-то, если просто указать как аргумент только 'table', не находится((
Прописать путь через xpath
В конце вообще топ
кто нибудь может суинуть актуальную версию кода:
tds = soup.find('div', class_=' ') и тд
правильнее написать в строке 13 # pip install beautifulsoup4
да, верно. Опечатка.
Спасибо, кайф
спасибо, все понятно
Отлично, а по Scrapy не планируется видео?
А разве не затратно каждый раз для записи в файл заново его открывать и закрывать? Может лучше сделать сразу общий список для всех словарей и потом просто его записать в файл?
я, вроде бы, об этом прямо говорил... уже не помню.
Да, это затратно по времени и ресурсам. И да, быстрее все записать в список, а потом записать его в файл.
Я просто показываю принцип, как это сделать. Это не рецепт.
Подскажите, как можно забрать кусок кода вместе с тегами, что бы его потом записать в csv
надо писать pip install beautifulsoup4
Привет! Не знаю, актуально ли, но селениум (как минимум, на питоне) умеет составные айдишники пережевывать, просто вместо пробелов надо точки поставить...
увидеть бы парсер ютуба с api по поисковому запросу. сылки на видео было бы здорово
Хотел бы поинтересоваться сможете ли рассказать как работать с сайтом при двухфакторке. Пока нашел для себя выход с использованием selenium. Но возможно имеются другие способы?
Можно исходный код скрипта? Хочется сравнить по скорости с аналогом на Node.JS
У меня его больше нет.
Я не храню такие скрипты - в этом нет никакого смысла
Добрый вечер можете сделать урок как сделать парсинг ютуб каналов
_Добрый день, Олег. Вы когда-нибудь делали парсеры для 2гис?_
Если я правильно понимаю, сейчас структура сайта изменилась и строка tds = soup.find('table', id='currencies-all').find_all('td', class_='currency-name') уже не актуальна. Но я никак не могу понять, как будет верно :( Подскажите, пожалуйста!
Помогло замена строчки на:
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')
@@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
@@vladjasvki2148 Спасибо тебе ! Может сейчас заработает :)
@@vladjasvki2148 Можешь обьяснить почему ты выдернул это и сделал так ? А не как выше писали
@@АлексейАнохин-е2г Да долгий класс у него какой то вышел, не помню точно, но вроде с тем классом , что выше , у меня не находило ,что мне надо, поэтому взял другой класс. У вас всё получилось?
Подскажи пожалуйста, у меня следующая проблема. На 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?
Не могу установить 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
pip freeze
что выдает?
Vitaly Kholodov , если я правильно понял, используйте pip3 а не просто pip. Я на Вин10 давно ставил, но именно из-за этого ловил кучу проблем)
beautifulsoup4==4.6.0
certifi==2017.4.17
chardet==3.0.4
idna==2.5
requests==2.18.2
urllib3==1.22
вот... BeautifulSoup у вас установлен
Но from bs4 import beautifulsoup выделен серым цветом, beautifulsoup подчеркнут волнистой красной линией
Знать бы в 2016 году, что можно было купить хотя бы несколько десятков эфира!))
счетчик мы из процесса убрали... а как его обратно вернуть для мульти процессинга?
оперативку мы видели 42,5МБ, что с CPU и LAN?
Олег, скажите как получать обновления сайта, мониторить его обновления? Его надо спамить запросами, или еще как?
ставишь таймер например заходить раз в сутки и проверять данные если есть изменение запускать скрипт парсинга
Думаю в функции get_all_links лучше было бы использовать генератор списка вместо цикла
Получился рабочий парсер, но все значения в 1 столбце, пробовал delimiter = ',' - не помогло. Подскажите как записывать в разные столбцы переменные name и price
у вас ошибка в коде. Проверьте еще раз все.
что-то не пойму, а что вот этот кусок кода делает?
if _name_ == ' _main_ ':
main()
Traceback (most recent call last):
if _name_ == ' _main_ ':
NameError: name '_name_' is not defined - ошибка....
я этого не писал.
Есть отдельное видео на эту тему - посмотрите в плейлисте "Python casts"
да, уже нашел, все работает, спасибо. Очень интересные видео!
Что делать если одинаковые имена атрибутов ( классы/id и т.д), но данные хранящиеся в них разные ? Как достать информацию например с 5-того класса отдельного блока, которое имеет идентичное имя ( надеюсь Вы меня понимаете ) ?
_выбери все и укажи порядковый номер_
id всегда уникален и можно прямо указывать номер класса, тебе ООП нужно, посмотри в jquery как всё это находится
боже мой... вы хоть сами понимаете, что вы пишите?
Какое еще ООП? Какой jquery? Здесь о CSS-классах речь идет.
Ахах, убило просто :)))))
Что вас так веселит , парни? Человеку нужно объектное ориентирование понять. Если ему сложно это на питоне, то легче всего будет на примере CSS разобраться, согласен. Я написал про jquery - мне так веселей было и материала куча с примерами, поймёт сразу всё и с питоном потом легче будет.
Графики как парсить
Олег здравствуйте.
А подскажите по количеству процессов. В уроке вы используете 40 процессов. А вообще от чего зависит количество процессов? Например на 2х или 4х ядерном процессоре, как подобрать количество процессов ? Если я сделаю например не 40, а 100 или 500 процессов, но у меня 2х ядерный процессор и допустим нет ограничения в ОЗУ. Они же не будут все выполнятся одновременно.
Может где то можно про это почитать в русскоязычной литературе? А то языком вероятного противника пока владею слабо.
Добрый день, Борис
Я это количество просто выдумал. Подумалось, что так разница во времени будет нагляднее.
Ограничение в памяти все-таки есть. Насколько я помню 40 процессов отъели около 1,5 ОЗУ. Мне кажется, что это много.
Они стартуют по-очереди, но при длительной работе эта разница во времени старта сглаживается. Выполняются они, можно сказать, одновременно.
Нагрузка на процессор тоже возрастает, поскольку этим процессам приходится делить между собой процессорное время.
Где об этом почитать - не могу вам сказать.
Я пробывал на своем компьюторе разбивать на процессы функцией Pool.1 процесс длился 1 сек, всего процессов было от 1500 до 3000(это предполагаемый объем строк, который я хотел парсить). Быстрее всего парсер работал от 60 до 120 процессов( для конкретной задачи получается разное оптимальное количество процессов). Когда ставил 1000 процессов, компьютер зависал. 1 процесс занимал 5Мб оперативной памяти.
Олег, здравствуйте! Подскажите, чем отличается этот бесплатный курс от платного, выложенного Вами? Какие преимущества платного курса? Стоит ли сначала проходить этот цикл видео для поднятия, собственно, платного материала?
у меня нет бесплатного курса.
А в платном больше материала, чем здесь на RUclips
_Добрый вечер, Олег. Скажи, пожалуйста, как данные в excel под виндой записывать?_
так же
_я имел ввиду excel файл , а не csv_
Роман Белов библиотека pandas
В файл csv имя и цена записываются в одну ячейку ([имя, цена]). Как сделать в 2 ячейки ([имя][цена])?
з.ы. Спасибо за видео!
у нас есть словарь {'name': 'vasja', 'surname': 'pupkin'}
чтобы записать это в csv в две ячейки
writer.writerow( (our_dict['name'],
our_dict['surname']
))
Вряд ли я это в видео написал по-другому.
Функция записи на вход принимает исходный словарь.
Метод csv-писателя принимает кортеж - будьте внимательны.
Спасибо за ответ. Да, на видео так и было. Просто совсем не знаком с csv. Оказывается, можно было выбрать разделитель ",".
Никак не пойму , а как сделать такую многопоточность с респонсом 200.соответственно 200 строк за раз
Здравствуйте, подскажите можете объяснить условие с if. Что таке __name__?
ruclips.net/video/cW_-zGG4ef4/видео.html
@@bakhtiyartayirov2685 спасибо
_Олег, добрый вечер. Можно ли в парсинге использовать многопоточность?_
Добрый день,
Вы имеете в виду multithreading?
Да, можно.
Но при использовании multiprocessing можно использовать несколько ядер. А потоки в Python привязывают нас к одному ядру.
Олег Молчанов, я не совсем понимаю как это сделать. сначала ф-ция собирает все данные в один список, а дальше это список другая ф-ция через многопоточность разбирает в несколько процессов? можете сделать видео на эту тему?
для этого не обязательно делать многопоточное приложение.
В вашей задаче сбор данных и их разбор - это последовательные процессы.
Или вы имеете в виду асинхронность?
Если вы имеете в виду асинхронность, то requests так работать не может
_я хотел именно сбор данных. чтобы это быстрее как-то происходило._
Все-таки я не очень понял проблему. Чем не подходит мультипроцессинг?
Из недостатков у него только расход оперативной памяти.
9:09 должно быть pip install bs4
www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-beautiful-soup
@@zaemiel Я пишу bs4, мне норм :)
Добрый день, уважаемый Олег! У меня появилась проблема в коде на 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()
Код, конечно, лучше заливать на какой-нибудь сервис типа pastebin и т.п.
Мне кажется, что у вас у условия if _name_ только одно подчеркивание, а нужно два.
Парсинг в итоге продвигается или нет?
Олег Молчанов создаётся файл таблицы и просто записываются названия валют и все. Добавил второе нижнее подчеркивание и результат тот же
т.е. данные парсятся?
Олег Молчанов да, но только название валюты
Значит у вас не отрабатывается это условие:
writer.writerow( (data['name'],
data['price']) )
print(data['name'],'parsed')
Желательно, чтобы вы выяснили сами причину того, почему data['name'] записалось в файл, а data['price'] нет.
Если я вам это скажу, вы ничего от этого не получится.
В любом случае, чтобы я мог посмотреть ваш код скопируйте его, пожалуйста, на Pastebin
Так он выглядит нормальным, вроде.
Олег, отличное видео. Но возникла 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}
это может быть связано и с операционной системой и с офисом и тем как он интерпретирует csv.
Откройте csv в каком-нибудь редакторе кода или блокноте, если вы видите данные, указанные через запятую, то все нормально и проблема в Офисе и в Операционной системе.
Решений два.
1. Панель управления - Часы, язык и регион - Изменение форматов даты, времени и чисел - Дополнительные параметры - вкладка "Числа" пункт "разделитель элементов списка"
У вас там стоит точка с запятой, скорее всего
2. Открываете в Экселе новый файл - Данные - Импорт внешних данных - находите свой файл csv и кликаете кнопку Готово.
Откроется мастер импорта на 2-м шаге вы снимаете галку с точки с запятой и ставите на запятую.
На третьем шаге проверьте формат данных каждой колонки - лучше поставить для всех текст.
Олег, спасибо Вам большое. Буду советовать всем друзьям Ваш канал)))
сейчас пытался воспроизвести, понялл, что код сайта изменился, пытаюсь так же найти нужную таблицу, а не выходит( помогите, как решить проблему
чуть выше код написал