Как создать динамический веб-скребок / краулер: Python

Не совсем уверен в сложности этого вопроса, но решил, что попробую.

Как я могу создать веб-сканер / парсер (не уверен, что мне понадобится), чтобы получить CSV всех данных о соотношении оплаты труда генерального директора. https://www.bloomberg.com/graphics/ceo-pay-ratio/

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

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

Заранее спасибо!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
1 453
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

Чтобы сделать такой запрос, вы можете рассмотреть возможность использования еще одной библиотеки под названием Запросы.

Спасибо! Оцените обратную связь

Sean. D 1528 03.07.2018 08:51
Ответ принят как подходящий

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


Если вы проверите веб-страницу, вы можете заметить, что при нажатии следующей кнопки нет запроса XHR. Таким образом, вы можете сделать вывод, что контент загружается только один раз.

Если вы отсортируете данные запроса по размеру, вы обнаружите, что все данные загружаются из json файл


Используя python (но вам нужно открыть страницу непосредственно перед запуском скрипта python):

import requests
data=requests.get("https://www.bloomberg.com/graphics/ceo-pay-ratio/live-data/ceo-pay-ratio/live/data.json").json()
for each in data['companies']:
    try:
        print "Company",each['c'],"=> CEO pay ratio",each['cpr']
    except:
        print "Company",each['c'],"=> no CEO pay ratio !"

Что дает вам:

Company Aflac Inc => CEO pay ratio 300
Company American Campus Communities Inc => CEO pay ratio 226
Company Aetna Inc => CEO pay ratio 235
Company Ameren Corp => CEO pay ratio 66
Company AmerisourceBergen Corp => CEO pay ratio 0
Company Advance Auto Parts Inc => CEO pay ratio 329
Company American International Group Inc => CEO pay ratio 697
Company Arthur J Gallagher & Co => CEO pay ratio 126
Company Arch Capital Group Ltd => CEO pay ratio 104
Company ACADIA Pharmaceuticals Inc => CEO pay ratio 54
[...]

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

После локального сохранения json как data.json вы можете прочитать его с помощью:

import json

with open("data.json","r") as f:
    cont=f.read()

data=json.loads(cont)

for each in data['companies']:
    try:
        print "Company",each['c'],"=> CEO pay ratio",each['cpr']
    except:
        print "Company",each['c'],"=> no CEO pay ratio !"

запросы на импорт data = requests.get ("bloomberg.com/graphics/ceo-pay-ratio/live‌ -data / ceo-pay-ratio / ‌… для каждого in data ['companies']: try: print (" Компания ", каждый ['c']," => коэффициент оплаты труда генерального директора ", каждый ['cpr']) кроме: print ("Компания", каждый ['c'], "=> нет коэффициента оплаты генерального директора!") после ввода этого кода у меня возникла ошибка трассировки ... есть ли способ переписать код для локального сохранения. json или .csv Очень ценю :)

Sean. D 1528 03.07.2018 10:14

Отслеживание (последний вызов последним): файл ". \ CEOpayratio.py", строка 2, в <module> data = requests.get ("bloomberg.com/graphics/ceo-pay-ratio/live‌ -data / ceo-pay-ratio / ‌… File" C: \ Users \ Seane \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ s‌ ite-packages \ request‌ s \ models.py ", строка 896, в json возвращает файл complexjson.loads (self.text, ** kwargs)" C: \ Users \ Seane \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ s‌ ite-packages \ simplej‌ son_в этом_.py ", строка 518, при загрузке возвращает _default_decoder.decode (s)

Sean. D 1528 03.07.2018 10:19

Спасибо! Действительно ценю помощь

Sean. D 1528 04.07.2018 10:51

Другие вопросы по теме