Как создать динамический веб-скребок / сканер: Python - PullRequest
0 голосов
/ 03 июля 2018

Не совсем уверен, насколько сложен этот вопрос, но подумал, что я попробую.

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

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


Если вы просматриваете веб-страницу, вы можете заметить, что при нажатии следующей кнопки запрос 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 !"
0 голосов
/ 03 июля 2018

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...