Сбор данных из профилей округов data.census.gov

Я пытаюсь написать программу, используя bs4 (или другой метод), которая может собирать данные с титульных страниц определенных округов, например этого: https://data.census.gov/profile/Grant_County,_New_Mexico? g=050XX00US35017#populations-and-people

Я хочу иметь возможность получить те девять статистических данных, которые указаны на титульной странице, без необходимости просматривать соответствующие исходные CSV-файлы и пересчитывать эти значения. Я когда-либо собирал данные только из простых HTML-файлов Википедии, и я не знаю, как это сделать, если числа не сразу видны в HTML-коде веб-страницы (может быть, мне здесь тоже нужны некоторые знания Java...? ) Спасибо за любые советы/подсказки в правильном направлении!

import requests
import pandas as pd
from bs4 import BeautifulSoup

census.gov поддерживает API для разработчиков: получить данные из API гораздо проще и быстрее, чем с помощью веб-скрапинга.

ryyyn 10.06.2024 19:59

(1) сначала проверьте, есть ли на странице API и есть ли у нее функция для получения необходимых вам данных - это будет намного проще, поскольку она будет предоставлять только данные без HTML. (2) если API отсутствует, проверьте, использует ли страница JavaScript для добавления элементов, потому что requests и BeautifulSoup не могут работать JavaScript и может потребоваться Selenium, который может управлять реальным веб-браузером, который может запускать JavaScript. (3) проверьте страницу private mode, потому что она может использовать некоторые файлы cookie или ваши логины, которые вы ввели ранее, но BeautifulSoup не имеет этой информации и, возможно, ей необходимо ее получить.

furas 10.06.2024 21:52

на этой странице используется JavaScript. Когда я отключаю JavaScript в браузере и перезагружаю страницу, я вижу пустую страницу. И то же самое смотрите BeautifulSoup. Так что вы не можете получить его с BeautifulSoup

furas 10.06.2024 21:52
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте что-то вроде этого:

import requests
import json

headers = {
    'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:126.0) Gecko/20100101 Firefox/126.0',
    'Accept': 'application/json, text/plain, */*',
    'Accept-Language': 'en-US,en;q=0.5',
}

params = {
    # Grant County, New Mexico
    'g': '050XX00US35017',
    # Los Angeles County, California
    # 'g': '050XX00US06037',
}

response = requests.get(
    'https://data.census.gov/api/profile/content/highlights',
    params=params,
    headers=headers
)

print(json.dumps(response.json(), indent=2))

Округ указывается с помощью параметра g в словаре params. Вы найдете этот идентификатор в URL-адресе. Например:

Вот как выглядят данные по округу Грант.

{
  "selectedProfile": {
    "label": "Grant County, New Mexico",
    "params": {
      "g": "050XX00US35017"
    }
  },
  "highlights": [
    {
      "format": "number",
      "value": "28185",
      "topic": "Populations and People",
      "label": "Total Population",
      "sourceLink": "https://www.census.gov/programs-surveys/decennial-census/about/rdo.html",
      "source": "2020 Decennial Census",
      "tableId": "DECENNIALPL2020.P1"
    },
    {
      "format": "dollar",
      "value": "44895",
      "topic": "Income and Poverty",
      "label": "Median Household Income",
      "sourceLink": "https://www.census.gov/programs-surveys/acs.html",
      "source": "2022 American Community Survey 5-Year Estimates",
      "tableId": "ACSST5Y2022.S1901"
    },
    {
      "format": "percent",
      "value": "26.4",
      "topic": "Education",
      "label": "Bachelor's Degree or Higher",
      "sourceLink": "https://www.census.gov/programs-surveys/acs.html",
      "source": "2022 American Community Survey 5-Year Estimates",
      "tableId": "ACSST5Y2022.S1501"
    },
    {
      "format": "percent",
      "value": "41.9",
      "topic": "Employment",
      "label": "Employment Rate",
      "sourceLink": "https://www.census.gov/programs-surveys/acs.html",
      "source": "2022 American Community Survey 5-Year Estimates",
      "tableId": "ACSDP5Y2022.DP03"
    },
    {
      "format": "number",
      "value": "14584",
      "topic": "Housing",
      "label": "Total Housing Units",
      "sourceLink": "https://www.census.gov/programs-surveys/decennial-census/about/rdo.html",
      "source": "2020 Decennial Census",
      "tableId": "DECENNIALPL2020.H1"
    },
    {
      "format": "percent",
      "value": "5.1",
      "topic": "Health",
      "label": "Without Health Care Coverage",
      "sourceLink": "https://www.census.gov/programs-surveys/acs.html",
      "source": "2022 American Community Survey 5-Year Estimates",
      "tableId": "ACSST5Y2022.S2701"
    },
    {
      "format": "number",
      "value": "534",
      "topic": "Business and Economy",
      "label": "Total Employer Establishments",
      "sourceLink": "https://www.census.gov/programs-surveys/cbp.html",
      "source": "2021 Economic Surveys Business Patterns",
      "tableId": "CBP2021.CB2100CBP"
    },
    {
      "format": "number",
      "value": "11292",
      "topic": "Families and Living Arrangements",
      "label": "Total Households",
      "sourceLink": "https://www.census.gov/programs-surveys/acs.html",
      "source": "2022 American Community Survey 5-Year Estimates",
      "tableId": "ACSDP5Y2022.DP02"
    },
    {
      "format": "number",
      "value": "13466",
      "topic": "Race and Ethnicity",
      "label": "Hispanic or Latino (of any race)",
      "sourceLink": "https://www.census.gov/programs-surveys/decennial-census/about/rdo.html",
      "source": "2020 Decennial Census",
      "tableId": "DECENNIALDHC2020.P9"
    }
  ]
}

Если вы хотите получить область из параграфа дескриптора (см. комментарий ниже), вы можете добавить это:

params = {
    'g': '050XX00US35017',
    'includeHighlights': 'false',
}

response = requests.get(
    "https://data.census.gov/api/profile/metadata",
    params=params,
    headers=headers
)

print(response.json()["header"]["description"])

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

Супер! Пожалуйста, примите ответ. 😁

datawookie 12.06.2024 05:06

Откуда вы узнали, где найти эту ссылку? data.census.gov/api/profile/content/highlights

Daniel Zitomer 12.06.2024 16:43

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

Daniel Zitomer 12.06.2024 16:44

Я использовал вкладку «Сеть» в инструментах разработчика, чтобы найти URL-адрес API сайта.

datawookie 13.06.2024 10:50

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

datawookie 13.06.2024 10:59

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

Очистка данных с веб-сайта с бесконечной прокруткой и динамически загружаемым контентом с помощью Python Selenium
String.Contains не работает с какой-либо специальной строкой при сравнении в Selenium
Непосредственно вставленная ссылка XPATH в селен ведет к другой ссылке
У меня есть поле пароля, которое «недоступно для взаимодействия»
Невозможно очистить ссылки с динамического веб-сайта с помощью Selenium
Очистка таблицы с разбивкой на страницы с тем же URL-адресом
Как нажать эту кнопку с помощью Selenium?
Я попытался очистить веб-сайт с помощью Selenium Python и сохранить его в CSV, но он распечатал и дублировал только первый результат
Selenium — TypeError: невозможно создать экземпляр абстрактного класса Service без реализации абстрактного метода «command_line_args»
Почему я не вижу опции импорта библиотеки в Eclipse, я добавил необходимую библиотеку в путь конфигурации сборки