python http代理ip接口API
2024年4月17日大约 8 分钟约 2366 字
快代理IP接口
proxy_ip.py
"""代理ip
官网:https://www.kuaidaili.com/
查看订单信息:https://www.kuaidaili.com/uc/order-list/
"""
import requests
import json
from typing import Literal, Union
import random
from django.core.cache import cache
from utils.location_info import main_city_dict
def get_kuaidaili_ip(location: Union[str, list, bool] = '', format: Literal['text', 'json'] = 'text', is_password: bool = True, is_display_location=False):
"""得到一个代理IP地址
:param is_password: 返回时,是否添加密码信息(如果是白名单就不用添加)
:param location: 地区(可输入省份名称或者城市名称),如果是城市列表代表在范围中随机选择,如果是字符串代表指定城市
:param is_display_location: 是否返回地区,如果返回地区则是一个元组数据
"""
if not location:
return '', '' if is_display_location else ''
elif isinstance(location, list):
location = random.choice(location)
elif location is True:
location = random.choice(list(main_city_dict.values()))
# 私密代理IP接口API:https://www.kuaidaili.com/doc/api/getdps/
api_url = 'https://dps.kdlapi.com/api/getdps'
# 查看订单API密钥:https://www.kuaidaili.com/uc/api/secret/
params = {
'secret_id': 'xxx',
'signature': 'xxx',
'num': 1, # 数量,
'area': location, # 筛选地区(仅支持按IP付费订单),可支持格式示例:'湖北', '湖北省', '武汉', '武汉市', '北京省', '北京市'。不支持省市拼接一起的字符串。
# 'f_loc': 1 # (测试使用)返回结果 添加地区信息,https://www.kuaidaili.com/doc/dev/china_area_code/#42
# 'f_et': 1, # (测试使用)返回结果 添加可用时间信息。这里测试与购买额度固定一致,就不用使用。
}
# 获取IP
try:
ip_response = requests.get(api_url, params=params)
except Exception as e:
print(e)
return
if ip_response.status_code != 200:
return
ip_str = ip_response.text # 得到代理IP地址
# 查看代理访问密码:https://www.kuaidaili.com/uc/dps/
username = 'd4245106311'
password = '8ybkdofj'
# 是否将代理IP验证的账号密码一起输出
if is_password:
proxy_ip_info = f"{username}:{password}@{ip_str}"
else:
proxy_ip_info = ip_str
# 返回格式为文本还是json
if format == 'text':
if is_display_location:
return proxy_ip_info, location
else:
return proxy_ip_info
else:
proxies = {
"http": f"http://{proxy_ip_info}/",
"https": f"http://{proxy_ip_info}/"
}
if is_display_location:
return {'proxies': proxies, 'location': location}
else:
return proxies
def get_kuaidaili_locations() -> list:
"""得到快代理支持的地区"""
api_url = 'https://dps.kdlapi.com/api/dpsresources'
params = {
'secret_id': 'xxx',
'signature': 'xxx',
}
# 缓存中获取可用地区
city_list = cache.get('kuaidaili_city_list')
if city_list:
return city_list
try:
location_response = requests.get(api_url, params=params)
data = location_response.json().get('data')
city_list = {item['area_name'] for item in data}
city_list = list(city_list)
cache.set('kuaidaili_city_list', city_list, 60 * 10)
return city_list
except Exception as e:
print(e)
return []
def print_kuaidaili_location():
"""(测试使用)打印快代理支持的地区
https://www.kuaidaili.com/doc/dev/china_area_code/
将文件下载到当前目录并转换成xlsx格式
"""
import pandas as pd
import os
# 加载Excel文件
current_directory = os.path.abspath('.')
file_path = os.path.join(current_directory, '中国地区编码表.xlsx')
df = pd.read_excel(file_path)
# 初始化一个字典来存储省份和对应的市名字
province_city_dict = {}
# 遍历DataFrame的每一行
for index, row in df.iterrows():
# 获取省份和城市名称
province = row['省份']
city = row['城市']
# 如果城市名为“市辖区”,则认为是直辖市,将值设置为None
# 否则,将城市名添加到对应省份的列表中
if city == "市辖区":
province_city_dict[province] = None
else:
province_city_dict.setdefault(province, []).append(city)
# 移除重复的城市名字并转换字典为JSON字符串
for province in province_city_dict:
if province_city_dict[province] is not None:
province_city_dict[province] = list(set(province_city_dict[province]))
json_output = json.dumps(province_city_dict, ensure_ascii=False, indent=2)
# 打印输出结果
print(json_output)
if __name__ == '__main__':
# 得到代理IP可用城市
ip = get_kuaidaili_ip(location=True, is_display_location=True)
print(ip)
# 获取一个代理IP
# proxies = get_kuaidaili_ip(format='json', location='海口市')
# response = requests.get("http://dev.kdlapi.com/testproxy", proxies=proxies)
# if response.status_code == 200:
# print(response.text) # # 请勿使用keep-alive复用连接(会导致隧道不能切换IP)
# else:
# API公共错误码:https://www.kuaidaili.com/doc/dev/dpshttpresponse/
# 私密代理错误信息:https://www.kuaidaili.com/doc/dev/dpshttpresponse/
# print(response.status_code)
# 获取中国地区编码:https://www.kuaidaili.com/doc/dev/china_area_code
# get_kuaidaili_location()
location_info.py
import random
# 省市信息
city_dict = {
"北京": None,
"天津": None,
"河北": [
"保定市",
"邯郸市",
"张家口市",
"石家庄市",
"衡水市",
"沧州市",
"承德市",
"秦皇岛市",
"唐山市",
"廊坊市",
"邢台市"
],
"山西": [
"晋中市",
"长治市",
"忻州市",
"临汾市",
"运城市",
"吕梁市",
"晋城市",
"太原市",
"朔州市",
"阳泉市",
"大同市"
],
"内蒙古": [
"阿拉善盟",
"包头市",
"通辽市",
"巴彦淖尔市",
"赤峰市",
"乌海市",
"鄂尔多斯市",
"锡林郭勒盟",
"呼和浩特市",
"呼伦贝尔市",
"乌兰察布市",
"兴安盟"
],
"辽宁": [
"本溪市",
"锦州市",
"营口市",
"阜新市",
"葫芦岛市",
"丹东市",
"大连市",
"鞍山市",
"辽阳市",
"朝阳市",
"沈阳市",
"盘锦市",
"抚顺市",
"铁岭市"
],
"吉林": [
"吉林市",
"通化市",
"松原市",
"白山市",
"长春市",
"白城市",
"四平市",
"延边朝鲜族自治州",
"辽源市"
],
"黑龙江": [
"大庆市",
"鹤岗市",
"黑河市",
"大兴安岭地区",
"齐齐哈尔市",
"双鸭山市",
"绥化市",
"哈尔滨市",
"七台河市",
"鸡西市",
"佳木斯市",
"伊春市",
"牡丹江市"
],
"上海": None,
"江苏": [
"南通市",
"扬州市",
"泰州市",
"苏州市",
"宿迁市",
"连云港市",
"镇江市",
"淮安市",
"盐城市",
"南京市",
"无锡市",
"常州市",
"徐州市"
],
"浙江": [
"金华市",
"台州市",
"丽水市",
"温州市",
"杭州市",
"宁波市",
"绍兴市",
"衢州市",
"舟山市",
"湖州市",
"嘉兴市"
],
"安徽": [
"蚌埠市",
"滁州市",
"铜陵市",
"阜阳市",
"合肥市",
"六安市",
"宣城市",
"安庆市",
"池州市",
"淮北市",
"黄山市",
"芜湖市",
"马鞍山市",
"宿州市",
"淮南市",
"亳州市"
],
"福建": [
"福州市",
"南平市",
"莆田市",
"厦门市",
"龙岩市",
"宁德市",
"漳州市",
"泉州市",
"三明市"
],
"江西": [
"上饶市",
"九江市",
"萍乡市",
"鹰潭市",
"新余市",
"宜春市",
"景德镇市",
"吉安市",
"南昌市",
"抚州市",
"赣州市"
],
"山东": [
"菏泽市",
"烟台市",
"青岛市",
"东营市",
"潍坊市",
"济宁市",
"泰安市",
"威海市",
"聊城市",
"滨州市",
"济南市",
"日照市",
"枣庄市",
"淄博市",
"临沂市",
"德州市"
],
"河南": [
"安阳市",
"新乡市",
"周口市",
"省直辖县级行政区划",
"濮阳市",
"许昌市",
"驻马店市",
"开封市",
"平顶山市",
"信阳市",
"商丘市",
"洛阳市",
"南阳市",
"焦作市",
"鹤壁市",
"郑州市",
"漯河市",
"三门峡市"
],
"湖北": [
"黄石市",
"省直辖县级行政区划",
"十堰市",
"随州市",
"黄冈市",
"咸宁市",
"荆门市",
"武汉市",
"襄阳市",
"荆州市",
"宜昌市",
"恩施土家族苗族自治州",
"鄂州市",
"孝感市"
],
"湖南": [
"娄底市",
"常德市",
"衡阳市",
"郴州市",
"益阳市",
"永州市",
"怀化市",
"邵阳市",
"株洲市",
"张家界市",
"湘西土家族苗族自治州",
"湘潭市",
"长沙市",
"岳阳市"
],
"广东": [
"江门市",
"湛江市",
"佛山市",
"揭阳市",
"广州市",
"深圳市",
"清远市",
"肇庆市",
"河源市",
"阳江市",
"云浮市",
"梅州市",
"惠州市",
"汕头市",
"潮州市",
"汕尾市",
"茂名市",
"珠海市",
"韶关市"
],
"广西": [
"来宾市",
"梧州市",
"柳州市",
"防城港市",
"河池市",
"钦州市",
"玉林市",
"百色市",
"桂林市",
"北海市",
"贺州市",
"崇左市",
"南宁市",
"贵港市"
],
"海南": [
"三亚市",
"省直辖县级行政区划",
"三沙市",
"海口市"
],
"重庆": None,
"四川": [
"成都市",
"凉山彝族自治州",
"甘孜藏族自治州",
"内江市",
"阿坝藏族羌族自治州",
"眉山市",
"德阳市",
"攀枝花市",
"广元市",
"遂宁市",
"资阳市",
"达州市",
"乐山市",
"自贡市",
"泸州市",
"南充市",
"绵阳市",
"雅安市",
"宜宾市",
"巴中市",
"广安市"
],
"贵州": [
"黔南布依族苗族自治州",
"铜仁市",
"黔西南布依族苗族自治州",
"黔东南苗族侗族自治州",
"安顺市",
"遵义市",
"毕节市",
"贵阳市",
"六盘水市"
],
"云南": [
"德宏傣族景颇族自治州",
"玉溪市",
"丽江市",
"楚雄彝族自治州",
"曲靖市",
"普洱市",
"红河哈尼族彝族自治州",
"昆明市",
"怒江傈僳族自治州",
"西双版纳傣族自治州",
"文山壮族苗族自治州",
"昭通市",
"临沧市",
"迪庆藏族自治州",
"保山市",
"大理白族自治州"
],
"西藏": [
"昌都市",
"日喀则市",
"阿里地区",
"林芝市",
"山南市",
"拉萨市",
"那曲市"
],
"陕西": [
"咸阳市",
"安康市",
"铜川市",
"商洛市",
"西安市",
"汉中市",
"榆林市",
"宝鸡市",
"延安市",
"渭南市"
],
"甘肃": [
"天水市",
"酒泉市",
"定西市",
"张掖市",
"白银市",
"庆阳市",
"临夏回族自治州",
"平凉市",
"甘南藏族自治州",
"兰州市",
"陇南市",
"武威市",
"金昌市"
],
"青海": [
"海东市",
"黄南藏族自治州",
"果洛藏族自治州",
"玉树藏族自治州",
"西宁市",
"海西蒙古族藏族自治州",
"海北藏族自治州",
"海南藏族自治州"
],
"宁夏": [
"中卫市",
"吴忠市",
"银川市",
"固原市",
"石嘴山市"
],
"新疆": [
"省直辖县级行政区划",
"吐鲁番市",
"昌吉回族自治州",
"塔城地区",
"乌鲁木齐市",
"克拉玛依市",
"克孜勒苏柯尔克孜自治州",
"喀什地区",
"巴音郭楞蒙古自治州",
"伊犁哈萨克自治州",
"阿克苏地区",
"阿勒泰地区",
"和田地区",
"哈密市",
"博尔塔拉蒙古自治州"
]
}
main_city_dict = {
'北京': '北京',
'天津': '天津',
'河北': '石家庄市',
'山西': '太原市',
'内蒙古': '呼和浩特市',
'辽宁': '沈阳市',
'吉林': '长春市',
'黑龙江': '哈尔滨市',
'上海': '上海',
'江苏': '南京市',
'浙江': '杭州市',
'安徽': '合肥市',
'福建': '福州市',
'江西': '南昌市',
'山东': '济南市',
'河南': '郑州市',
'湖北': '武汉市',
'湖南': '长沙市',
'广东': '广州市',
'广西': '南宁市',
'海南': '海口市',
'重庆': '重庆',
'四川': '成都市',
'贵州': '贵阳市',
'云南': '昆明市',
'西藏': '拉萨市',
'陕西': '西安市',
'甘肃': '兰州市',
'青海': '西宁市',
'宁夏': '银川市',
'新疆': '乌鲁木齐市'
}
def get_one_city(city_scope: list=None):
city_list = list(list(main_city_dict.values()))
if city_scope:
city_list = list(set(city_scope) & set(city_list)) # 两个合集的交集
if not city_list:
return ''
# 随机获取一个重点城市名称
return random.choice(city_list)