039 爬取json数据以HTML形式到本地

上节课内容

#037学习Python爬虫爬取博客园作业

本节课内容

爬取数据保存到本地

解析json数据

介绍HTML

json数据保存为HTML并加上超链接

爬取数据

直接使用上节课代码
把文件保存到以.html结尾的文件中

import requests
url = 'https://edu.cnblogs.com/Homework/GetAnswers?homeworkId=3103&_=1557235742010'
try:
    r = requests.get(url,timeout=20)
    r.raise_for_status()
    r.encoding = r.apparent_encoding
except:
    print('网络异常或页面未找到,请重试')
f=open('homework.html','w')

保存文件

解析json数据

引入json库

import json

举一反三
为何想到引用json库?
1.首先 具有基本的背景知识,知道数据类型为json
2.结合 python 语言的特点 第三方库众多
3.在搜索引擎搜索 python json相关信息


python json相关信息

4.根据搜索引擎的返回结果即可确定存在json库可以使用

使用json.loads()解析字符串

l=json.loads(r.text)

使用json库中loads函数,将r.text字符串解析成dict字典格式,存储于l中

解析后字典的使用

l为字典型

遍历l的字典中的键值对
l 存在三种键值对,data,recordsTotal,recordsFiltered
从英文翻译中我们就能知道,数据在l[“data”]中


i存在三个键值对

所以我们遍历l[“data”]

发现我们每个l["data"]里面存储的是列表。


遍历l[“data”]

通过遍历输出列表里第一个字典元素,输出了所有key


列表遍历

根据英语翻译我们很容易就找到了数据内部的
链接 ,姓名,学号和上交时间分别为
i['Url'],i['RealName'],i['StudentNo'],i['DateAdded']

介绍HTML

HTML最最最基础

HTML 以'<html>'</html>'内部存放头<head>和<\head> 和身体<body><\body>


简单的HTML结构

我们把数据存储在body里面就可以了

存储在<p><\p>段落标签里

超链接使用

<a href=\"{网页链接}\"target=\"_blank\" >连接 </a>

存储思路
使用字符串headers存储

header='''
<html>
<head>
<title>爬虫作业</title></head>
<body>
'''

字符串footer存储


footer='''

</body>
</html>
'''

数据内容存储到body内


 body=body+("<p><a href=\"{}\"target=\"_blank\" >连接 </a>姓名 {}学号{} 时间{}</p>".format(i['Url'],i['RealName'],i['StudentNo'],i['DateAdded']))

最后将字符串header+body+footer存储到.html文件内

json数据保存为HTML并加上超链接

import requests
import json
url = 'https://edu.cnblogs.com/Homework/GetAnswers?homeworkId=3103&_=1557235742010'
try:
    r = requests.get(url,timeout=20)
    r.raise_for_status()
    r.encoding = r.apparent_encoding
except:
    print('网络异常或页面未找到,请重试')
f=open('homework.html','w')
l=json.loads(r.text)
header=''' <html> <head> <title>爬虫作业</title></head> <body> '''
footer=''' </body> </html> '''
body=''
for i in l["data"]:
     body=body+("<p><a href=\"{}\"target=\"_blank\" >连接 </a>姓名 {}学号{} 时间{}</p>".format(i['Url'],i['RealName'],i['StudentNo'],i['DateAdded']))
     print ("<p>连接 {}姓名 {}学号{} 时间{}</p>".format(i['Url'],i['RealName'],i['StudentNo'],i['DateAdded']))
s=header+body+footer
f.write(s)
f.close()