动态加载数据

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对象。
    

药局总监

页面分析:

  1. 确定页面中企业相关数据是否为动态加载? 相关的企业信息是动态加载出来的 通过抓包工具实现全 搜索,定位动态加载数据对应的数据包!
    post:http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList
  2. 该请求返回的响应数据是一组json串,通过对json串的一个简单分析,没有找到企业详情页的url,但是找到个每一家企业的id
  3. 每一家企业详情页的url,域名都是一样的,只有请求参数id值不同 可以使用同一个域名结合着不同企业的id值拼接成一家完整企业详情页url
  4. 判断企业详情页中的数据是否为动态加载? 通过抓包工具检测,发现企业详情信息在详情页中为动态加载的数据
  5. 通过抓包工具实现全局搜索定位动态加载数据对应的数据包
    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,"*"))




posted @ 2022-08-11 00:12  ExpiredSaury  阅读(28)  评论(0编辑  收藏  举报