目录
JSON
抓取网页动态Ajax请求的数据
练习:爬取糗事百科的段子
JSON
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
JSON语法规则
在 JS 语言中,一切都是对象。因此,任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型:
- 对象表示为键值对
- 数据由逗号分隔
- 花括号保存对象
- 方括号保存数组
JSON键/值对
JSON 键值对是用来保存 JS 对象的一种方式,和 JS 对象的写法也大同小异,键/值对组合中的键名写在前面并用双引号 "" 包裹,使用冒号 : 分隔,然后紧接着值:
概念:一种保存数据的格式
作用:可以保存本地的json文件,也可以将json串进行传输,通常将json称为轻量级的传输方式
json文件组成
- {} 代表对象(字典)
- [] 代表列表
- : 代表键值对
- , 分隔两个部分
例子:将json格式的字符串转换成python对象
import json
#将json格式的字符串转换成python对象
jsonstr = '{"name":"boynextdoor","age":33,"hobby":["money","fight","sleep"],"parames":{"a":1,"b":2}}'
jsondata = json.loads(jsonstr)
print(jsondata)
print(type(jsondata))
print(jsondata['hobby'])
运行结果:
例子:将python对象转换成json格式的字符串
import json
#将python对象转换成json格式的字符串
jsonstr = {"name":"boynextdoor","age":33,"hobby":["money","fight","sleep"],"parames":{"a":1,"b":2}}
jsondata = json.dumps(jsonstr)
print(jsondata)
print(type(jsondata))
运行结果:
抓取网页动态Ajax请求的数据
#抓取网页动态Ajax请求的数据
import urllib.request
import json
import ssl
def ajaxCrawler(url):
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60'
}
req = urllib.request.Request(url,headers=headers)
#使用ssl创建未验证的上下文
context = ssl._create_unverified_context()
response = urllib.request.urlopen(req,context=context)
jsonStr = response.read().decode('utf-8')
jsonData = json.loads(jsonStr)
return jsonData
url = 'https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start=20&limit=20'
info = ajaxCrawler(url)
print(info)
运行结果:
练习:爬取糗事百科的段子
先找到要爬取的页面
然后在该页面中找到每条段子的用户<div class="author clearfix">和内容<div class="content">,应在后面再加参数re.S,表示匹配所有字符
最终代码:
import urllib.request
import json
import ssl
import re
def Crawler(url):
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60'
}
req = urllib.request.Request(url,headers=headers)
#使用ssl创建未验证的上下文
context = ssl._create_unverified_context()
response = urllib.request.urlopen(req,context=context)
Html = response.read().decode('utf-8')
pat = r'<div class="author clearfix">(.*?)<span class="stats-vote"><i class="number">'
re_joke = re.compile(pat,re.S)
divlist = re_joke.findall(Html)
dic = {}
# print(divlist)
# print(len(divlist))
for div in divlist:
#用户名
name = re.compile(r'<h2>(.*?)</h2>',re.S)
username = name.findall(div)
username = username[0]
# print(username)
#内容
cont = re.compile(r'<div class="content">\n<span>(.*?)</span>', re.S)
neirong = cont.findall(div)
neirong = neirong[0]
# print(neirong)
dic[username] = neirong
return dic
url = 'https://www.qiushibaike.com/text/page/1/'
info = Crawler(url)
for k,v in info.items():
print(k + '说:' + v)
运行结果: