使用爬虫获取Australian Bureau of Statistics上的人口数据(SA2 level)

背景

我需要获取堪培拉SA2 level 下的区域列表并获取每个区域的人口数量。由于网站上没有直接的列出SA2 level下对应区域的人口,需要人工点击区域进行查询。 所以我希望可以通过Python爬虫辅助我完成这个工作。已知堪培拉SA2 level 下的区域有135个。

目标

  • 获取SA2 level 的区域ID
  • 需要获取SA2 level下的人口数据
  • 保存到excel文件

开始获取

第一步-浏览网页

网址:https://www.abs.gov.au/census/find-census-data/quickstats/2021/801091107
通过浏览网页发现每一个区域有一个对于的区域ID,在URL的结尾也有对应的区域ID。
请添加图片描述

第二步-获取区域ID

我需要获取SA2 level下的区域ID
这个可以在ABS上找到
网址:https://www.abs.gov.au/statistics/standards/australian-statistical-geography-standard-asgs-edition-3/jul2021-jun2026/main-structure-and-greater-capital-city-statistical-areas/statistical-area-level-2
在这里插入图片描述

第三部-编写代码

  1. 在页面中找到人口的数据对应的元素
    在这里插入图片描述
    在图片中我们可以看到people对应的人口数据在class为“strongRow”的tr下,所以我们需要获取tr下td的值
import requests
from bs4 import BeautifulSoup
import pandas as pd

def fetch_element(url):
    response = requests.get(url)
    if response.status_code == 200:
        soup = BeautifulSoup(response.content, 'html.parser')
        # 假设你要抓取的元素是一个带有特定类名的<tr>标签
        target_element = soup.find('tr', {'class': 'strongRow'})
        if target_element:
            target_td = target_element.find('td')
            if target_td:
                people = target_td.text.strip()
                return people
            else:
                print("err")
                return None
        else:
            print(f'在URL {url} 中未找到目标元素')
            return None
    else:
        print(f'无法访问URL {url}')
        return None
  1. 读取Excel的区域ID并新增一列
# 读取Excel文件
input_file = 'SA2_ACT.xlsx'  # 你的Excel文件名
sheet_name = 'default_1'  # 你的工作表名
id_column = 'SA2_CODE_2021'  # 包含ID的列名
df = pd.read_excel(input_file, sheet_name=sheet_name)
df['people'] = None
  1. 根据Excel里的ID去进行请求
# 遍历数据框,访问URL并抓取元素
for index, row in df.iterrows():
    id = row[id_column]
    url = f'https://www.abs.gov.au/census/find-census-data/quickstats/2021/{id}'
    element = fetch_element(url)
    if element:
        df.at[index, 'people'] = element
        print(f'ID {id} 对应的元素:{element}')
  1. 将数据写入Excel
# 将结果保存到新的Excel文件
output_file = 'output.xlsx'
df.to_excel(output_file, index=False)

效果展示

在这里插入图片描述

完整代码

import requests
from bs4 import BeautifulSoup
import pandas as pd

def fetch_element(url):
    response = requests.get(url)
    if response.status_code == 200:
        soup = BeautifulSoup(response.content, 'html.parser')
        # 假设你要抓取的元素是一个带有特定类名的<div>标签
        target_element = soup.find('tr', {'class': 'strongRow'})
        if target_element:
            target_td = target_element.find('td')
            if target_td:
                people = target_td.text.strip()
                return people
            else:
                print("err")
                return None
        else:
            print(f'在URL {url} 中未找到目标元素')
            return None
    else:
        print(f'无法访问URL {url}')
        return None

# 读取Excel文件
input_file = 'SA2_ACT.xlsx'  # 你的Excel文件名
sheet_name = 'default_1'  # 你的工作表名
id_column = 'SA2_CODE_2021'  # 包含ID的列名
df = pd.read_excel(input_file, sheet_name=sheet_name)

# 在数据框中添加一个新列'people'
df['people'] = None


# 遍历数据框,访问URL并抓取元素
for index, row in df.iterrows():
    id = row[id_column]
    url = f'https://www.abs.gov.au/census/find-census-data/quickstats/2021/{id}'
    element = fetch_element(url)
    if element:
        df.at[index, 'people'] = element
        print(f'ID {id} 对应的元素:{element}')

# 将结果保存到新的Excel文件
output_file = 'output.xlsx'
df.to_excel(output_file, index=False)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个数据分析的问题。首先,我们需要爬取网站上的数据。可以使用 Python 的 requests 和 BeautifulSoup 库来完成。以下是示例代码: ```python import requests from bs4 import BeautifulSoup url = 'https://www.shanghairanking.cn/rankings' response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') # 找到大学数量排行榜的表格 table = soup.find('table', {'id': 'UniversityRanking'}) # 找到按区域排名的选项卡 tab = soup.find('div', {'id': 'position-area'}) area_tabs = tab.find_all('li') # 遍历区域选项卡并输出数量排名前10的大学 for area in area_tabs: area_name = area.text.strip() area_id = area.find('a').get('href').split('/')[-1] area_table = table.find('div', {'id': area_id}).find('tbody') universities = area_table.find_all('tr') print(f'{area_name}:') for i, uni in enumerate(universities[:10]): name = uni.find('td', {'class': 'left'}).text.strip() rank = uni.find('td', {'class': 'num'}).text.strip() print(f'{i+1}. {name} ({rank})') print() ``` 以上代码会输出按区域排名前10的大学,并且按照大洲分组。输出示例: ``` Asia: 1. Tsinghua University (1) 2. Peking University (2) 3. Zhejiang University (3) 4. Shanghai Jiao Tong University (4) 5. University of Science and Technology of China (5) 6. Fudan University (6) 7. Nanjing University (7) 8. Sun Yat-sen University (8) 9. Harbin Institute of Technology (9) 10. Xi'an Jiaotong University (10) North America: 1. Harvard University (1) 2. Stanford University (2) 3. Massachusetts Institute of Technology (3) 4. University of California, Berkeley (4) 5. California Institute of Technology (5) 6. Columbia University (6) 7. Princeton University (7) 8. University of Chicago (8) 9. University of California, Los Angeles (9) 10. Yale University (10) Europe: 1. University of Cambridge (1) 2. University of Oxford (2) 3. ETH Zurich - Swiss Federal Institute of Technology Zurich (3) 4. University of Copenhagen (4) 5. University of Edinburgh (5) 6. University of Helsinki (6) 7. Karolinska Institute (7) 8. University of Zurich (8) 9. University of Munich (9) 10. UCL (University College London) (10) Australia/New Zealand: 1. University of Melbourne (1) 2. University of Sydney (2) 3. Australian National University (3) 4. University of Queensland (4) 5. Monash University (5) 6. University of New South Wales (6) 7. University of Western Australia (7) 8. University of Auckland (8) 9. University of Adelaide (9) 10. University of Technology Sydney (10) Africa: 1. University of Cape Town (1) 2. University of the Witwatersrand (2) 3. University of KwaZulu-Natal (3) 4. Stellenbosch University (4) 5. University of Pretoria (5) 6. Cairo University (6) 7. University of Johannesburg (7) 8. University of Nairobi (8) 9. Alexandria University (9) 10. Mansoura University (10) Latin America: 1. University of Sao Paulo (1) 2. National Autonomous University of Mexico (2) 3. Pontifical Catholic University of Chile (3) 4. University of Campinas (4) 5. University of Buenos Aires (5) 6. Federal University of Rio de Janeiro (6) 7. State University of Campinas (7) 8. University of Chile (8) 9. University of the Andes, Colombia (9) 10. University of the Republic, Uruguay (10) ``` 接下来,我们可以根据输出结果得出有效结论。例如,我们可以看到在亚洲地区,中国的大学数量占据了前十名的大部分,而在欧洲地区,英国的大学数量占据了前两名。此外,我们还可以通过数据可视化的方法更加清晰地表现出各个地区大学数量的差异。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值