写一份爬取国家数据网站年度数据中人口的数据
时间: 2023-10-10 21:05:24 浏览: 94
本文将介绍如何使用Python爬取国家数据网站中的年度人口数据。
步骤一:分析网站
首先需要分析国家数据网站的网页结构和数据。我们可以使用浏览器的开发者工具来查看网站的HTML代码。
打开国家数据网站的首页(http://data.stats.gov.cn/),选择“人口”分类,并选择“年度数据”子分类。在页面中找到“年度数据”下的“分年度数据”链接,点击进入。
在分年度数据页面中,我们可以看到各年度的人口数据。通过查看页面源代码,可以发现这些数据是以表格的形式呈现的。每一行代表一个省份或直辖市,每一列代表一个数据项,如年末总人口、男性人口、女性人口等。
步骤二:编写爬虫程序
现在我们已经了解了网站的结构和数据,可以开始编写爬虫程序。我们可以使用Python的requests和BeautifulSoup库来爬取网站数据和解析HTML代码。
首先,我们需要导入所需的库:
```python
import requests
from bs4 import BeautifulSoup
```
然后,我们可以定义一个函数来获取网页内容:
```python
def get_html(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
response = requests.get(url, headers=headers)
html = response.text
return html
```
该函数接受一个URL作为参数,并使用requests库发送HTTP请求来获取网页内容。我们使用了一个伪装的User-Agent头来避免被网站防爬虫机制拦截。
接下来,我们可以定义一个函数来解析HTML代码:
```python
def parse_html(html):
soup = BeautifulSoup(html, 'html.parser')
table = soup.find('table', class_='wst_table')
rows = table.tbody.find_all('tr')
data = []
for row in rows:
cols = row.find_all('td')
row_data = [col.text.strip() for col in cols]
data.append(row_data)
return data
```
该函数接受一个HTML代码作为参数,并使用BeautifulSoup库解析HTML代码。我们使用了CSS选择器来定位表格元素,并使用find_all()方法获取所有行元素。然后,我们遍历每一行元素,并使用find_all()方法获取每一列元素。最后,我们将每一行的数据保存到一个列表中,并返回这个列表。
步骤三:爬取数据
现在我们已经定义了获取网页内容和解析HTML代码的函数,可以开始爬取数据了。
首先,我们需要获取年度数据页面的URL:
```python
url = 'http://data.stats.gov.cn/search.htm?s=%E4%BA%BA%E5%8F%A3%E5%B9%B4%E5%BA%A6%E6%95%B0%E6%8D%AE&t=%E5%85%A8%E5%9B%BD%E4%BA%BA%E5%8F%A3%E8%BF%9B%E5%B1%95'
```
该URL可以在浏览器中打开年度数据页面。然后,我们可以使用get_html()函数获取页面内容,并使用parse_html()函数解析HTML代码:
```python
html = get_html(url)
data = parse_html(html)
```
现在,我们已经获取了所有年度数据的表格数据。每一行的数据包括省份(或直辖市)名称和各项人口数据。我们可以遍历这些数据,并将人口数据保存到一个新的列表中:
```python
pop_data = []
for row in data:
province = row[0]
total_pop = int(row[1])
male_pop = int(row[2])
female_pop = int(row[3])
pop_data.append([province, total_pop, male_pop, female_pop])
```
最后,我们可以打印出人口数据列表,或将其保存到文件中:
```python
print(pop_data)
# Save data to CSV file
import csv
with open('pop_data.csv', 'w', newline='', encoding='utf-8') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(['Province', 'Total population', 'Male population', 'Female population'])
for row in pop_data:
writer.writerow(row)
```
这样,我们就成功地爬取了国家数据网站中的年度人口数据,并将其保存到CSV文件中。
阅读全文