Я пытаюсь написать программу, используя 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
(1) сначала проверьте, есть ли на странице API и есть ли у нее функция для получения необходимых вам данных - это будет намного проще, поскольку она будет предоставлять только данные без HTML. (2) если API отсутствует, проверьте, использует ли страница JavaScript для добавления элементов, потому что requests и BeautifulSoup не могут работать JavaScript и может потребоваться Selenium, который может управлять реальным веб-браузером, который может запускать JavaScript. (3) проверьте страницу private mode, потому что она может использовать некоторые файлы cookie или ваши логины, которые вы ввели ранее, но BeautifulSoup не имеет этой информации и, возможно, ей необходимо ее получить.
на этой странице используется JavaScript. Когда я отключаю JavaScript в браузере и перезагружаю страницу, я вижу пустую страницу. И то же самое смотрите BeautifulSoup. Так что вы не можете получить его с BeautifulSoup






Попробуйте что-то вроде этого:
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"])
Это вернет полный текст абзаца, и вам нужно будет использовать строковую операцию для извлечения области.
Супер! Пожалуйста, примите ответ. 😁
Откуда вы узнали, где найти эту ссылку? data.census.gov/api/profile/content/highlights
И есть ли способ также узнать площадь квадратных миль каждого округа? Он находится в небольшом абзаце дескриптора в начале.
Я использовал вкладку «Сеть» в инструментах разработчика, чтобы найти URL-адрес API сайта.
Обновил свой ответ, указав, как получить этот параграф метаданных.
census.gov поддерживает API для разработчиков: получить данные из API гораздо проще и быстрее, чем с помощью веб-скрапинга.