爬虫+各种花括号处理 分析数据就要先处理数据

爬虫+各种花括号处理 分析数据就要先处理数据

 第一步 爬取数据

这样的日志页面需要取下来对时间进行分析,也可以求人家从数据库里面取出来给我,但是数据差不多,还是不求了

话不多说 只会request的我,根据往常一样,反手一个request.get(url)

和F12看到的一点都不一样??

 爬虫+各种花括号处理 分析数据就要先处理数据

 好吧 看一下请求数据

在控制台>network>XHR检查到每次刷新都有一个getlog的请求
拿到Request URL: https://
使用request进行get,发现返回200没问题,但是返回的也是云里雾里,要这要那,说了一堆需要认证的地方
在请求页面取cookies,放入headers,拿到了数据
爬取代码如下:

headers = {‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; WOW64) Chrome/50.0.2661.102‘, ‘cookie‘: ‘emplId=888888; ak_user_timezone=A...‘}
sentence = requests.get(headers=headers, url=posturl)
#sentence = requests.post(posturl, postdata)
print(sentence.status_code)
sentence.encoding = sentence.apparent_encoding # 防止中文乱码
return sentence.text # 直接返回text

拿到数据格式如下:

`{"object":{"dataList":[{"creatorName":"楚","description":"正式环境部署成功<a href=\"https://abc\">部署日志</a>","descriptionValues":"[\"预发-正式部署开始\",\"https://abc\"]","CreateTime":1575521902000,"objectType":"APP_FLOW",,"status":"成功"},{"creatorName":"楚","description":"灰度环境部署成功<a href=\"https://abc\">部署日志</a>","descriptionValues":"[\"预发-灰度环境\",\"https://abc\"]","CreateTime":1575521408000,"objectType":"APP_FLOW","status":"成功"},{...},{}}`


外面的大括号代表一页的量,一页是10条日志也是用大括号隔开,暂且展示2条,目标就是去大括号,去超链接,提取需要的时间等数据进行统计

第二步 数据处理

将爬取的数据存在了本地txt文件,先读取txt

f = open("write.txt", "r")
str = f.readlines()
print(str)

提取dataList
使用findall对`dataList":[和],"total`之间的内容进行提取,等于拿到了每页的关键性内容

for i in str:
log = re.findall(r‘dataList":\[(.*?)\],"total‘, i)[0]

得到的log如下,数据类型为<class ‘str‘>:

`{"creatorName":"楚","description":"正式环境部署成功<a href=\"https://abc\">部署日志</a>","descriptionValues":"[\"预发-正式部署开始\",\"https://abc\"]","CreateTime":1575521902000,"objectType":"APP_FLOW",,"status":"成功"},{"creatorName":"楚","description":"灰度环境部署成功<a href=\"https://abc\">部署日志</a>","descriptionValues":"[\"预发-灰度环境\",\"https://abc\"]","CreateTime":1575521408000,"objectType":"APP_FLOW","status":"成功"},{...},{}`

对花括号再进行剥除,得到list的列表,列表每个元素为一条日志

type1 = re.findall(r‘\{(.*?)\}‘, log)

`[‘"actionType":"重新部署"..]`
将拿到的列表中的每一条日志划分为一个列表

lengnum = len(type1)
for j in range(lengnum):
joblist = type1[j].split(‘,‘)

爬虫+各种花括号处理 分析数据就要先处理数据

这时候的数据大部分都是key:value形式的,但有一部分是只有字符串的,把这部分筛掉
方法:有“:”我们认为格式正确,将他们放入新的dict1字典中

for k in joblist:
if ‘:‘ in k:
dict1[k.split(‘:‘)[0]] = k.split(‘:‘)[1]

这时候处理完后,其实超链接也会被截断,因为链接也有“:”,刚好,这时候超链接只剩下`<a href=\"https`这一节,只要取“<”的左边内容就OK
顺便使用strip(‘"‘)对多余的双引号进行删除,lstrip=leftstrip?

if ‘"status"‘ in dict1.keys():
dict1[‘"description"‘] = dict1[‘"description"‘].split(‘<‘)[0].lstrip(‘"‘)
dict1[‘"creatorName"‘] = dict1[‘"creatorName"‘].strip(‘"‘)
dict1[‘"status"‘] = dict1[‘"status"‘].strip(‘"‘)

这时候使用字典进行提取,组合

dict2 = [dict1[‘"creatorName"‘], dict1[‘"description"‘], dict1[‘"CreateTime"‘], dict1[‘"time"‘]dict1[‘"status"‘]]

拿到的就是list

[‘翔仔‘, ‘预发-灰度环境部署成功‘, ‘1575521902000‘, ‘2019-12-05 12:58:22‘,‘成功‘]
为了存入文件,将list转换为str

dict3 = ",".join(dict2)

 写入txt文件,加换行符逐行写入

file_name = ‘target.txt‘
with open(file_name, ‘a+‘) as file_obj:
file_obj.write(dict3 + ‘\n‘)

第三步 数据存入mysql

可以直接存的 我多此一举

#coding=utf-8
import MySQLdb
#MySQL的连接
conn = MySQLdb.connect(
                host=‘localhost‘,
                port=3306,
                user=‘root‘,
                passwd=‘root‘,
                db=‘test‘,
                charset=‘utf8‘,
            )
cur = conn.cursor()
f = open("target8.txt", "r", encoding=‘UTF-8‘)
while True:
    line = f.readline()
    if line:
        #处理每行\n
        line = line.strip(‘\n‘)
        line = line.split(",")
        print(line)
        cur.execute(
            "insert into test1(creatorName,description,CreateTime,runtime,status) values(%s,%s,%s,%s,%s)",
            [line[0], line[1], line[2], line[3], line[4]])
    else:
        break
f.close()
cur.close()
conn.commit()
conn.close()

在mysql表里面添加一列,对每行数据添加特征值,方便匹配

添加部署记录标记
UPDATE test1 SET jobtype=‘originalPub‘ WHERE description LIKE ‘%正式部署%‘
UPDATE test1 SET jobtype=‘grayPub‘ WHERE description LIKE ‘%灰度环境部署%‘
添加代码合并标记
UPDATE test1 SET jobtype=‘codemergefail‘ WHERE description LIKE ‘%代码合并冲突%‘
UPDATE test1 SET jobtype=‘codemergefail‘ WHERE description LIKE ‘%代码合并失败%‘
UPDATE test1 SET jobtype=‘beginChange‘ WHERE description LIKE ‘%将变更%‘
UPDATE test1 SET jobtype=‘codemergesuccess‘ WHERE description LIKE ‘%代码合并成功%‘
新建一张表,添加第一列id自增序列,筛选出的重要数据存入该表进行运算使用
INSERT INTO test3 SELECT * FROM test1 WHERE jobtype=‘originalPub‘ OR jobtype=‘beginChange‘ OR jobtype=‘grayPub‘ OR jobtype=‘codemergefail‘ OR jobtype=‘codemergesuccess‘
 

相关推荐