Анализ данных Python для веб-краулера: иллюстрированный глобальный обзор ЦРУ

Python Программа перевода самородков анализ данных HTML
Анализ данных Python для веб-краулера: иллюстрированный глобальный обзор ЦРУ

Анализ данных Python для веб-сканеров: иллюстрированный глобальный обзор ЦРУ

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

Сбор и очистка данных почти всегда являются самыми трудоемкими и трудоемкими этапами проекта по науке о данных. Всем нравится демонстрировать свои навыки, создавая классную модель глубокой нейронной сети (или XGboost) или две с интерактивными 3D-диаграммами. Но для этих моделей требуются необработанные данные, и их нелегко собрать и очистить.

В конце концов, жизнь — это не zip-файл, как Kaggle, ожидающий, пока вы его разархивируете и смоделируете :-)

Но зачем мы собираем данные или строим модели?? Первоначальная мотивация заключалась в том, чтобы отвечать на деловые, научные или социальные вопросы.это тенденция?отношения между вещами?Могут ли физические измерения предсказать исход этого явления?«Потому что ответ на этот вопрос подтвердит предположения, которые вы сделали как ученый/практик в этой области. Вы просто используете данные (а не химик, использующий пробирку, или физик, использующий магнит), чтобы проверить свою гипотезу и научно доказать/опровергнуть ее.Это «научная» часть науки о данных, и она оправдывает свое название...

Поверьте мне, нетрудно придумать качественную проблему, для решения которой требуется применение некоторых методов науки о данных. И каждая из этих проблем станет для вас небольшим проектом, исходный код которого вы сможете открыть на такой платформе, как Gihub, чтобы поделиться с друзьями. Даже если вы не профессиональный эксперт по данным, никто не может помешать вам написать классный код, чтобы ответить на вопрос о качественных данных. Это также показывает, что вы чувствительны к данным и можете рассказать историю с вашими данными.

Давайте сегодня решим такую ​​задачу. . .

Связан ли ВВП страны (по паритету покупательной способности) с долей интернет-пользователей? Является ли эта тенденция аналогичной для стран с низким/средним/высоким доходом?

Теперь вы можете подумать о многих источниках, которые можно было бы собрать в качестве данных для ответа на этот вопрос. Я нашел веб-сайт ЦРУ (да, «АГЕНТСТВО»), на котором содержится основная фактическая информация обо всех странах мира, и это отличное место для сбора данных.

Поэтому мы будем использовать следующие модули Python для создания нашей базы данных и визуализации:

  • Pandas, Numpy, matplotlib/seaborn
  • Python urllib(отправить HTTP-запрос)
  • BeautifulSoup(для разбора HTML)
  • Regular expression module(для поиска точного совпадения текста для поиска)

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

Прочитайте домашнюю страницу HTML и перейдите к BeautifulSoup

вотГлобальный информационный бюллетень ЦРУ Главная

Фото: CIA Global Profile Homepage

Мы извлекаем эту страницу с помощью простого запроса urllib с контекстом игнорирования ошибки SSL, а затем передаем ее волшебному BeautifulSoup, который проанализирует HTML для нас и сгенерирует красивый текстовый дамп. Те, кто не знаком с библиотекой BeautifulSoup, могут посмотреть следующее видео илиПрочтите эту познавательную статью на Medium.

Адрес видео на YouTube: https://youtu.be/aIPqt-OdmS0

Ниже приведен фрагмент кода HTML главной страницы, который гласит:

ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

# 从 URL 中读取 HTML 并将其传递给 BeautifulSoup
url = 'https://www.cia.gov/library/publications/the-world-factbook/'
print("Opening the file connection...")
uh= urllib.request.urlopen(url, context=ctx)
print("HTTP status",uh.getcode())
html =uh.read().decode()
print(f"Reading done. Total {len(html)} characters read.")

Вот как мы можем передать его в BeautifulSoup и использоватьfind_allметод, чтобы найти все названия стран и коды, встроенные в HTML. В принципе, идеяНайдите тег HTML с именем «опция». Текст в метке представляет собой название страны, а цифры 5 и 6 в значении метки представляют собой двухсимвольный код страны.

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

soup = BeautifulSoup(html, 'html.parser')
country_codes=[]
country_names=[]

for tag in soup.find_all('option'):
    country_codes.append(tag.get('value')[5:7])
    country_names.append(tag.text)

temp=country_codes.pop(0) # To remove the first entry 'World'
temp=country_names.pop(0) # To remove the first entry 'World'

Сканирование: захватывайте текстовые данные всех стран в словарь по одному.

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

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

# 基础 URL
urlbase = 'https://www.cia.gov/library/publications/the-world-factbook/geos/'
#  空数据字典
text_data=dict()

# 遍历每个国家
for i in range(1,len(country_names)-1):
    country_html=country_codes[i]+'.html'
    url_to_get=urlbase+country_html
    # 从 URL 中读取 HTML 并将其传递给 BeautifulSoup
    html = urllib.request.urlopen(url_to_get, context=ctx).read()
    soup = BeautifulSoup(html, 'html.parser')
    txt=soup.get_text()
    text_data[country_names[i]]=txt
    print(f"Finished loading data for {country_names[i]}")
    
print ("\n**Finished downloading all text data!**")

В свалке рассола, если хотите

Кроме того, я склоняюсь к сериализации ихранить данные вв объекте рассола Python. Таким образом, в следующий раз, когда я открою блокнот Jupyter, я смогу прочитать данные напрямую, не повторяя шаг веб-сканирования.

import pickle
pickle.dump(text_data,open("text_data_CIA_Factobook.p", "wb"))

# 取消选择,下次从本地存储区读取数据。
text_data = pickle.load(open("text_data_CIA_Factobook.p", "rb"))

Извлечение данных ВВП/на душу населения из текстового дампа с использованием регулярных выражений

Это основная часть программы для анализа текста, мы используемрегулярное выражениемодульчтобы найти то, что мы ищем, в огромных текстовых строках и извлечь соответствующие числовые данные. Регулярные выражения теперь являются богатым ресурсом в Python (или почти в любом языке программирования высокого уровня). Он позволяет искать/сопоставлять строки с определенными шаблонами в большом объеме текста. Здесь мы используем очень простой подход регулярных выражений, чтобы соответствовать точным словам, таким как "ВВП — на душу населения (ППС):«Затем прочитайте несколько символов, извлеките позиции определенных символов, таких как $ и (), и, наконец, извлеките значение ВВП на душу населения. Эта идея иллюстрируется цифрами.

Рисунок: Иллюстрация анализа текста.

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

# 'b' 去捕捉 'billions', 't' 去捕捉 'trillions'
start = re.search('\$',string)
end = re.search('[b,t]',string)
if (start!=None and end!=None):
    start=start.start()
    end=end.start()
    a=string[start+1:start+end-1]
    a = convert_float(a)
    if (string[end]=='t'):
    # 如果 GDP 数值在 万亿中,则乘以 1000
        a=1000*a

Ниже приведен пример фрагмента кода.Обратите внимание на несколько проверок обработки ошибок, размещенных в коде.. Это необходимо, потому что HTML-страницы крайне непредсказуемы. Не во всех странах есть данные о ВВП, не на всех страницах данные имеют одинаковую формулировку, не все числа выглядят одинаково, и не все строки расположены в виде $ и (). Все может пойти не так.

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

# 初始化保存数据的字典
GDP_PPP = {}
# 遍历每个国家
for i in range(1,len(country_names)-1):
    country= country_names[i]
    txt=text_data[country]       
    pos = txt.find('GDP - per capita (PPP):')
    if pos!=-1: #If the wording/phrase is not present
        pos= pos+len('GDP - per capita (PPP):')
        string = txt[pos+1:pos+11]
        start = re.search('\$',string)
        end = re.search('\S',string)
        if (start!=None and end!=None): #If search fails somehow
            start=start.start()
            end=end.start()
            a=string[start+1:start+end-1]
            #print(a)
            a = convert_float(a)
            if (a!=-1.0): #If the float conversion fails somehow
                print(f"GDP/capita (PPP) of {country}: {a} dollars")
                # 在字典中插入数据
                GDP_PPP[country]=a
            else:
                print("**Could not find GDP/capita data!**")
        else:
            print("**Could not find GDP/capita data!**")
    else:
        print("**Could not find GDP/capita data!**")
print ("\nFinished finding all GDP/capita data")

Не забудьте использовать методы внутреннего/левого соединения pandas

Следует иметь в виду, что все эти раздельные анализы будут давать данные с немного разными наборами стран. Потому что разные страны могут не иметь доступа к разным типам данных. Можно использоватьPandas left joinдля создания данных, которые пересекают все общедоступные страны для всех доступных/извлекаемых фрагментов данных.

df_combined = df_demo.join(df_GDP, how='left')
df_combined.dropna(inplace=True)

А, теперь это крутая штука, моделирование. . . Но ждать! Или сначала отфильтровать!

Теперь, когда вы выполнили весь синтаксический анализ HTML, очистку страниц и анализ текста, вы можете воспользоваться преимуществами — вам не терпится запустить алгоритмы регрессии и крутые визуальные сценарии! Но подождите, часто вам нужно очистить свои данные (особенно для такого рода социально-экономических проблем), прежде чем создавать эти вещи. По сути, вам нужно отфильтровать выбросы, такие как очень маленькие страны (например, островные страны), которые могут сильно отклоняться от значений параметров, которые вы рисуете, и не следовать основной базовой динамике, которую вы хотите изучить. Для этих фильтров достаточно нескольких строк кода. может быть большеPythonicметод для их реализации, но я стараюсь, чтобы он был предельно простым и легким для понимания. Например, приведенный ниже код создает фильтр, который исключает малые страны с ВВП менее 50 миллиардов долларов, а границы с низким и высоким доходом составляют 5000 и 25 000 долларов США (ВВП/ВВП на душу населения) соответственно.

# 创建过滤后的数据帧、x 和 y 数组
filter_gdp = df_combined['Total GDP (PPP)'] > 50
filter_low_income=df_combined['GDP (PPP)']>5000
filter_high_income=df_combined['GDP (PPP)']<25000

df_filtered = df_combined[filter_gdp][filter_low_income][filter_high_income]

Наконец-то визуализация

Мы используемseaborn regplotфункцияСоздайте диаграмму рассеяния подгонки линейной регрессии (количество интернет-пользователей по сравнению с ВВП на душу населения) и отобразите полосы доверительного интервала 95%. Они выглядят так, как показано ниже. Результат можно интерпретировать как

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

Суммировать

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

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

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


Если у вас есть какие-либо вопросы и идеи, чтобы поделиться, пожалуйста, свяжитесь с авторомtirthajyoti@gmail.com. Конечно, вы также можете просмотреть авторскуюРепозиторий GitHubРесурсы на Python, R или MATLAB и машинное обучение. Если вы так же увлечены машинным обучением/наукой о данных, как и я, не стесняйтесьдобавь меня в LinkedInилиПодпишись на меня в Твиттере.


Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из ИнтернетаНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллекти другие поля, если вы хотите видеть больше качественных переводов, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.