python代理ip检测

今天刚从老家回来,劳碌了几天了。。。干活是真滴累啊,
回来刚记起来我数据库里还存着上次qiyunip抓下来的代理ip
所以就花了几分钟来写了这个脚本来检测一下代理ip是否可用
因为是在数据库里面的了,这个运行起来比较省事,
因为最开始我写的是单线程的,所以运行起来每一个ip最少要花3s,比较浪费时间
一共是9700多个ip,开始的时候我单线程跑了1000个左右,实在是等不了了
所以我又花了几分钟优化了一下,(加了个多进程,10个进程跑起来还是挺快的)
经过优化后的多进程把剩下的9k多ip跑完共花了37分钟左右,如果按照3s一个
单线来跑的话达到了可怕的8h,想想都头皮发麻,咦惹。。。。
下面是完整的代码

import pymssql
import requests
import jsonimport time
import multiprocessing
# -*- coding:gb2312 -*- # 设置编码格式,这里和数据库一样,以免乱码
sql=pymssql.connect('localhost','账号不能告诉你噢','密码也不可以哦','student',autocommit=True) # 这里是链接到数据库,并自动提交
headers={
'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3722.400 QQBrowser/10.5.3751.400',
}
a=sql.cursor() # 建立游标
a.execute('''select IP,PORT from qiyunip''') # 执行查询语句
q=a.fetchall() # 获取查询的数据

def delete(x): # 定义从数据库删除没用的ip方法
a=sql.cursor()
a.execute(f'''delete from qiyunip where (IP='{x}')''')

def jiance(x): # 检测代理ip是否可用方法
t={'http':x} # 构造代理ip
try:
html=requests.get('http://666cc.cn',headers=headers,proxies=t,timeout=3)# 发送请求并设置超时
if html.status_code==200:
print('可用',x)
except Exception as e: # 错误捕捉,以免程序遇到错误就中断了
print('不可用,删除 ',x)
aaa = x.find(':') # 字符串拼接方法
delete(x[:aaa]) # 删除方法
if __name__ == '__main__':
    s_time=time.time() # 开始计时
    pool=multiprocessing.Pool(10) # 创建进程池,并设置开启10个进程
    for x in q:
        aa=':'.join(x).split()
        pool.apply_async(jiance,(aa[0],)) # 多进程需要传入一个参数
    pool.close() # 进程池满后关闭盖子(满了后不再放入进程)
    pool.join() # 进程阻塞
    print('总共用时',(time.time()-s_time)/60,'分钟') # 结束打印总时长
搜索