动态加载数据
ajax请求 | json数据 |
---|---|
动态加载,不会显示在网页源码中 | json是一种数据传输格式,本质上是对象 |
实现局部更新 | 对象就是本地用的,而json是作为数据传输用的 |
-
将Python对象编码成JSON字符串:
json.dumps(data)
-
解码 JSON 对象:
json.loads(jsonData)
-
将序列化的str保存到文件中
json.dump(obj, fp,ensure_ascii=False)
- obj: 表示是要序列化的对象。 - fp: 文件描述符,将序列化的str保存到文件中。json模块总是生成str对象,而不是字节对象;因 此,fp.write()必须支持str输入。 - ensure_ascii=Flase,禁止使用ascii编码,按utf-8编码
-
从文件中读取json格式字符串,转化为python对象
json.load(fp)
-
fp: 文件描述符,将fp(.read()支持包含JSON文档的文本文件或二进制文件)反序列化为Python对象。
药局总监
页面分析:
- 确定页面中企业相关数据是否为动态加载? 相关的企业信息是动态加载出来的 通过抓包工具实现全 搜索,定位动态加载数据对应的数据包!
post:http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList- 该请求返回的响应数据是一组json串,通过对json串的一个简单分析,没有找到企业详情页的url,但是找到个每一家企业的id
- 每一家企业详情页的url,域名都是一样的,只有请求参数id值不同 可以使用同一个域名结合着不同企业的id值拼接成一家完整企业详情页url
- 判断企业详情页中的数据是否为动态加载? 通过抓包工具检测,发现企业详情信息在详情页中为动态加载的数据
- 通过抓包工具实现全局搜索定位动态加载数据对应的数据包
post-url:http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById
6 请求参数:id=xxxxx 请求到的json串就是我们最终想要的企业详情信息数据
# -*- coding = utf-8 -*-
#@time :2020/5/17 18:22
#@file 药监总局.py
#@Software: PyCharm
import requests
from fake_useragent import UserAgent
import json
'''
通过分析‘发现这个网页是一个动态加载的网页,右键源代码里面没有东西,是个ajx的动态请求,从XHR中找到post请求url
'''
if __name__ == '__main__':
IDlist = [] # 所有企业ID
infolist = []
post_url = "http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList"
print("开始".center(10, "*"))
start_page = int(input("请输入起始页码:"))
end_page = int(input("请输入结束页码;"))
for page in range(start_page,end_page+1):
print("第%s页开始-"%page)
fromdata={
"on":"true",
"page":page,
"pageSize":"15",
"productName":"",
"conditionType":"1",
"applyname":"",
"applysn":"",
}
r =requests.post(url=post_url,headers={"User-Agent":UserAgent().chrome},data=fromdata)
#获取json数据
data_json = r.json()
#遍历,获取ID 值,将data——json响应的信息,在json在线解析中发现,是一个字典,想要的ID 在这个list里面
for data in data_json["list"]:
IDlist.append(data["ID"])
#获取详情页的post URL
homepage_post = "http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById"
#遍历列表,每循环一次封装一次
for id in IDlist:
data ={
"id":id,
}
r =requests.post(url=homepage_post,headers={"User-Agent":UserAgent().random},data=data)
info =r.json()
# print(info)
infolist.append(info)
#持久化存储
fp =open("infodata.json","w",encoding="utf8")
json.dump(infolist,fp=fp,ensure_ascii=False)
print("结束".center(10,"*"))
本文来自博客园,作者:ExpiredSaury,转载请注明原文链接:https://www.cnblogs.com/saury/p/16574432.html