CoderCastrov logo
CoderCastrov
Парсер

Парсинг информации о офисах пособий по социальной защите в Python

Парсинг информации о офисах пособий по социальной защите в Python
просмотров
2 мин чтение
#Парсер

Я помогал моему знакомому социальному работнику создать карту офисов пособий по социальной защите, используя Python. Целью было предоставить данные об адресах и телефонных номерах офисов в формате CSV. В этом проекте я работал вместе с моим другом Казуми (@dzeyelid).

Поиск данных об офисах пособий по социальной защите

Изначально проблемой было то, что информация о всех префектурах не была собрана на официальных веб-сайтах администрации. Поэтому мы нашли эту информацию на этом веб-сайте с использованием открытых данных!

Почему-то пропущена информация о префектуре Сидзуока, поэтому мы получили ее отсюда. (Хотелось бы, чтобы администрация управляла этим централизованно...)

Извлечение таблицы из HTML

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

Сначала загрузим необходимые библиотеки. Для парсинга я использовал библиотеку Beautifulsoup, которая позволяет извлекать данные из HTML и XML в Python (официальная документация).

from bs4 import BeautifulSoup
import csv
import re
import requests
from requests.compat import urljoin
import urllib

Затем получим URL страницы с таблицей для каждой префектуры и добавим их в список (эту часть написал Казуми).

base_url = "[http://kouhihutan.mikiseikeigeka-painclinic.com](http://kouhihutan.mikiseikeigeka-painclinic.com)"
url = urljoin(base_url, "japan.html")
r = requests.get(url)
soup = BeautifulSoup(r.content, 'html.parser')
target_div = soup.find_all('div', id='left')
atags = target_div[0].find_all(title=re.compile(".*の公費負担者番号一覧"))
urls = []
for atag in atags:
    url = urljoin(base_url, atag['href'])
    urls.append(url)
print(urls)

Используя полученный список URL, извлечем таблицы для каждой префектуры с помощью цикла for и добавим их в один CSV файл.

with open("office_data.csv", "w", encoding='utf-8') as file:
    writer = csv.writer(file)
    for url in urls:
        html = urllib.request.urlopen(url)
        soup = BeautifulSoup(html, 'html.parser')
        table = soup.find_all("table")
        rows = table[0].find_all("tr")
        for row in rows:
            csvRow = []
            for cell in row.findAll(['td', 'th']):
                csvRow.append(cell.get_text())
            writer.writerow(csvRow)

office_data.csv будет выглядеть следующим образом.

Выполним аналогичную операцию для префектуры Сидзуока.

url = "[https://www.yellowpagesmalta.com/archives/432](https://www.yellowpagesmalta.com/archives/432)"
html = urllib.request.urlopen(url)
soup = BeautifulSoup(html, 'html.parser')
table = soup.find_all("table")
with open("shizuoka.csv", "w", encoding='utf-8') as file:
    writer = csv.writer(file)
    rows = table[0].find_all("tr")
    for row in rows:
        csvRow = []
        for cell in row.findAll(['td', 'th']):
            csvRow.append(cell.get_text())
        writer.writerow(csvRow)

shizuoka.csv будет выглядеть следующим образом.

Наконец, объединим эти две таблицы, оставив только необходимые столбцы (название офиса, адрес и телефонный номер), и сохраним результат.

data = pd.read_csv("office_data.csv")
data2 = pd.read_csv('shizuoka.csv', encoding = 'utf-8')
data3 = data2.iloc[:, 1:]
data3.columns = ['所在地', '事務所名', '電話番号']
data3['公費負担者番号\n      (生活保護法) '] = ''
data3['郵便番号'] = ''
data4 = data.append(data3)
data4.to_csv('office_data2.csv', encoding = 'utf-8')

Это все, что нужно сделать!


Карта пунктов подачи заявлений на социальную помощь готова!

На основе предоставленного CSV-файла была создана следующая карта! Я рада, что могу помочь доставить эту информацию нуждающимся людям:pray: