免费且不限请求次数的api接口,太平洋网络IP地址查询web接口(地址:http://whois.pconline.com.cn/)
- import requests
- import json
-
- url = 'http://whois.pconline.com.cn/ipJson.jsp'
- ip = '61.235.82.163'
- param = {'ip':ip,
- 'json':'true'
- }
- ree = requests.get(url, params = param)
- re = json.loads(ree.text.replace("\\"," "))
- print(re)
输出结果:
- {'ip': '61.235.82.163',
- 'pro': '广东省',
- 'proCode': '440000',
- 'city': '广州市',
- 'cityCode': '440100',
- 'region': '天河区',
- 'regionCode': '440106',
- 'addr': '广东省广州市天河区 蓝色心情网吧',
- 'regionNames': '',
- 'err': ''}
接口参数:
@param ip:可指定IP地址,不指定则取request.getRemoteAddr()的值。支持以下格式:(a)202.96.159.254 (b)202.096.159.254 (c)202.96.159.254/192.168.20.106 (适用于接口1-8)
@param rep:可指定活动页代码,输出的结果会按系统设置映射到相应的地区 (适用于接口1-8)
@param level:可指定输出结果的精度,=1/=2/=3分别代表只输出省名称/输出省市名称/输出省市区名称 (适用于接口1-9)
@param siteId:可指定网站或应用代码,输出IP所属的区域 (适用于接口2,5. siteId与rep原则上是互斥的)
@param callback:指定回调函数的名称, 不指定则默认为'IPCallBack' (适用于接口2,5)
@param domId:指定结点ID (适用于接口4, 必须指定)
@param id:指定结点ID (适用于接口6, 必须指定)
@param coords:指定坐标值,经度+","+纬度,经度纬度都是2个带小数点的数字。经度范围在73至135之间,纬度范围在3至53之间,即国内区域,不是中国的直接返回空 (适用于接口9-10, 必须指定)
@param json:可指定是否以json格式输出结果,不指定则默认为false。(适用于接口2,10)
参考网址:太平洋网络IP地址查询Web接口
多线程:
Python3 线程中常用的两个模块为:
thread 模块已被废弃。用户可以使用 threading 模块代替。所以,在 Python3 中不能再使用"thread" 模块。为了兼容性,Python3 将 thread 重命名为 "_thread"。
- _thread.start_new_thread ( function, args[, kwargs] )
-
- '''
- function - 线程函数。
- args - 传递给线程函数的参数,他必须是个tuple类型。
- kwargs - 可选参数。
- '''
示例:
- import _thread
- import time
-
- # 为线程定义一个函数
- def print_time( threadName, delay):
- count = 0
- while count < 5:
- time.sleep(delay)
- count += 1
- print ("%s: %s" % ( threadName, time.ctime(time.time()) ))
-
- # 创建两个线程
- try:
- _thread.start_new_thread( print_time, ("Thread-1", 2, ) )
- _thread.start_new_thread( print_time, ("Thread-2", 4, ) )
- except:
- print ("Error: 无法启动线程")
-
- while 1:
- pass
结果:
Thread-1: Wed Jan 5 17:38:08 2022 Thread-2: Wed Jan 5 17:38:10 2022 Thread-1: Wed Jan 5 17:38:10 2022 Thread-1: Wed Jan 5 17:38:12 2022 Thread-2: Wed Jan 5 17:38:14 2022 Thread-1: Wed Jan 5 17:38:14 2022 Thread-1: Wed Jan 5 17:38:16 2022 Thread-2: Wed Jan 5 17:38:18 2022 Thread-2: Wed Jan 5 17:38:22 2022 Thread-2: Wed Jan 5 17:38:26 2022
如果多个线程共同对某个数据修改,则可能出现不可预料的结果,为了保证数据的正确性,需要对多个线程进行同步。
使用 Thread 对象的 Lock 和 Rlock 可以实现简单的线程同步,这两个对象都有 acquire 方法和 release 方法,对于那些需要每次只允许一个线程操作的数据,可以将其操作放到 acquire 和 release 方法之间。如下:
多线程的优势在于可以同时运行多个任务(至少感觉起来是这样)。但是当线程需要共享数据时,可能存在数据不同步的问题。
考虑这样一种情况:一个列表里所有元素都是0,线程"set"从后向前把所有元素改成1,而线程"print"负责从前往后读取列表并打印。
那么,可能线程"set"开始改的时候,线程"print"便来打印列表了,输出就成了一半0一半1,这就是数据的不同步。为了避免这种情况,引入了锁的概念。
锁有两种状态——锁定和未锁定。每当一个线程比如"set"要访问共享数据时,必须先获得锁定;如果已经有别的线程比如"print"获得锁定了,那么就让线程"set"暂停,也就是同步阻塞;等到线程"print"访问完毕,释放锁以后,再让线程"set"继续。
经过这样的处理,打印列表时要么全部输出0,要么全部输出1,不会再出现一半0一半1的尴尬场面。
- import threading
- import time
-
- class myThread (threading.Thread):
- def __init__(self, threadID, name, delay):
- threading.Thread.__init__(self)
- self.threadID = threadID
- self.name = name
- self.delay = delay
- def run(self):
- print ("开启线程: " + self.name)
- # 获取锁,用于线程同步
- threadLock.acquire()
- print_time(self.name, self.delay, 3)
- # 释放锁,开启下一个线程
- threadLock.release()
-
- def print_time(threadName, delay, counter):
- while counter:
- time.sleep(delay)
- print ("%s: %s" % (threadName, time.ctime(time.time())))
- counter -= 1
-
- threadLock = threading.Lock()
- threads = []
-
- # 创建新线程
- thread1 = myThread(1, "Thread-1", 1)
- thread2 = myThread(2, "Thread-2", 2)
-
- # 开启新线程
- thread1.start()
- thread2.start()
-
- # 添加线程到线程列表
- threads.append(thread1)
- threads.append(thread2)
-
- # 等待所有线程完成
- for t in threads:
- t.join()
- print ("退出主线程")
输出结果:
开启线程: Thread-1 开启线程: Thread-2 Thread-1: Wed Jan 5 17:36:50 2022 Thread-1: Wed Jan 5 17:36:51 2022 Thread-1: Wed Jan 5 17:36:52 2022 Thread-2: Wed Jan 5 17:36:54 2022 Thread-2: Wed Jan 5 17:36:56 2022 Thread-2: Wed Jan 5 17:36:58 2022 退出主线程
拆分文本文件:
- def chai():
- # 拆分 text
- open_diff = open(r"C:\Users\Administrator\Desktop\133_ip.txt") # 源文本文件
- diff_line = open_diff.readlines()
- line_list = []
- for line in diff_line:
- line_list.append(line)
- count = len(line_list) # 文件行数
- print('源文件数据行数:', count)
- # 切分diff
- diff_match_split = [line_list[i:i + 5000] for i in range(0, len(line_list), 5000)] # 每个文件的数据行数
- # 将切分的写入多个txt中
- for i, j in zip(range(0, int(count / 5000 + 1)), range(0, int(count / 5000 + 1))): # 写入txt,计算需要写入的文件数
- with open(r'C:\Users\Administrator\Desktop\ip%d.txt' % j, 'w+') as temp:
- for line in diff_match_split[i]:
- temp.write(line)
- print('拆分后文件的个数:', i + 1)