python爬虫 csv文件运行完毕没有东西_采集运维技巧之爬虫

e84c42c33376c215f81d67ba131eb9ac.png

时隔两个月,终于抽了时间更新这篇文章。确实是没时间,这不现在还是借同事的电脑来写的,是这样,上个月被调离了原来的工作岗位,一是新的工作需要熟悉,二是我的电脑没带过来。这个爬虫酝酿了很久,我不知道该如何来讲。

我一直认为做采集运维,如果会爬虫,会使用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。

扯了半天,上几张图并说明

6f517aab7f2d2a6f73de9cabe591e90b.png

我是从这个页面来获取终端id的

c8ccac3252ef43598eb9ea3afe9779da.png

代码获取,运行情况

d5f9db2f80c3fdf7cd793880564b53f6.png

我最近重新整理了思路,以前还用的终端资产去查,要多一次请求,浪费时间

7b0cee02ae147690b85a9837b228927e.png

这是写入到表格的结果

这里没有细说每一行代码,这篇文章我不是想讲如何去写这个查未下发参数用户,而是想告诉大家入门编程并不是那么难,关键是能大幅提高我们的工作效率,有精力,有时间的可以学习,可以互相交流。

直接上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这些吧。

对了,不会的就多搜索,查文档,这个尤其重要,我也没有养成一个好习惯,爱自己试,结果老是耽误时间。

f2100061de4759032998329b5452ac9e.gif

cd306a06639744c866173acdeaf2740e.png

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值