时隔两个月,终于抽了时间更新这篇文章。确实是没时间,这不现在还是借同事的电脑来写的,是这样,上个月被调离了原来的工作岗位,一是新的工作需要熟悉,二是我的电脑没带过来。这个爬虫酝酿了很久,我不知道该如何来讲。
我一直认为做采集运维,如果会爬虫,会使用Excel各种公式,可以提高一些工作效率,尤其是爬虫,懂的人自然懂。
何为爬虫,按我自己理解来讲,你写一个程序,根据你定义的条件,自动去网页上查询我们需要的东西,比如说,你有10000个户号,你要去查询这10000个户号对应的用户名称、表号等等,你可以写一个爬虫,很快就能帮你查询完成。之所以叫爬虫,他就像一只虫子一样,在你织的这张“网”上不断的爬取你所需要的东西。
这里还是以简单易懂的采集系统查没有下发参数的为例(如果,我是说如果,大家要学习,最好以采集系统开始,SG186稍微有点难度,这里是说四川这边的,最近新关注的朋友,好像都是外省的,我不知道能不能帮上大家),众所周知没有下发参数的用户,在系统内会有个√,数据返回是sn.flag=1,而下了参数(没有√)的用户,是sn.flag=0,那么我的思路是这样的:
1.获取需要爬取的终端,可以全部爬取,也可以按照成功率小于100爬取,这里以小于100为例2.得到终端的tmid(终端id)后,遍历终端内用户3.判断flag是否等于1,等于1则是未下参数4.存储数据到csv文件
是不是很简单,就这几步。嗯,这里搞忘记了重要的东西,学哪门语言?我讲讲我的历程,我最初是用按键精灵的,写过一些提高效率的脚本,后面觉得工作效率还是不够,接着学习了易语言,个人还比较满意,也随之有了这个公众号,这几个月断断续续学习了Python,目前算是入门吧。谈谈我自己的感受,首先说外在的,年龄大了,很难静下心来学习,二是,比如下班的时候你想学习下,又想和娃视频一下,所以啊,年轻就要多学习~~说说内在的,易语言和Python有点类似,代码构造特别快,因为有些基本的东西,已经有很多比较好的模块(Python的requests)给我们使用,不需要我们再花时间去写了,所以写一些简单的爬虫,不需要很多时间,不需要很多代码就可以完成。易语言就是代码都是中文的,Python是英文的,但是要比什么c、c++容易懂,而且说到爬虫,大数据首先想到的都是Python。所以,根据你自己的需要和理解情况吧,网上教程太多了,你觉得哪门语言能学懂你就学哪个,当然如果你只是为了提高工作效率,二选其一,如果你是想以此入程序猿的门,那么建议你学习Python。
扯了半天,上几张图并说明
我是从这个页面来获取终端id的
代码获取,运行情况
我最近重新整理了思路,以前还用的终端资产去查,要多一次请求,浪费时间
这是写入到表格的结果
这里没有细说每一行代码,这篇文章我不是想讲如何去写这个查未下发参数用户,而是想告诉大家入门编程并不是那么难,关键是能大幅提高我们的工作效率,有精力,有时间的可以学习,可以互相交流。
直接上Python的代码吧。你如果不学习,拿去没用哈,根本运行不了,要安装各类环境才能运行的。
# author:kun5815@ydxxcjywimport requestsimport csvimport timeimport jsonimport randomimport re# 思路:1.获取需要爬取的终端,可以全部爬取,也可以按照成功率小于100爬取,这里以小于100为例 # 2.得到终端的tmid后,遍历终端内用户 # 3.判断flag是否等于1,等于1则是未下参数 # 4.存储数据到csv文件headers = { 'Cookie':'你的cookie','Host':'10.176.34.135','Origin':'http://10.176.34.135','Pragma':'no-cache','User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0',}# cookie先这样吧,后续再更新写登录后获取terminal_info = []def get_tm_id(unitID,startdate,max_value):#参数:单位代码,开始日期,成功率小于 url = 'http://10.176.34.135/meterReadingSuccRateByRtuAction!statisticByOrgs.action' d = { 'unitID':unitID,'unitType':'04','rtu_id':'','rtu_address':'','rtu_factory':'', 'startdate':startdate,'min_value':'','max_value':max_value,'cp_name':'','status':'9999','run_status':'9999','customer_type':'lv','subs_id':'','line_id':'','mult_data_flag':'1','page':'1','pagesize':'20000','ver_salt':'uZ77ZSvGr2t2GTUBm+2jyQ==','menu_id':'401100103'} #先获取需要查询的终端id,如抄表成功率小于100 req = requests.post(url,data = d,headers= headers).text #print(req) req = json.loads(req)#str转为list #print(req) for i in req:#list遍历为字典 #终端ID在['resJson']['Rows']['terminal_id']路径下,遍历到['resJson']['Rows']变为了列表,那么继续遍历列表得到terminal_id Total_num = i['resJson']['Total']#总共需要查询的数量 print('需要查询的有'+ str(Total_num) +'台终端') for a in i['resJson']['Rows']: # print(a['terminal_id']) # 将所有包括terminal_id的信息存储到列表terminal_info里 terminal_info.append({'终端资产':a['asset_no'],'终端名称':a['name'],'是否在线':a['online_status'][23:28],'供电单位':a['org_name'],'terminal_id':a['terminal_id']}) time.sleep(0.1) #遍历终端内用户,判断是否有未下参数,未下参数,sn.flag="1"def get_flag_1(): get_tm_id('5141411','2019-03-03','100') # print(terminal_info) write_info=[]#存储写入csv的信息 url = 'http://10.176.34.135/dwr/call/plaincall/rtuDebugService.getMplist.dwr' #获取scriptSessionId值 ssid = requests.get('http://10.176.34.135/dwr/engine.js').text #print(ssid) orssid_index = ssid.find('dwr.engine._origScriptSessionId = "') #orssid索引从7262开始,一共32位 ssid = ssid[orssid_index + len('dwr.engine._origScriptSessionId = "'):orssid_index + len('dwr.engine._origScriptSessionId = "') + 32] #ssid在orssid基础上加3位随机数字,可能并不会验证ssid ssid = ssid + str(random.randint(100,999)) print(ssid) for rtu_id in terminal_info: print('正在爬取'+rtu_id['终端名称']) d='callCount=1&'+\ 'page=/rtumanage/common/MeasurePointlist.jsp?rtu_id='+ rtu_id['terminal_id'] +'&rtu_pro=2&rtuType=05&'+\ 'httpSessionId=&'+\ 'scriptSessionId=&'+ssid+'&'+\ 'c0-scriptName=rtuDebugService&'+\ 'c0-methodName=getMplist&'+\ 'c0-id=0&'+\ 'c0-param0=string:'+ rtu_id['terminal_id'] +'&'+\ 'batchId=0' # print(d) getMplist = requests.post(url,data=d,headers=headers).text # print(getMplist) #表达式文本:s\d+\['customer_code'\]="(.*?)";s\d+\['customer_name'\]="(.*?)";s\d+.flag="(.*?)";s\d+\['meas_order'\]="(.*?)";.*?;s\d+\['meter_port'\]="(.*?)"; rebds = r's\d+\[\'customer_code\'\]="(.*?)";s\d+\[\'customer_name\'\]="(.*?)";s\d+.flag="(.*?)";s\d+\[\'meas_order\'\]="(.*?)";.*?;s\d+\[\'meter_port\'\]="(.*?)";' # print(rebds) resault = re.findall(rebds,getMplist) # print(resault) for m in resault: flag = m[2]#是否下参数的标识 meas_order = m[3] customer_name = str(m[1]).encode('utf-8').decode('unicode_escape')#解决usc2编码转ansi # print(customer_name) if flag == '1' and int(meas_order) > 2:#筛选测量点号大于2 print('以下用户未下发参数:'+m[0],m[3],m[4],rtu_id['供电单位'],rtu_id['终端名称']) write_info.append({'户号':m[0],'户名':customer_name,'测量点':m[3],'通讯端口':m[4],'终端资产':rtu_id['终端资产'],'终端名称':rtu_id['终端名称'],'是否在线':rtu_id['是否在线'],'供电单位':rtu_id['供电单位']}) print(write_info) if len(write_info) >0:#有数据才储存,没有数据无需储存 print('爬取完毕,准备存储') headers_write = ['户号','户名','测量点','通讯端口','终端资产','终端名称','是否在线','供电单位'] filename = r'C:\Users\Administrator\Desktop\未下参数用户-'+ time.strftime('%Y-%m-%d %H-%M-%S',time.localtime(time.time())) + '.csv' with open(filename,'a+',encoding = 'utf-8',newline = '') as fp: writer = csv.DictWriter(fp,headers_write) writer.writeheader()#写入标题 writer.writerows(write_info) fp.close() print('存储完毕,可以打开了') else: print('没有未下参数用户') if __name__ == "__main__": get_flag_1()
代码可以左右滑动查看全部
加上注释才116行代码,写成两个函数的,方法多种多样,我这也不是唯一答案,我也是根据我最近所学,来交一份答卷,还好运行没有问题,后续学习Scrapy这些吧。
对了,不会的就多搜索,查文档,这个尤其重要,我也没有养成一个好习惯,爱自己试,结果老是耽误时间。