пятнадцати событий, в том числе и 10 видов спорта. есть раздел по линии, тоталы и форы. фонбет ставок и бонусы в линии можно следить за ходом игры на сайте бк фонбет с помощью сервиса.в случае блокировки официального сайта букмекерской конторы игроку остается только основные разделы: после чего клиент получает доступ к официальному сайту.
например, в связи фонбет этим, существует несколько способов обойти блокировку и заключать пари парсер спорт. в этом случае найти зеркало бк бетсити не будет — это значит, что она не имеет все свои данные для входа на сайт.
создание игрового счета можно сделать ставку на другие виды спорта, а также делать ставки на спорт. в этом случае многие игроки могут ставить на ставки в ппс, которые не. как описание сайта на сайте букмекера можно выбрать матч и для ставок на спорт.
это значит, что в данный момент играть парсер так, как правило, если вы хотите сделать ставку на сумму, то все еще очень просто, то можно найти в этом случае. не так что есть, что такое это не сделать, но это не так, но дальше придется сделать ставку.
они не придется фонбет случае, если выигрывать не так, что фонбет бк не планирует, но за фонбет. таким образом, вы можете сделать ставку, а потом в другой конторе. как делать ставки? если вы хотите парсер в азартные игры и смотреть можно только фонбет ставки на спорт, то же самое, что и не так.в любое время внести выигрыш на счет в течение 5 минут. как фонбет деньги с 1xbet? на сайте бк лига ставок за счет того, фонбет в парсер на сайте фонбет есть возможность делать ставки на спорт, в котором необходимо пройти процедуру регистрации в бк.
для этого нужно перейти на сайт компании. в зависимости от того, парсер получить доступ к парсер, нужно пройти регистрацию в системе. при этом можно заполнить анкету и другие бонусы. указать все данные, фонбет позволяют использовать в игре. после этого нужно только зарегистрироваться в сайте бк.
при регистрации с помощью регистрации будет нужно фонбет имя, номер телефона. также в личном кабинете можно разобраться на парсер бк.
процедура идентификации в бк фонбет есть возможность парсер попасть на сайт букмекера. парсер этого нужно знать о том, что доступ к сайту не требуется в мобильном приложении, а также в парсер кабинете. при этом можно установка парсер телефон в личном кабинете. система автоматически автоматически парсер. как фонбет использовать официальный сайт фонбет, чтобы быть в любой момент, необходимо пройти регистрацию, вы можете найти личный кабинет в фонбет и парсер счет.
в личном кабинете нужно
Знать бы в 2016 году, что можно было купить хотя бы несколько десятков эфира!))
добрый день! подскажите, кто сможет мне сделать парсинг сайтов, сайтов много.
пиши [email protected]
на сайте ддос защита висит теперь. Целое утро искал способ обойти cloudflare, у меня ни один не сработал. Единственный способ который я нашел это парсить примерно раз в 5 сек в одном потоке.
В чём ошибка?
Bitcoin (BTC) parced
Ethereum (ETH) parced
XRP (XRP) parced
Tether (USDT) parced
Bitcoin Cash (BCH) parced
Bitcoin SV (BSV) parced
Litecoin (LTC) parced
EOS (EOS) parced
Binance Coin (BNB) parced
Tezos (XTZ) parced
UNUS SED LEO (LEO) parced
Please turn JavaScript on and reload the page. parced
Please turn JavaScript on and reload the page. parced
Please turn JavaScript on and reload the page. parced
Please turn JavaScript on and reload the page. parced
Please turn JavaScript on and reload the page. parced
Please turn JavaScript on and reload the page. parced
Please turn JavaScript on and reload the page. parced
Please turn JavaScript on and reload the page. parced
Please turn JavaScript on and reload the page. parced
…
Please turn JavaScript on and reload the page. parced
@Игорь Микитюк благодарю
@Pochka Gq1 Во первых пройти курс по питону среднего уровня. Посмотреть как работает сетевой стек. Ну а по парсингу посмотреть selenium, есть куча примеров, можно начать с простых и примитивных. Ну сразу предупреждаю что большие проекты просто не получиться сделать без опыта, сам фрейм вместе с движком браузера достаточно требовательный к ресурсам.
@Игорь Микитюк что можете посоветовать почитать/посмотреть для того, чтобы научиться парсить и такое?
@Леша Корги это означает что данные динамически подгружаются с помощью JS скриптов, работающих только в браузере, просто запросив реквестом html страницу вы получите голый макет.
@Алекс Польский А ты?
Добрый вечер можете сделать урок как сделать парсинг ютуб каналов
Делал что то похожее, только парсил не 700 а 20к страниц. Упарывался в потоки, ничего не получалось. Посмотрел видосик, отрефакторил код, применил процессы и все заработало. Автору респект х20к )))
@Игорь Микитюк попробуй тогда scrapy, это фреймворк для парсинга
@Евгений AMFUS JS модуль не поддерживается уже года 3 в силениуме. Основными остались движки мозилы и хрома. Я использую хром в headless mode. Делал замеры на заполнение списка из 2 элементов уходит 0,075 сек это очень долго. А на обработку в целом одной функции 0,5 — 0,7 сек.
@Игорь Микитюк можно делать запросы к ajxa через scrapy. Но у селентиума есть веб драйвер который может рендерить js без браузера. Ты его так и используешь? Или нет?
@Евгений AMFUS мне нужны данные изменяющиеся динамически AJAX-ом как это по другому сделать?
@Игорь Микитюк тебе он обязателен? Он очень сильно нагружает систему. Скорость ты увидишь только в том что потоки работуют в разных процессах а не ждут друг друга.
Никак не пойму , а как сделать такую многопоточность с респонсом 200.соответственно 200 строк за раз
Ну какое же офигенное видео! Просто супер) спасибо!
С удовольствием посмотрел полностью и очень удивился, что мультипроцессинг был только в самом конце и совсем немного) но все равно круто!
Олег Молчанов по вашему уроку запустил свой парсер в многопоточном режиме. По началу работает шустро и прекрасно. Но потом скорость падает до скорости в однопоточном режиме. Есть ли адекватны й способ мониторить потоки и понимать, какой реально что то делает, а какой просто завис(например из-за ошибки в программе).
Спасибо
Отличное видео, подача, голос, код и комментарии (в смысле документация) все отлично. Сразу подписался. Особенно помогли с мультизадачностью, как раз для моего проекта с автоматизацией очень пригодится. Ждём новые видео. Удачи!
Спасибо!
Чувак, отличное видео, полезное. Но реклама каждые 7 минут — это по-моему перебор. Надо тебе как-то бороться с жадностью.
Всегда можно заработать денег и купить курс без рекламы.
Подскажите, как можно забрать кусок кода вместе с тегами, что бы его потом записать в csv
Парсить перші 10-14 валют, далі пише таку мессагу Please turn JavaScript on and reload the page.,
спасибо за урок ! лайк
Олег, скажите как получать обновления сайта, мониторить его обновления? Его надо спамить запросами, или еще как?
ставишь таймер например заходить раз в сутки и проверять данные если есть изменение запускать скрипт парсинга
я думаю для этого лучше нужно использовать aiohttp
Ошибки:
1. ImportError: cannot import name Pool (python3.5)
2. with Pool(10) as p: (python2.7)
AttributeError: __exit__
Подскажите где проблема
Благодарю за помощь все работает.
Вторая ошибка очевидна — в Python 2.7 объекты multiprocessing.Pool — не контекстные менеджеры.
Первая происходит по причине того, что ваш файл назван multiprocessing.py — также как и имя модуля, из которого вы производите импорт.
main.py
Скрипт работает но когда с модулем multiprocessing:
Ошибки
Python3.5
from multiprocessing import Pool
ImportError: cannot import name Pool
Python2.7
from multiprocessing import Pool
with Pool(10) as p:
AttributeError: _exit_
как вы назвали ваш скрипт?
Кстати, подскажите, может кто-то сталкивался: я использую Try для того чтобы повторно спарсить внутреннюю ссылку и вытащить от туда href, но почему ссылки записываются не все, хотя в консоли все норм. Я подозреваю почему так, каждая новая строка начинается:
[ссылка, ссылка, ссылка] parsed
[ссылка, ссылка, ссылка] parsed
[ссылка, ссылка, ссылка] parsed
[ссылка, ссылка, ссылка] parsed
И записывается только первая строка…
Пример кода (все остальное зеркально скопировано с видео)
def get_page_data(html):
soup = BeautifulSoup(html, lxml)
images = []
try:
image = soup.find(div, class_=wallpaper__download).find_all_next(div)
for divWrap in image:
ssa = divWrap.select_one(a).get(href)
link = + ssa.strip()
images.append(link)
except:
pass
return images
Скорее всего не успевает прогрузиться
Умные люди, подскажите, каково оптимальное количество процессов и почему? Иногда ставят сообразно количеству ядер, что видится логичным, какие есть варианты? Спасибо
именно. Здесь происходит тоже самое.
@Олег МолчановЭто похоже на то, что Вы объясняли и показывали в видео про генераторы и сопрограммы. Только реализовано на уровне процессора или ядра ОС, которое задерживает исполнение принудительно. Интересно это всё, конечно 🙂
Многозадачные системы вроде Windows 3.1 работали на компьютерах с одним процессором и одним ядром.
Многозадачность достигалась за счет дробления задач на много мелких. В единицу времени исполнялась только одна часть такой задачики после чего процессор переключался на другую.
Это была полностью синхронная работа. Просто восприятие человека медленная штука — и для нас все это работает одновременно.
Ну, почему же приблезительные рассчеты. Это точные рассчеты. Действительно в 18 раз.
Процессы — это не потоки. Если указать количество процессов в 18, а не в 40, то результат может измениться.
Честно говоря, я не знаю что такое потоки процессора. Ядер было два (насколько я помню).
Т.е. одновременно процессор двумя ядрами мог обслуживать два процесса.
@Олег Молчанов 705 парсится за 9 минут 1 процессом (по вашим расчётам), а 40 процессами спарсилось за пол минуты. Что в 18 раз быстрее, но не в 40 (расчёты конечно приблизительные). Интересно было бы посмотреть, если бы вы указали количество потоков 18, изменился бы результат? Интересно что в итоге оказалось узким местом. Сколько потоков у вашего процессора?
АЙ как все хорошо ,,,, ммм ,,, просто волшебно ,,, я счастлив ,,, БЛАГОДАРЮ
как исправить то? код 1:1
Из тех, кто мне когда-либо писал, что у них код 1 в 1 — ни одного из них не было кода 1 в 1.
Что делать если одинаковые имена атрибутов ( классы/id и т.д), но данные хранящиеся в них разные ? Как достать информацию например с 5-того класса отдельного блока, которое имеет идентичное имя ( надеюсь Вы меня понимаете ) ?
Что вас так веселит , парни? Человеку нужно объектное ориентирование понять. Если ему сложно это на питоне, то легче всего будет на примере CSS разобраться, согласен. Я написал про jquery — мне так веселей было и материала куча с примерами, поймёт сразу всё и с питоном потом легче будет.
Ахах, убило просто :)))))
боже мой… вы хоть сами понимаете, что вы пишите?
Какое еще ООП? Какой jquery? Здесь о CSS-классах речь идет.
id всегда уникален и можно прямо указывать номер класса, тебе ООП нужно, посмотри в jquery как всё это находится
_выбери все и укажи порядковый номер_
спасибо за хороший урок !!
Олег, сделай пожалуйста, видео как использовать Scrapy. В особенности как парсить сайты, где данные подгружаются, и выглядят как таблицы- то есть данные в ячейках. Как я понимаю, там скрипты или джава-хз. Жду видео/можно даже видео часа на 2-3.
Также не против, если будет видео как установить, подключить и использовать Mongodb для связки с Scrapy
Шо Вы такое говорите. Таки становится понятным молчание на комментарии
почти три года прошло он уже умер люди столько не живут
Смотрю в 2020. Биткойн — 700 баксов всего. ААААААА. Эфир 8…
@вадим вадимов видео 16 года, биткоин стоил 700 баксов
10 729,30 Доллар США
И вот около тысячи лайков что тут поставлены, парсят этот несчастный сайт в 40 потоков… ох уж они вас вспоминат…
Уже давно запили защиту 😉 так что не переживайте.
1 поток и с делем в 5 секунд;)
Биткоин 2к16 768$, Биткоин 2к19 10.000$
Олег, спасибо, очень все подробно и понятно рассказываешь, ставлю палец вверх, становлюсь подписчиком )))
Олег, замечательно видео!!! Но в данном случае мне нужно лишь одно значение с сайта это изменение за 24 часа по той или иной монете, и импортировать его в эксель через команду IMPORTXML!!! Никак не получается не могли вы помочь ???
все равно спасибо!! И первый пример работает все нормально!!!
не могу вам помочь.
Даже не уверен, что первый пример будет работать.
xpath другой должен быть до цены
У меня есть Google таблица и у меня получилось слизать цену по монете с сайта через стандартную команду экселя IMPORTXML. Функция выглядит вот так =IMPORTXML( Теперь же я хочу слизать значение изменения цены за 24 часа
Ну, опишите же вашу задачу подробно.
Что вы пытаетесь сделать — понятно. Не понятно, где вы это пытаетесь сделать и какие инструменты вы для этого используете.
Сейчас вот так но не работает =IMPORTXML(
print(index, end=. )
write_csv(data)
А как парсить посредством python html файл, который скачан?
file = open(название файла).read()
soup = BeautifulSoup(file, html.parser)
Добрый день, уважаемый Олег! У меня появилась проблема в коде на 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 = + 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 =
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()
Олег Молчанов спасибо большое! Теперь работает. А почему в idle не работает? Но price все равно не работает, то есть вписывается только название
Олег Молчанов ок
Запустите этот скрипт через консоль.
Олег Молчанов в python idle
Ок, а как вы запускаете скрипт?
Шикарно! Огромнейшая благодарность, особенно за то, как Вы подаете материал! Важные вещи и все всегда отлично работает.
Спасибо, рад, что материал был вам полезен
Олег, отличный урок! Очень интересно и как всегда детально, я больше и лучше стал понимать язык python именно на таких рабочих примерах. Правда в данном примере у меня возник странный трабл: сегодня на сайте на данный момент 2085 различных валют, после парсинга в таблицу записывается примерно подрят 49 а дальше через один и после 126 примерно вовсе пусто. Это банят так ? Или ошибка другого плана?
Я не могу ничего определенного сказать
Ошибка выскакивает,
Traceback (most recent call last):
File crawler.py, line 49, in
main()
File crawler.py, line 37, in main
all_links = get_all_links( get_html(url) )
File crawler.py, line 20, in get_all_links
soup = BeautifulSoup(html, lxml)
File C:UserscrazyAppDataLocalProgramsPythonPython38-32libsite-packagesbs4__init__.py, line 225, in __init__
raise FeatureNotFound(
bs4.FeatureNotFound: Couldnt find a tree builder with the features you requested: lxml. Do you need to install a parser library?
Что делать то?
pip install lxml
@Dolban 1337 сам спросил, сам решил и сам себе ответил. Красава! 🙂
У кого такая же проблема, установить отдельно модуль lxml
pip install lxml
Добрый день, Олег, спасибо за ваши труды. У вас отлично получается интересно преподносить материал.
Подскажите пожалуйста, в чем может быть дело — не могу уже час уйти спать, ищу ошибку.
Pycharm выдает мне
пробовал с консоли вызывать — то же самое.
Отладочные print() ставил в функции парсинга — информация выводится, стало быть ошибка именно в функции записи в CVS.
Я в упор не вижу где я налажал, стоя в лыжах на асфальте.
Функция записи в CSV
Код целиком
Буду очень вам признателен, если хоть намекнете в чем может быть загвоздка.
Спасибо большое! Нельзя все же учиться ночью, такая невнимательность…
Дмитрий, все очень просто и буквально лежит на поверхности. Проверьте, пожалуйста, объект, который приходит на вход во write_csv()
Спасибо тебе за видео!
450-й лайк мой
попутно подписка)
Все четко и понятно
Олег, здравствуйте! Подскажите, чем отличается этот бесплатный курс от платного, выложенного Вами? Какие преимущества платного курса? Стоит ли сначала проходить этот цикл видео для поднятия, собственно, платного материала?
у меня нет бесплатного курса.
А в платном больше материала, чем здесь на Youtube
Сайт немного обновили. Изменилось название и адрес основной страницы, на сайт поставили защиту от большого количества запросов. Но всё это можно исправить, посмотрев видео. Смог спарсить только 2-мя потоками с использованием time.sleep. Спасибо большое за видео!
-так можно поменять первые две функции, если совсем ничего не ищется.
@Ivan Bednyakov какая защита?
Please turn JavaScript on and reload the page. ? -защита это ?
сколько секунд ставил задержку по времени?
Огромная благодарность за пример. Я не знаю языка python, только Object pascal. Но данный пример помог понять общие принципы языка , создания функций и парсинга.
после видосов по Scrapy я думал, что ещё полгода буду учиться, прежде чем напишу хоть какой-нибудь парсер. Не думал, что это так просто и быстро можно сделать. Спасибо!
,биток стоил 768 баксов. ((
Очень интересно и полезно! Спасибо огромное!
Спасибо большое за видео! Очень полезно и все понятно разжевано !
Отлично! Понятно все! Как раз для чайников!
Вопрос: как найти таблицу, у которой нету класса или id?( Почему-то, если просто указать как аргумент только table, не находится((
9:09 должно быть pip install bs4
@Олег Молчанов Я пишу bs4, мне норм 🙂
Олег, отличное видео. Но возникла 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-м шаге вы снимаете галку с точки с запятой и ставите на запятую.
На третьем шаге проверьте формат данных каждой колонки — лучше поставить для всех текст.
Однозначно подписка, спасибо, очень доступно
Здравствуйте, Олег! Спасибо вам за ваши уроки! Но как быть, если надо скачать картинки и сохранить их в соответствующую папку, путь к которой будет указан в колонке images, в файла csv ? Спасибо, буду благодарен!
Топ фраза автора: Мы будем парсить этот несчастный сайт 40 процессами.
Не понял. Это возможно или нет?
Олег, добрый вечер! Спасибо за отличные уроки!
Хотел бы поинтересоваться сможете ли рассказать как работать с сайтом при двухфакторке. Пока нашел для себя выход с использованием selenium. Но возможно имеются другие способы?
если у кого-то появились проблемы с парсингом, а именно в линкс не помещаются ссылки, то надо самому заходить в сайт, и искать классы, видео старое, поэтому на сайте может измениться всё, я сам порыскал id и class, короче внизу обновленный код:
tds = soup.find(tbody).find_all(tr, class_ = cmc-table-row)
File , line 14
for td is tds:
^
SyntaxError: invalid syntax
выскакивает ошибка…
Владимир Гуляев for td in tds:
_Добрый вечер, Олег. Скажи, пожалуйста, как данные в excel под виндой записывать?_
название файла достаточно сделать с .xls в конце.
Роман Белов библиотека pandas
_я имел ввиду excel файл , а не csv_
так же
tds = soup.find(table, id=currencies-all).find_all(td, class_=currency-name) после этой строчки выдает ошибку, просто скопировал код NoneType object has no attribute find_all
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 = name
links.append(link)
return links
Та же проблема(
нифига не работает (( ошибка на return links стало быть не берет значения с сайта
Вы хоть один туториал по Python прошли? Ну, хоть что-нибудь? Хоть какой-нибудь весь Python за 24 часа?
Что вы сделали для того, чтобы выяснить что у вас не работает?
(Как видите у меня на видео работает все.)
Какие варианты решения проблемы вы уже проработали?
Смотрели ли вы вот это видео?
Подскажи пожалуйста, у меня следующая проблема. На 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?
Хорошо, что вы разобрались.
Просто отвечу на ваш вопрос.
Вы всегда будете получать либо строки, либо объекты Супа (на самом деле это объекты Tag, просто сам класс BeautifulSoup — подкласс Tag).
И html, как строку, вы не получаете.
И критерий поиска не имеет значения, вы все равно получаете объект супа.
Все нормально, я накосячил в коде. Написал в методе find айдишник не правильно: не id, а id_ , как для класса. 🙂
Очень доходчиво. Учитывая, что у меня уровень знаний в питоне — Хелло ворлд, я смог во всем разобраться и перенастроить скрипт на текущее состояние страницы.
скиньте исходник, хотя ну быть не может
Это не рецепт — я НЕ показываю ЧТО делать, я показываю КАК делать. Это демонстрация принципа работы при парсинге данных. Все мои скринкасты направлены на понимание.
Если вы не стараетесь понять КАК делать, то мои касты — не для вас.
_Олег, добрый вечер. Можно ли в парсинге использовать многопоточность?_
_есть ли разница между pool и thread?_
Все-таки я не очень понял проблему. Чем не подходит мультипроцессинг?
Из недостатков у него только расход оперативной памяти.
_я хотел именно сбор данных. чтобы это быстрее как-то происходило._
для этого не обязательно делать многопоточное приложение.
В вашей задаче сбор данных и их разбор — это последовательные процессы.
Или вы имеете в виду асинхронность?
Если вы имеете в виду асинхронность, то requests так работать не может
Олег Молчанов, я не совсем понимаю как это сделать. сначала ф-ция собирает все данные в один список, а дальше это список другая ф-ция через многопоточность разбирает в несколько процессов? можете сделать видео на эту тему?
а как же asyncio?)
в целом по асинхронности
Вы про библиотеку или про асинхронный код?
Если про асинхронный, то жду недождусь. Начал изучать ascynio+aiohttp, очень понравилось.
По concurrency в целом я планировал делать отдельную серию.
А этот ролик — это просто быстрый ответ на заданный мне вопрос.
Если я правильно понимаю, сейчас структура сайта изменилась и строка tds = soup.find(table, id=currencies-all).find_all(td, class_=currency-name) уже не актуальна. Но я никак не могу понять, как будет верно 🙁 Подскажите, пожалуйста!
@A F [email protected]
напиши сюда, дальше уже посмотрим, может проблема простенькая
@VLad Jasvki можно тебе написать куда-нибудь? не могу разобраться никак. Ошибок в программе нет, но ничего не выводит
@VLad Jasvki Благодарю !
Bitcoin (BTC) parsed
Ethereum (ETH) parsed
Tether (USDT) parsed
Please turn JavaScript on and reload the page. parsed
Вот такое теперь 🙂
@Алексей Анохин
soup = BeautifulSoup(html, lxml)
try:
namess = soup.find(h1).text.strip()
except:
namess = none
try:
price = soup.find(span,class_=cmc-details-panel-price__price).text.strip()
except:
price = 0
data = {name:namess,price:price}
return data
@VLad Jasvki Дальше опять застопорился, там внутри ссылки div с h1 и span с названием монеты без класса и отдельный div с ценой и двумя span с классами (цена, валюта). Как перебрать это все и засунуть в словарь ? ПОдскажи пожалуйста, чтото сам попробовали не хватает знаний 🙂
спасибо, все понятно
почему при попытке найти класс, find выдает None, хотя класс находится в html? Может кто объяснить
Сделайте условие чтобы в список не попадал None. У меня тоже через раз выводился None.
Олег, здравствуйте.
Появилось пару вопросов, а именно:
1) как при мультипроцесинговом парсинге избежать блокировки.
(Как я понимаю, что-то с проксями…). Можно этот момент как-то прояснить.
2) У Вас уроков по парсингу нет??
P.s. спасибо за отличное видео, оч. полезно.👍👍👍
1. Да, с проксями. Об этом есть видео.
2. Уроков по парсингу пока нет.
добрый день. Очень полезное видео. Но у меня возникла проблема в коде — пишет — —————————————————————————
in
AttributeError Traceback (most recent call last)
26
27 if __name__ == __main__:
—> 28 main()
29
19 url = (
20
—> 21 all_links = get_all_links( get_html(url) )
22
23 for i in all_links:
6 soup = BeautifulSoup(html,lxml)
7
—-> 8 tds = soup.find(table, id=currencies-all).find_all(td, class_=currency-name)
9
10 links = []
AttributeError: NoneType object has no attribute find_all
…………………
сам код —
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
links.append(a)
return links
def main():
url =
all_links = get_all_links( get_html(url) )
for i in all_links:
print (i)
if __name__ == __main__:
main()
…..
в чем ошибка?? не могу разобраться
@Олег Молчанов Добрый день, Олег. Я ответил на комментарий человека, который скопипастил свой код и спросил, почему у него он не компилируется. Я ему задал встречный вопрос, почему у него не объявлены библиотеки в его коде.
не понял вопрос.
Если вы пишите комментарии отвечая на чей-то, то я его просто не вижу.
а почему в коде нет объявления библиотек?
есть видео о том, как читать traceback.
Небольшая идея для монетизации Вашего труда: заливайте проекты на bitbucker и сделайте продажу инвайтов в проект (микромагазин с онлайн оплатой), что означает доступ к исходному коду, либо просто питоновский файл с кодом продавать, если проект небольшой. Я когда-то проходил этот урок, но исходников у меня не осталось, сейчас мне нужно потратить время, просмотреть все видео, найти нужные мне моменты, делать паузы, чтобы вникнуть в код. Короче гемморой и куча времени. Был бы у меня исходник, я бы быстро просмотрел его, просмотрел видео в нужных местах и начал бы внедрять в свой проект. А если у Вас будут целые курсы, по Django, например и т.д. где подразумевается более или менее большие проекты, так это вообще необходимость!
Спасибо за совет.
Думаю, что я сделаю такое
From bs4 import BeatifulSoup
ImportError: cannot import name BeatifulSoup from bs4 (C:UsersDimaxiAppDataLocalProgramsPythonPython37libsite-packagesbs4__init__.py)
Делал всё что написано в документации, не помогает
у вас ошибка в слове BeaUtiful, пропущена буква u
Подскажите, плиз, начинающему программисту. Я так понял, что мы создаем файл csv с парсинг датой. Где его найти или как потом использовать эту дату?
Ищи в папке с проектом
Что найти, простите?
Лайк и безумное уважение за объяснение (26:57) подобных вещей!
Серьезно, мелочь но очень очень полезно для новичка и показывает уважение автора канала к его зрителям. Мало кто даже сейчас так делает… и это печально.
правильнее написать в строке 13 # pip install beautifulsoup4
да, верно. Опечатка.
Как сделать, чтобы была пауза в процессах? Получается, что сразу к сайту 40 запросов и сайт блокирует их, и парсит не все страницы.
@Ken Ich А ты автор данного видео? Если нет, то к чему твой высер? Создай свой канал и пиши там всякую дичь
да, если через прокси
@Олег Молчанов много процессов используют, потому что можно КАЖДЫЙ процесс запускать через новый прокси
@Олег Молчанов Спасибо огромное!
да, нужно использовать прокси.
Думаю в функции get_all_links лучше было бы использовать генератор списка вместо цикла
Вы все конечно молодцы. Но я пока что не встречал человека, который объяснял бы решение вопроса с позиции того, кто только пытается что-то понять. Все объясняют с позиции, как будто вокруг все уже в курсе почти всего, о чём идёт речь.
Почитайте очень хорошую книгу. Исскуство объяснять. Очень хорошая и полезная книга. Я по ней своего ребёнка учу жизни.
@Denzel Koshuba а вы попробуйте объяснить ребенку как решать дифференциальные уравнения, а не откуда берется дождь. Это примерно тоже самое. Хотели без основ решить задачу уровнем повыше вот вам и результат. Если опускаться в уроке до разбора элементарного синтаксиса, на это уйдет несколько часов и появятся другие недовольные. Объяснение вполне адекватное, сравните с другими горе учителями в сети
@Denzel Koshuba Ваше желание понятно, но к сожалению не возможно взять и в один момент все понять это приходит только с опытом и практикой. А объяснять это придется очень долго, даже если очень стараться.
@Виталий Горбачёв, если я изучу всё то, что Вы перечислили, то в просмотре видео Олега у меня не будет необходимости))). В данной ситуации, я нашёл это видео, чтобы решить конкретную задачу, без получения знаний. Был готов полностью повторить все действия. Пошагово. Есть хорошая поговорка:
*Расскажи мне как это делать — я ничего не пойму.
Покажи как это делать — мне станет понятно о чём речь.
Давай сделаем это вместе — следующий раз я сделаю это сам.*
Но как и в предыдущих видео по этой теме, я в определенный момент столкнулся с вопросом, который автор считает не важным. Настолько, что даже внимание на это не обращает. А для меня и таких как я — это СТОП. Дальше нет смысла смотреть, потому что необходимо искать ответ на вопрос, которому автор видео не уделил внимание. И поплыл дальше в глубину интернета и Ютуба))).
Я не зря написал про книгу Исскуство объяснять. Всё, что вы знаете и хотите кому-то объяснить необходимо привести в такой вид, чтобы это поняли как можно больше людей. С разными уровнями знания. Тогда вас ждёт успех.
P.S. на вопрос ребёнка откуда берётся дождь, можно ответить по разному. И про конденсат и о разном состоянии воды и т.д. Но он не поймёт))) А если привести пример с чайником из которого идёт пар и поднимается вверх, а после капельками падает вниз. То поймёте не только ребёнок, но и все кому и первый вариант объяснения не подходит, в силу наличия знаний.
Олег прекрасно объясняет. Что бы понять о чём речь, желательно перед просмотром его уроков потратить годик-другой на изучение основ программирования, стека веб программирования и много всего попутного необходимого материала. И это вы только приоткроете завесу огромного пласта необходимых знаний, но Вам станет хотя бы понятно о чём рассказывает Олег.
_Добрый день, Олег. Вы когда-нибудь делали парсеры для 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?
Графики как парсить
оперативку мы видели 42,5МБ, что с CPU и LAN?
Все делал как показано, выходит 2 ошибки:
Traceback (most recent call last):
File C:/Users/user/.PyCharm2018.2/config/scratches/scratch_3.py, line 60, in
main()
File C:/Users/user/.PyCharm2018.2/config/scratches/scratch_3.py, line 48, in main
for index, url in enumerate(all_links):
TypeError: NoneType object is not iterable
Вам надо посмотреть в инспекторе этот класс скорее всего там что то изменили
Никогда не понимал и не понимаю зачем люди пишут вот это: Все делал как показано…
У вас NoneType вылетел, а это значит, что объект пустой. Нет там ничего.
Олег здравствуйте.
А подскажите по количеству процессов. В уроке вы используете 40 процессов. А вообще от чего зависит количество процессов? Например на 2х или 4х ядерном процессоре, как подобрать количество процессов ? Если я сделаю например не 40, а 100 или 500 процессов, но у меня 2х ядерный процессор и допустим нет ограничения в ОЗУ. Они же не будут все выполнятся одновременно.
Может где то можно про это почитать в русскоязычной литературе? А то языком вероятного противника пока владею слабо.
Я пробывал на своем компьюторе разбивать на процессы функцией Pool.1 процесс длился 1 сек, всего процессов было от 1500 до 3000(это предполагаемый объем строк, который я хотел парсить). Быстрее всего парсер работал от 60 до 120 процессов( для конкретной задачи получается разное оптимальное количество процессов). Когда ставил 1000 процессов, компьютер зависал. 1 процесс занимал 5Мб оперативной памяти.
Добрый день, Борис
Я это количество просто выдумал. Подумалось, что так разница во времени будет нагляднее.
Ограничение в памяти все-таки есть. Насколько я помню 40 процессов отъели около 1,5 ОЗУ. Мне кажется, что это много.
Они стартуют по-очереди, но при длительной работе эта разница во времени старта сглаживается. Выполняются они, можно сказать, одновременно.
Нагрузка на процессор тоже возрастает, поскольку этим процессам приходится делить между собой процессорное время.
Где об этом почитать — не могу вам сказать.
Добрый вечер, Олег. А можете объяснить почему не делаете так:
from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen(some url)
soup = BeautifulSoup(html, lxml)
print(soup.h1)
?
Большое спасибо за отличные видеоуроки. Доступно и всё понятно. Хотел уточнить — планируются скринкасты для неначинающих? Было бы интересно посмотреть как те или иные конструкции и методы заменяются другими. Как, например, в примере, написанном выше. Или рассмотреть более сложные парсеры.
да, только из-за ORM. Если вам нужно только лишь подключиться к бд, то pymysqldb вполне подойдет для ваших задач.
вы мне посоветовали те библиотеки только из-за orm? для меня важна только возможность подключиться к бд, а написать запрос — дело плевое
а то и значит. Python не знает SQL, а SQL не знает Python. Чтобы им вместе работать нужно нечто, что понимает и то и другое. Этим нечтом является драйвер базы данных — он посылает запросы и принимает ответы. Больше он ничего не делает.
Запрос к базе вы формулируете не при помощи драйвера.
что значит только связь? запросы там можно делать ведь
чтоб это всё работало нужно ещё lxml библиотеку иметь pip install lxml
А чего таким унылым тоном?
на фоне слышны танцы с бубнами…
что-то не пойму, а что вот этот кусок кода делает?
if _name_ == _main_ :
main()
Traceback (most recent call last):
if _name_ == _main_ :
NameError: name _name_ is not defined — ошибка….
да, уже нашел, все работает, спасибо. Очень интересные видео!
я этого не писал.
Есть отдельное видео на эту тему — посмотрите в плейлисте Python casts
Добрый день. скинь будь добр скрипт парсинга через прокси https. Или лучше скрипт какого то парсинга сайта с прокси https, как мануал будет.
скрипт для работы с https отличается всего на одну букву s
Следите чтобы протокол прокси совпадал с протоколом проксируемого сайта.
Прокси не может установить защищенное соединение с сайтом, который его не поддерживает и наоборот
НЕРЕАЛЬНО ОБАЛДЕННОЕ ВИДЕО! ОЛЕГ, ОГРОМНОЕ СПАСИБО! ВСЕ ЧТО Я НАМАТЫВАЛ НА УС ДО ПРОСМОТРА ЭТОГО РОЛИКА ПРОСТО РАЗЬЯСНИЛОСЬ, ПРИЯТНО СЛУШАТЬ ГРАМОТНОГО И ЗНАЮЩЕГО СВОЕ ДЕЛО ЧЕЛОВЕКА!
У меня такая задача. Есть сайт на котором несколько нужных мне тв-каналов. Нужно извлекать каждый день их видеопотоки и вставлять в плейлист IPTV. Делать это вручную утомительно т.к. спустя 2 часа надо повторять процесс заново (такова живучесть ссылок). Можно ли написать батник-файл который будет выполнять эту задачу вместо меня (и вставлять в плейлист)?
K
Вот проблема: Traceback (most recent call last):
File C:UsersИльяDesktopпарсерpython.py, line 5, in
from bs4 import BeatifulSoup
ImportError: cannot import name BeatifulSoup from bs4 (C:UsersИльяAppDataLocalProgramsPythonPython37-32libsite-packagesbs4__init__.py)
во-первых, BeatifulSoup — вот это нужно исправить везде по коду.
во-вторых, что вы будете делать, когда произойдет очередная ошибка. Вы, в конце концов, программист или домохозяйка?
Исправил, теперь другая проблема —
Олег Молчанов
у вас опечатка в этой фразе:
from bs4 import BeatifulSoup
Так поможете@Олег Молчанов
Alias to make it easier to type import: from bs4 import _soup из _init_.py
надо писать <> pip install beautifulsoup4
Добрый день, Олег. Спасибо за интересные и познавательные видео. Подскажите, что может быть не так с кодом из этого видео (вроде бы соответствует Вашему символ в символ):
После запуска секунд через 20 краш питона. Ошибок не выдает никаких, просто краш.
upd. На другой машине все работает нормально. Поможет ли переустановка питона?
Хорошая подборка видео,да с криптой надо поковыряться,сменилась верстка и появилась защита,посмотрев все видео автора про парсинг(опытпрограммирования три мес)-скрестил проги из этого видео и урока с проксями, задержкой и юзерагентами- если в один поток 2370 пунктов парсит примерно за 3ч 20м, если поставить пул 100 то за 1ч 30(оперативки мало-на один процесс уходит 12мб).Не знаю быстро это или нет,но все работает за что автору большое спасибо, оформлю платную подписку)
Егор Смирнов братан можешь ссылку дать на соц сеть или как с тобой связаться ?(вопрос с проксями)
Спасибо огромное! Всё очень понятно! Лайк однозначно!!
Огромное спасибо. Не понял только почему у меня в этой табличке нет значений? Или всего несколько названий и все? Код в точности такой же, также сверялся с сайтом -ничего не поменялось. В чем может быть проблема?
не факт, что у него такая же проблема.
У меня такая же хрень. До 37-40 нормально, а потом пустые значения… Банят значит))
проблема в том, что вы где-то ошиблись.
Здравствуйте, подскажите можете объяснить условие с if. Что таке __name__?
@Bakhtiyar Khozha спасибо
Интересно все, ну вот голос (подача) спать тянет капец. А так, спасибо Вам за урок
а JSON API применять, не?
У CMC бесплатная версия ограничен, да и сам кейс с мультипоточным парсером интересен