Парсер курса доллара на Python

wumpus

Премиум
Premium
Регистрация
07.06.2020
Сообщения
64
Реакции
32
Баллы
19
значит пруфов не будет? короче очередной лолик, не осиливший регулярки. чтд.
ждём истории из серии bs4 работает быстрее, чем машинный код.
 

shkolnick1337

RAID-массив
Пользователь
Регистрация
04.05.2020
Сообщения
99
Реакции
77
Баллы
26
Jabber
значит пруфов не будет? короче очередной лолик, не осиливший регулярки. чтд.
ждём истории из серии bs4 работает быстрее, чем машинный код.
Я тебе сказал - скачай исходники bs4 разберись подробнее в вопросе, пойми разницу между твоей наспех составленной кривой регуляркой и работой нормальной библиотеки. Так что следи за языком. Я лично такому как ты доказывать уже ничего не хочу. Учиться не хочешь, только спорить на форумах...
 

wumpus

Премиум
Premium
Регистрация
07.06.2020
Сообщения
64
Реакции
32
Баллы
19
Я тебе сказал - скачай исходники bs4 разберись подробнее в вопросе, пойми разницу между твоей наспех составленной кривой регуляркой и работой нормальной библиотеки.
сохранил это в закладки. лол. спс за беседу.
 

Marcus52

Воскресший
Модератор
Регистрация
23.03.2019
Сообщения
74
Реакции
26
Баллы
21
Jabber
Ну наконец ты понял хоть что то, мелкое ничтожество:)
ты всё-таки сказочный долбаёб. бс4 сам юзает регулярки. да и про скорость вообще не было ни слова, ибо на такой задаче на неё вообще похуй, если ты, конечно, не собираешься парсить курс валют миллион раз в минуту. жду от тебя бенч с пруфом - как бс4, который юзает re, парсит быстрее чем сам re.
Не нужно оскарблений взаимных, особенно wumpus. Пока предупреждаю устно, дальше будут балы. Давайте общаться как нормальные ребята, спасибо.
 

pewpewpew

(L3) cache
Пользователь
Регистрация
27.11.2018
Сообщения
161
Реакции
160
Баллы
39
тащемта суп юзает три разных парсера, и два (html5lib, htmlparser) из них юзают регулярки. Третий (lxml) компилится, и его сорцы я не смотрел, но и там есть применение вышеназванных библиотек.
немного пруфов (делайте поиск по tag_regexp и re.)
https://github.com/html5lib/html5li...ebb80e6feaff666/html5lib/treewalkers/etree.py
https://github.com/python/cpython/blob/3.8/Lib/html/parser.py

И насколько я понял, wumpus изначально имел ввиду, что тащить к этому маленькому скрипту две либы смысла вообще небыло.
Несомненно, если бы мы парсили дикое количество инфы, то на больших страницах регекспы проиграют, т.к. ведут поиск по не размеченным данным (и чем больше в теле страницы сорцев, тем медленнее)
 

shkolnick1337

RAID-массив
Пользователь
Регистрация
04.05.2020
Сообщения
99
Реакции
77
Баллы
26
Jabber
тащемта суп юзает три разных парсера, и два (html5lib, htmlparser) из них юзают регулярки. Третий (lxml) компилится, и его сорцы я не смотрел, но и там есть применение вышеназванных библиотек.
немного пруфов (делайте поиск по tag_regexp и re.)
https://github.com/html5lib/html5li...ebb80e6feaff666/html5lib/treewalkers/etree.py
https://github.com/python/cpython/blob/3.8/Lib/html/parser.py

И насколько я понял, wumpus изначально имел ввиду, что тащить к этому маленькому скрипту две либы смысла вообще небыло.
Несомненно, если бы мы парсили дикое количество инфы, то на больших страницах регекспы проиграют, т.к. ведут поиск по не размеченным данным (и чем больше в теле страницы сорцев, тем медленнее)
Да по телу dom, но не по всей же странице. Я ничего объяснять лично вумпусу не буду, потому что у него как бы сказать все очень плохо с социальным взаимодействием... ему аргументы не нужны, только подтверждения его правоты.
 

wumpus

Премиум
Premium
Регистрация
07.06.2020
Сообщения
64
Реакции
32
Баллы
19
тащемта суп юзает три разных парсера, и два (html5lib, htmlparser) из них юзают регулярки. Третий (lxml) компилится, и его сорцы я не смотрел, но и там есть применение вышеназванных библиотек.
немного пруфов (делайте поиск по tag_regexp и re.)
https://github.com/html5lib/html5li...ebb80e6feaff666/html5lib/treewalkers/etree.py
https://github.com/python/cpython/blob/3.8/Lib/html/parser.py

И насколько я понял, wumpus изначально имел ввиду, что тащить к этому маленькому скрипту две либы смысла вообще небыло.
Несомненно, если бы мы парсили дикое количество инфы, то на больших страницах регекспы проиграют, т.к. ведут поиск по не размеченным данным (и чем больше в теле страницы сорцев, тем медленнее)
ну про lxml речи не было. он кстати лидирует в q/a вида "how to improve performance" по тегу bs4. у супа одно из узких мест - построение деревьев, которое в нашем случае вообще не нужно, если рассматриваем конкретный таск - дёрнуть страницу и вытащить из неё одно единственное значение, которое размещено статично в теге вида <div ... id="last_last" ...></div>. парсить это как html вообще не имеет смысла. на такой задаче бенчи bs4 + lxml против re будут в пользу последнего.
 

Haunt

(L2) cache
Пользователь
Регистрация
07.11.2019
Сообщения
365
Реакции
495
Баллы
68
конкретный таск - дёрнуть страницу и вытащить из неё одно единственное значение, которое размещено статично в теге вида <div ... id="last_last" ...></div>.
Если прям уж статично все, кроме цены, не проще ли из HTTP респонса вытянуть ответ по определённому смещению?
 
Последнее редактирование:

wumpus

Премиум
Premium
Регистрация
07.06.2020
Сообщения
64
Реакции
32
Баллы
19
Если прям уж статично все, не проще ли из HTTP респонса вытянуть ответ по определённому смещению?
_https://ru.investing.com/currencies/usd-rub
там не на столько статично :) например для вхождения last_last два респонса дают разное смещение 105511 и 105561. + много других факторов.

*span
 

BabaDook

(L1) cache
Пользователь
Регистрация
20.04.2015
Сообщения
685
Реакции
497
Баллы
71
Парсер - это программа которая собирает данные с интернета, анализирует их и выдает в нужном формате.
В этом уроке мы напишем парсер, который будет отслеживать курс доллара. Использовать будем python (один из лучших языков программирования для работы с информацией).

Для начала нужно скачать библиотеки (введите код ниже в коммандной строке)

Код:
pip install requests
pip install bs4

requests - библиотека для получения кода веб сайта (информация о курсе есть в коде веб страницы)
bs4 - библиотека для работы с HTML, CSS кодом (с помощью него мы будем искать в коде нужную нам информацию)


Создаём файл dollar.py (можете назвать его по-другому) и имртируем все нужные библиотеки:
Python:
import requests
from bs4 import BeautifulSoup

Парсить будем с сайта investing.com, поэтому нужно сохранить URL страницы с курсом доллара (https://ru.investing.com/currencies/usd-rub) в виде переменной
Python:
# import ...

URL = 'https://ru.investing.com/currencies/rub-usd'

Также сначала нужно узнать свой User Agent. Просто введите в google "my user agent" и скопируйте строку в переменную:
Python:
# import ...
# URL ...

HEADERS = {'user-agent' : '*ваш user agent*'}

Теперь нам нужно получить код страницы:
Python:
# ...

page = requests.get (URL, headers = HEADERS)

Переходим на сайт и нажимаем Ctrl+Shift+I. Теперь мы видим код страницы прямо в браузере. Нажимаем на кнопку слева сверху (для выбора элемента на странице) и выбираем текст с курсом доллара (если мы будем знать, где в коде находится текст с курсом доллара, мы можем каждый раз обращаться к этой части кода и выводить этот текст). Узнаём, что курс храниться в теге с id равным "late-late". Теперь создадим переменную soup, чтобы найти тег с нужным нам id:
Код:
# ...

# page.content - код страницы

soup = BeautifulSoup (page.content, 'html.parser')

currency = soup.find (id = 'late-late') # находим тег с id 'late-late' (в этом теге хранится курс доллара)

print (currency.text) # выводим текст, хранящийся в этом теге

Вот весь код парсера:
Python:
import requests
from bs4 import BeautifulSoup

URL = 'https://ru.investing.com/currencies/usd-rub'
HEADERS = {'user-agent' : '*ваш user agent*'}

page = requests.get (URL, headers = HEADERS)
soup = BeautifulSoup (page.content, 'html.parser')

currency = soup.find (id = 'late-late').text

print (currency)
Статья очень зачётная. Много нового узнал. Много по времени заняло?
 

return

RAID-массив
Пользователь
Регистрация
31.05.2020
Сообщения
54
Реакции
8
Баллы
9
статьи которые мы заслужили...
однозначно лайк!
 

pewpewpew

(L3) cache
Пользователь
Регистрация
27.11.2018
Сообщения
161
Реакции
160
Баллы
39
Да по телу dom, но не по всей же странице.
Извини, но ты, видимо, не до конца понимаешь что такое DOM (либо я не понял, зачем ты это написал). DOM как раз таки и строится благодаря этому "парсингу регулярками", чтобы потом ты уже мог применять селекторы и различные методы для управления содержимым. До парсинга, страница это просто набор текста с разметкой (не всегда валидной).
 

wdosx

floppy-диск
Пользователь
Регистрация
27.12.2019
Сообщения
8
Реакции
2
Баллы
4
Благодаря этой статье, спустя годы безуспешных попыток, я наконец то разобрался, как спарсить число с веб страницы. Спасибо тебе, автор :)
Но стоит заметить, что место такой статье больше на хабре или подобных бордах. А то не хорошо, чтоб такой важный материалл был доступен только избранным, собравшимся здесь.

Тут лучше постить статьи по типу таких вот:
:)
 

disi

floppy-диск
Пользователь
Регистрация
10.04.2020
Сообщения
2
Реакции
3
Баллы
3
Perl:
perl -MLWP::Simple -MJSON -e '$ref = decode_json(get("https://www.cbr-xml-daily.ru/daily_json.js")); print $ref->{"Valute"}->{"USD"}->{"Value"}."\n"'
 

ppdonchiq

RAID-массив
Пользователь
Регистрация
16.11.2019
Сообщения
90
Реакции
67
Баллы
23
Perl:
perl -MLWP::Simple -MJSON -e '$ref = decode_json(get("https://www.cbr-xml-daily.ru/daily_json.js")); print $ref->{"Valute"}->{"USD"}->{"Value"}."\n"'
добавь декодинг JSON однострочником (вместо либы) и голосую за тебя
 

disi

floppy-диск
Пользователь
Регистрация
10.04.2020
Сообщения
2
Реакции
3
Баллы
3
добавь декодинг JSON однострочником (вместо либы) и голосую за тебя
Perl:
curl https://www.cbr-xml-daily.ru/daily_jsonp.js --silent | perl -ne 'print($_ =~ m/USD.*?Value":(\d+\.\d+)/m);print("\n")'
(Я аж опешил) Полностью независимое решение. Вместо курлыка можно использовать вгет или что еще.
 

ppdonchiq

RAID-массив
Пользователь
Регистрация
16.11.2019
Сообщения
90
Реакции
67
Баллы
23
Я ващет думол что ты реализуешь парсинг JSON в общем виде, то бишь перепишешь либу в однострочник.

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

ppdonchiq

RAID-массив
Пользователь
Регистрация
16.11.2019
Сообщения
90
Реакции
67
Баллы
23
Суточная доза лайков кончилась, но я тебя запомнил.
 
  • Like
Реакции: disi
Верх