手动修改key 伪修改内存变量
# -*- coding: UTF-8 -*-
import math
import random
import sys
import threading
import time
from time import ctime, sleep
import requests
import xlrd target_citycode_list = ['', '', '', ''] # target_citycode_list = ['0755']
adcode_dic = {}
FEXCEL = '高德地图API_城市编码对照表.xlsx'
data = xlrd.open_workbook(FEXCEL)
table = data.sheets()[1]
nrows = table.nrows
ncols = table.ncols
for i in range(0, nrows):
l = table.row_values(i)
name_ = l[0]
adcode = l[1]
citycode = l[2]
if citycode in target_citycode_list:
if citycode not in adcode_dic:
adcode_dic[citycode] = {}
adcode_dic[citycode][adcode] = {}
adcode_dic[citycode][adcode]['name'] = name_
adcode_dic[citycode][adcode]['adcode'] = adcode REQUEST_LIST = []
for i in adcode_dic:
for ii in adcode_dic[i]:
REQUEST_LIST.append(adcode_dic[i][ii]['adcode'])
REQUEST_LEN = len(REQUEST_LIST)
EACH_THREAD_REQUEST_NUM = 1 MAX_PAGINATION = 100
QPS = 50
QPS_TIME_UNIT = 1
# http://lbs.amap.com/api/webservice/guide/tools/info
INFOCODE_OK = ''
KEY_POOL_LIST = []
touse_key = '' def dynamic_write_pool_file():
global KEY_POOL_LIST
file_name_key_pool = 'key_pool.pool'
keypoollist_old = KEY_POOL_LIST
KEY_POOL_LIST = []
f = open(file_name_key_pool, 'r', encoding='utf-8')
KEY_POOL_LIST = []
for i in f:
try:
key = i.split('\t')[1].split()
KEY_POOL_LIST.append(key[0])
except Exception:
print(Exception)
f.closed
d1 = keypoollist_old.reverse()
d2 = KEY_POOL_LIST.reverse()
print(63, d1)
print(64, d2)
if d1 == d2:
print(time.time(), '-old')
else:
print(time.time(), '66POOL-new')
# if (d1>d2)-(d1<d2) == 0:
# print('64POOL-new')
# else:
# print('66POOL-old')
# # if cmp(KEY_POOL_LIST_old.reverse(),KEY_POOL_LIST.reverse())==0:
# print('64POOL-new')
# else:
# print('66POOL-new')
# if KEY_POOL_LIST == KEY_POOL_LIST_old:
# pass
# else:
# print('POOL-new') dynamic_write_pool_file() URL_TYPE = 'http://restapi.amap.com/v3/place/text'
touse_key = ''
# keywords = '&keywords='
OFFSET_NUM = 24
OFFSET = '&offset=%s' % (OFFSET_NUM)
CITYLIMIT = '&citylimit=true'
EXTENTION = '&extention=all' # 120000 商务住宅 商务住宅相关 商务住宅相关
# 120100 商务住宅 产业园区 产业园区
# 120200 商务住宅 楼宇 楼宇相关
# 120201 商务住宅 楼宇 商务写字楼
# 120202 商务住宅 楼宇 工业大厦建筑物
# 120203 商务住宅 楼宇 商住两用楼宇
# 120300 商务住宅 住宅区 住宅区
# 120301 商务住宅 住宅区 别墅
# 120302 商务住宅 住宅区 住宅小区
# 120303 商务住宅 住宅区 宿舍
# 120304 商务住宅 住宅区 社区中心 # 由于高德至多返回1000条,所以type值以最小粒度请求,逐个请求
POI_TYPES_LIST = ['', '', '', '', '', '', '', '', '', '',
'']
# POI_TYPES = '&types=120000|120100|120200|120201|120202120203|120300|120301|120302|120303|120304' URL_FOR_CHANGE_KEY = 'http://restapi.amap.com/v3/place/text?key=%s&types=060100&city=010&OFFSET=1'
change_key_qps = 0 def change_key():
global touse_key, change_key_qps, KEY_POOL_LIST dynamic_write_pool_file()
# 高德没有遵守自己的QPS/日限策略;所不能通过其返回码,来控制key的使用;
pool_num = len(KEY_POOL_LIST)
mean_use_key = random.randint(0, pool_num)
for i in range(mean_use_key, pool_num, 1):
key = KEY_POOL_LIST[i]
if key == touse_key:
if i == pool_num:
change_key()
return
else:
continue
touse_key = key
url = URL_FOR_CHANGE_KEY % (touse_key)
try:
change_key_qps += 1
if change_key_qps % QPS == 0:
sleep(QPS_TIME_UNIT)
r = requests.get(url)
json_ = r.json()
except Exception:
print('requests.get(url)', Exception)
change_key()
return
infocode = json_['infocode']
if not infocode == INFOCODE_OK:
if i == pool_num:
sys.exit('NOInvalidKEY')
change_key()
return
return requests_counter = 0
todo_list = REQUEST_LIST # {adcode:[[],[]]}
tosupply_dic = {} def supply_dic(request):
global tosupply_dic, requests_counter, todo_list, touse_key, POI_TYPES_LIST, OFFSET_NUM
if requests_counter == 0:
change_key()
for type in POI_TYPES_LIST:
url = '%s?key=%s&city=%s&type=%s%s%s' % (URL_TYPE, touse_key, request, type, OFFSET, CITYLIMIT)
if requests_counter % QPS == 0:
sleep(QPS_TIME_UNIT)
try:
requests_counter += 1
r = requests.get(url)
r_json = r.json()
except Exception:
# 冗余
if request not in todo_list:
todo_list.append(request)
infocode = r_json['infocode']
if infocode == '':
count = r_json['count']
page_count = math.ceil(int(count) / OFFSET_NUM)
if page_count > 0:
for page in range(1, page_count, 1):
url_ = '%s&page=%s' % (url, page)
print(url_)
try:
requests_counter += 1
r_ = requests.get(url_)
r_json_ = r_.json()
except Exception:
# 冗余
if request not in todo_list:
todo_list.append(request)
infocode_ = r_json_['infocode']
if infocode_ == '':
pois_list = r_json['pois']
if request not in tosupply_dic:
tosupply_dic[request] = []
tosupply_dic[request].append(pois_list)
if request in todo_list:
list_index = todo_list.index(request)
del todo_list[list_index]
else:
if request not in todo_list:
todo_list.append(request)
change_key()
else:
if request not in todo_list:
todo_list.append(request)
change_key() MAX_EXCEPTION_URL_NUM = 0 def deal_exception_list():
global todo_list
print(todo_list)
len_ = len(todo_list)
if len_ > MAX_EXCEPTION_URL_NUM:
for nloop in range(0, len_, 1):
adcode = REQUEST_LIST[nloop]
supply_dic(adcode)
else:
return
deal_exception_list() class MyThread(threading.Thread):
def __init__(self, func, args, name=''):
threading.Thread.__init__(self)
self.name = name
self.func = func
self.args = args def run(self):
self.func(self.args) def main():
print('starting at:', ctime())
threads_list = []
thread_sum = math.ceil(REQUEST_LEN / EACH_THREAD_REQUEST_NUM)
for nloop in range(0, thread_sum, 1):
adcode = REQUEST_LIST[nloop]
print(184, adcode)
thread_instance = MyThread(supply_dic, (adcode), supply_dic.__name__)
threads_list.append(thread_instance)
# 主进程将在所有非守护进程退出后,退出
for t in threads_list:
t.setDaemon = False
t.start()
# wait for all thrades to finish
for t in threads_list:
t.join()
deal_exception_list() FGEN = 'GEN_GD_business_building.csv'
fo = open(FGEN, 'w', encoding='utf-8-sig')
fo.write(
'id,name,type,typecode,biz_type,address,location,tel,distance,biz_ext,pname,cityname,adname,shopid,shopinfo,poiweight\n')
fo.closed
fo = open(FGEN, 'a', encoding='utf-8-sig')
for request in tosupply_dic:
l = tosupply_dic[request]
for ll in l:
for dic_ in ll:
str = '%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s\n' % (
dic_['id'], dic_['name'], dic_['type'], dic_['typecode'], dic_['biz_type'],
dic_['address'], dic_['location'].replace(',', ' '), dic_['tel'], dic_['distance'], dic_['biz_ext'],
dic_['pname'],
dic_['cityname'],
dic_['adname'],
dic_['shopid'],
dic_['shopinfo'],
dic_['poiweight'])
fo.write(str)
fo.closed if __name__ == '__main__':
main()
手动修改key 伪修改内存变量的更多相关文章
- CENTOS 修改MYSQL文件到内存盘
# 必须说明的是: # 0 内存盘的特性是断电就丢数据. # 1 对数据时效性要求高的自己做主从 # 2 重启or关机必须导出数据和开机加载数据. # 3 最好弄个脚本 开关机自己调用. # 4 简单 ...
- [转] 用javascript修改css伪类的几种方法
用javascript修改css伪类的几种方法: Modify pseudo element styles with JavaScript http://pankajparashar.com/post ...
- CSS入门(定位之浮动定位、伪类之鼠标悬停、光标修改和透明度修改和列表样式)
一.定位 所为定位,实际上就是定义元素框相对于其正常位置,应该出现在哪儿 定位就是改变元素在页面上的默认位置 分类: 普通流定位(元素默认的定位方式) 浮动定位 相对定位 绝对定位 固定定位 1.普通 ...
- 手动ubuntu 18.04修改登录锁屏界面效果(含登录背景修改)flat-remix
前言 在ubuntu 18.04,可以通过修改/etc/alternatives/gdm3.css来进行修改 本来想直接使用flat-remix主题,但是只有这个登录界面没有达到作者演示的效果,所以手 ...
- .NET Core采用的全新配置系统[5]: 聊聊默认支持的各种配置源[内存变量,环境变量和命令行参数]
较之传统通过App.config和Web.config这两个XML文件承载的配置系统,.NET Core采用的这个全新的配置模型的最大一个优势就是针对多种不同配置源的支持.我们可以将内存变量.命令行参 ...
- Linux 用户切换、修改用户名、修改密码
一.用户切换 "$":普通用户提示符 "#":root用户提示符 1.普通用户到root: 方式一:命令:su然后输入root密码 此种方式只是切换了root身 ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 用户部分(3)修改资料、修改密码
在上一篇博客中实现了用户的注销和登录,其实代码里落了点东西,就是用户登录要更新最后一次登录时间和登录IP,这次补上.今天做修改资料和修改密码,TryUpdateModel是新用到的东西. 目录: AS ...
- 2.Visual FoxPro内存变量显示和清除命令
一.内存变量的显示相关命令: 1. LIST MEMORY[LIKE<通配符>][TO PRINTER |TO FILE<文件名>] 2. DISPLAY MEMORY[L ...
- JQuery DataTables Editor---页面内容修改&&数据库信息修改 (2)
接上篇博文,详细说一下js代码以及JQuery DataTables Editor---页面内容修改&&数据库信息修改遇到的问题和解决办法. 1.关于dialog 初始化: $(&qu ...
随机推荐
- Token 认证
Token 认证 From今日头条:https://www.toutiao.com/i6516654967204348430/?tt_from=weixin&utm_campaign=clie ...
- 整理那些用于基本生存的shell命令
变量定义相关的 export export可以将临时定义的变量定义成环境变量 比如在一个shell中临时定义的一个变量就没法在新打开的那个shell中继续再使用 使用export之后 这个变量就变成了 ...
- SpringBoot jar程序配置成服务运行
windows 版本 http://www.cppblog.com/aurain/archive/2014/01/23/205534.aspx linux 版本 https://blog.csdn.n ...
- [Markdown] 04 进阶语法 第二弹
[TOC] 接上一篇 [Mardkown] 03 进阶语法 第一弹 8. LaTeX 8.1 相关介绍 TeX:学术排版 LaTeX:相当于 TeX 的简化版本:对公式编辑精细至像素级别 MathJa ...
- Trie字典树详解
今天上午省选字符串......只会KMP.连hash都不会的我被大佬虐惨了......于是我要发奋图强学习字符串,学习字符串当然就要从Trie树这种可爱的数据结构开始啦!!! 一.什么是Trie树?? ...
- 帝国CMS自定义页面的添加与目录式链接的处理
需求: 1.将某一本地前端自定义页面模板,导入到帝国系统,应用到网站 2.将导入的页面在站点中打开为目录式链接 www.abc.com/softlink/ 环境: 1.windows服务器 2.帝国C ...
- 按字节读取txt文件缓存区大小设置多少比较好?
读取 txt 文件常规写法有逐行读取和按照字节缓存读取,那么按照字节缓存读取时,设置缓存区多大比较好呢?百度了一下,没发现有说这个问题的,自测了一把,以事实说话. 常规读取方法如下: // 字节流读取 ...
- 结合pychrom与selenium实现页面自动登录
缘起 一直在浏览器里用Katalon插件录制一些常用的流程,以减少重复操作,也就自然而然想自己搞搞自动化测试,但无奈登录一关跨不过去,就无法串起来.(不想让开发添加万能验证码的功能)首先想到的是识别验 ...
- find 查找目录下的文件
1. 命令功能 find命令用于查到目录下的文件,同时也可以调用其它命令执行相应操作. 2. 语法格式 find [-H] [-L] [-P] [-Olevel] [-D help|tree|sear ...
- 解决pycharm运行py文件时只有unittest选项的方法
有时候在编完脚本开始运行时,发现某个py脚本右键运行的选项不是run,二是run in unittest,试过很多方法都不能很好的去除,主要是因为脚本中含有test字符串,一种解决方法是将脚本中所有的 ...