爬虫进阶,前后端分离有什么了不起,过程超详细二、分析后续请求三、使用postman测试猜想( 三 )


"commentCount":3,
"discountPrice":0,
"downebookFlag":"N",
"fileType":"",
...
},
...
],
"size":20,
"total":2871
},
"msg":"成功",
"success":true
}
我们来学习一下这个JSON格式:
最外面是一个大括号 , 里面包含了code,data,msg,success四块信息 。 这个格式是开发这个网页的程序员自己设计的 , 不同的网页可能不同 。 其中code,msg和sucess表示请求的状态码 , 请求返回的提示 , 请求是否成功 。 而真正的数据都在data中 。 data的冒号后面是一个大括号 , 表示一个数据对象 。 里面包含了当前页数(current) , 总页数(pages) , 书的信息(records)等 。 records表示很多本书 , 所以它用一个方括号表示 , 方括号里面又有很多大括号包起来的数据对象 , 每个大括号表示一本书 。{
"authors":"[美]史蒂芬·普拉达(StephenPrata)",//书名
"code":"UB7209840d845c9",//代码
"collectCount":416,//喜欢数
"commentCount":64,//评论数
"discountPrice":0,//折扣0 , 表示没有折扣
...
"forSaleCount":3,//在售数量
...
"logo":"https://cdn.ptpress.cn/pubcloud/bookImg/A20190961/20200701F892C57D.jpg",
"name":"C++PrimerPlus第6版中文版",//书名
...
"price":100.30,//价格
...
}
每本书的信息有很多个字段 , 这里省略掉了很多字段 , 给重要的信息添加了注释 。
六、完成程序
现在来完善上面的程序 , 从JSON中解析出我们要的数据 , 为了简化 , 我们只抓取:书名 , 作者 , 编号和价格 。
程序框架:
importrequests
importjson
importtime
classBook:
#--省略--
defget_page(page=1):
#--省略--
books=parse_book(res.text)
returnbooks
defparse_book(json_text):
#--省略--
all_books=[]
foriinrange(1,10):
print(f'======抓取第{i}页======')
books=get_page(i)
forbinbooks:
print(b)
all_books.extend(books)
print('抓完一页 , 休息5秒钟...')
time.sleep(5)
定义了Book类来表示一本书添加了parse_book函数负责解析数据 , 返回包含当前页的20本书的list最下面使用for循环抓取数据 , 并放到一个大的列表中 , range中添加要抓取的页数 。 通过前面的分析可以知道一共有几页 。 抓取完一页后 , 一定要sleep几秒 , 一是防止给网站带来太大压力 , 二是防止网站会封锁你的IP , 是为他好 , 也是为了自己好 。 把抓来的信息保存到文件中的代码 , 请自行完成 。下面来看看 , 被省略掉的部分:
Book类:
classBook:
def__init__(self,name,code,author,price):
self.name=name
self.code=code
self.author=author
self.price=price
def__str__(self):
returnf'书名:{self.name} , 作者:{self.author} , 价格:{self.price} , 编号:{self.code}'
下面是__str__函数是一个魔法函数 , 当我们使用print打印一个Book对象的时候 , Python会自动调用这个函数 。
parse_book函数:
importjson
defparse_book(json_text):
'''根据返回的JSON字符串 , 解析书的列表'''
books=[]
#把JSON字符串转成一个字典dict类
book_json=json.loads(json_text)
records=book_json['data']['records']
forrinrecords:
author=r['authors']
name=r['name']
code=r['code']
price=r['price']
book=Book(name,code,author,price)
books.append(book)
returnbooks
在最上面import了json模块 , 这是Python自带的 , 不用安装关键的代码就是使用json把抓来的JSON字符串转成字典 , 剩下的是对字典的操作 , 就很容易理解了 。抓取基于JavaScript的网页 , 复杂主要在于分析过程 , 一旦分析完成了 , 抓取的代码比HTML的页面还要更简单清爽 。
爬虫进阶,前后端分离有什么了不起,过程超详细二、分析后续请求三、使用postman测试猜想】如果觉得好 , 建议:点赞加转发!