一連の考え
記事執筆時点は 2023 年 8 月 4 日ですが、ほとんどの Web ページでは、最初に地域を州として設定し、次に州を通じて対応する都市を取得し、次に都市を通じて対応する地区を取得する、というようになります。したがって、シミュレートされたリクエストもこのロジックに従い、最初にすべての州を取得し、次にすべての都市を取得し、最後にすべての地区を取得します。
実装
ブロガーは実際には、ユーザーが指定した地域に基づいて他のリクエストを行う必要がありますが、ユーザーがこの地域に対応する ID を知ることは不可能であるため、直感的な表示では、地域の名前をキーとして使用し、値として ID を使用しますが、地域の名前は同じである可能性があります。たとえば、異なる都市に同じ名前の地区が存在するため、最終的には、ネストされた辞書を使用して保存することを考えました。これは、州と地区では不可能であるためです。同じであること。
最終的な辞書は次のようになります。
コード
コードの説明
エリアに対応する ID と名前を取得し、3 つのループを経て取得し、辞書を定義し、取得したエリアの名前をキーとして使用します。値も辞書です。この辞書には現在のエリアの ID が含まれます。次に、次のレベルの領域の名前が入れ子になっています。辞書は次のようになります。
{
'广东':{
"id": "19",
"潮州市": {
"id": "1705",
"潮安区": {
"id": "19992",
},
},
"东莞市": {
"id": "1655",
"常平镇": {
"id": "4886",
},
"长安镇": {
"id": "4760",
},
},
},
'其他省份':{'以此类推'}
}
具体的な詳細コード
データ解析部分はWebページごとに返される構造が異なるため、対応するデータを自分で解析する必要があります
# -*- coding: utf-8 -*-
# @Time : 2023/7/13 15:05
# @Author : gongzairen
# @File : get_areas_id_dict.py
import json
import random
import time
import requests
class GetAreasId:
def __init__(self,sku_id):
self.sku_id = sku_id
self.data_dict = {}
# 获取区域id
def get_areas_id(self):
"""
:return: 返回的是包含省,市,区的id 的dict
逻辑很混乱多层嵌套,效果并不好
样例:
{'北京': {'id': '2', '北京市': {'id': '36', '东城区': {'id': '377'}, }},'天津': {'id': '3', '天津市': {'id': '37', '和平区': {'id': '395'},}}}
"""
data_dict = {
"data": "",
"error_info": "无",
'warning_info': "无",
}
url = '对应的url'
headers = HEADERS
headers['Referer'] = f'对应的referer'
headers['Accept'] = '对应的Accept'
all_areas_id_dict = {}
# 获取省id
province_payload = {
'请求的参数': '请求的参数',
}
province_response = requests.get(url,params=province_payload,headers=headers)
province_json = province_response.json()
province_response.close()
# print(province_json)
try:
id_lists = province_json['rows']
for id_dict in id_lists:
province_name = id_dict['name']
province_id_dict = {
'id': str(id_dict['id']),
'level': str(id_dict['level']),
}
all_areas_id_dict[province_name] = province_id_dict
except Exception as e:
data_dict['error_info'] = '区域id结果已发生改变,请联系开发人员'
print('区域id结果已发生改变,请联系开发人员')
print(e)
return data_dict
# 获取市id
for province_name in all_areas_id_dict:
time.sleep(random.uniform(0,2.2))
city_payload = {
'请求的参数': '请求的参数',
}
city_response = requests.get(url, params=city_payload, headers=headers)
city_json = city_response.json()
city_response.close()
# print(city_json)
try:
id_lists = city_json['rows']
for id_dict in id_lists:
city_name = id_dict['name']
city_id_dict = {
'id': str(id_dict['id']),
'level': str(id_dict['level']),
'parentId':str(id_dict['parentId'])
}
all_areas_id_dict[province_name][city_name] = city_id_dict
except Exception as e:
data_dict['error_info'] = '区域id结果已发生改变,请联系开发人员'
print('区域id结果已发生改变,请联系开发人员')
print(e)
return data_dict
# 获取区id
for province_name in all_areas_id_dict:
city_list = list(all_areas_id_dict[province_name].keys())
for city_name in city_list:
if city_name == "id" or city_name == "level":
continue
time.sleep(random.uniform(1, 3))
area_payload = {
'请求的参数': '请求的参数',
}
area_response = requests.get(url, params=area_payload, headers=headers)
area_json = area_response.json()
area_response.close()
print(area_json)
try:
id_lists = area_json['rows']
for id_dict in id_lists:
area_name = id_dict['name']
area_id_dict = {
'id': str(id_dict['id']),
'level': str(id_dict['level']),
'parentId':str(id_dict['parentId'])
}
all_areas_id_dict[province_name][city_name][area_name] = area_id_dict
except Exception as e:
data_dict['error_info'] = '区域id结果已发生改变,请联系开发人员'
print('区域id结果已发生改变,请联系开发人员')
print(e)
return data_dict
data_dict['data] = all_areas_id_dict
print(all_areas_id_dict)
return data_dict
test_sku_id = 'xxxxxx'
HEADERS = {
'Cookie': 'xxxxxx',
}
get_areas_obj = GetAreasId(test_sku_id)
get_areas_result_dict = get_areas_obj.get_areas_id()
if get_areas_result_dict ['error_info'] != "无":
print('获取失败')
else:
all_areas_id_dict = get_areas_result_dict['data']
対応するテーブルを生成する
data = "上面生成的字典" # all_areas_id_dict
id_lists = []
for province_name in data:
city_list = list(data[province_name].keys())
for city_name in city_list:
if city_name == "id" or city_name == "level" or city_name == 'parentId':
continue
area_list = list(data[province_name][city_name].keys())
for area_name in area_list:
if area_name == "id" or area_name == "level" or area_name == 'parentId':
continue
id_lists.append([province_name,city_name,area_name])
print(id_lists)
df = pd.DataFrame(id_lists, columns=['省', '市', '区'])
file_name = 'xxxx地区全表.xlsx'
df.to_excel(file_name, index=False)
print(f"Excel文件已生成: {file_name}")
効果は以下の通りです