码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-12-09 17:23:33      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:fail   agent   return   val   stat   统计   select   root   本地   

技术图片

 

 

 第一步 爬取数据

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

话不多说 只会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(rdataList":\[(.*?)\],"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

 

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

标签:fail   agent   return   val   stat   统计   select   root   本地   

原文地址:https://www.cnblogs.com/mamang/p/12011854.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!