动态网页 —— 逆向分析法 + 案例

import  requests

import json

import pymysql

import  time

def get_html(url,headers,time=10):  #get 请求通用函数,去掉了 user-agent 简化代码

     try:

         r = requests.get(url, headers=headers,timeout=time)  # 发送请求

         r.encoding = r.apparent_encoding  # 设置返回内容的字符集编码

         r.raise_for_status()  # 返回的状态码不等于 200 抛出异常

         return r.text  # 返回网页的文本内容

     except Exception as error:

         print(error)

out_list=[]

def parser(json_txt):

     txt = json.loads(json_txt)

     global row_count

     row_count=txt["doctorCount"] # 总行数

     for row in txt["doctors"]: # 医生信息列表

         staff_name=row.get("STAFF_NAME") # 医生姓名

         if staff_name is None:

             staff_name=""

         staff_type=row.get("STAFF_TYPE") # 职称

         if staff_type is None:

             staff_type=""

         remark=row.get("STAFF_REMARK") # 简介

         if remark is None:

             remark=""

         # 简单清洗,外汇跟单gendan5.com去除掉简介中的 html 标签

         remark=remark.replace("

","").replace("

","")

         # 去除空白字符

         remark=remark.strip()

         org_name=row.get("ORG_NAME") # 所属医院

         org_name=org_name if org_name is not None else ""

         org_grade_name=row.get("ORG_GRADE_NAME")# 医院等级

         org_grade_name = org_grade_name if org_grade_name is not None else ""

         good_at=row.get("GOOT_AT") # 擅长领域

         good_at= good_at if good_at is not  None else ""

         row_list=(

             staff_name,

             staff_type,

             remark,

             org_name,

             org_grade_name,

             good_at

         )

         out_list.append(row_list)

def save_mysql(sql, val, **dbinfo): # 通用数据存储 mysql 函数

     try:

         connect = pymysql.connect(**dbinfo)  # 创建数据库链接

         cursor = connect.cursor()  # 获取游标对象

         cursor.executemany(sql, val)  # 执行多条 SQL

         connect.commit()  # 事务提交

     except Exception as err:

         connect.rollback()  # 事务回滚

         print(err)

     finally:

         cursor.close()

         connect.close(

if __name__ == '__main__':

     head = {

     "User-Agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64)\

                    AppleWebKit/537.36 (KHTML, like Gecko) \

                    Chrome/89.0.4389.82 Safari/537.36"

     } # 设置用户代理,应对简单反爬虫

 

     # 为了得到总共数据条数,先爬一次得到 row_count 放入全局变量

     page_size=10 # 每页的数据行数

url='https://www.jkwin.com.cn/yst_web/doctor/getDoctorList?areaId=42&depId=&hasDuty=&pageNo=1&pageSize=10'

     json_txt=get_html(url,head) # 发送请求

     print(json_txt) # 查看是否有数据

     parser(json_txt) # 解析函数

     print(out_list) # 查看是否有数据

     page=row_count//page_size  # 总共页数 页面太多速度太慢,以 5 页列, 6 改为 page 即可爬所有页面

     for i in range(2,6):

url="https://www.jkwin.com.cn/yst_web/doctor/getDoctorList?areaId=42&depId=&hasDuty=&pageNo={0}&pageSize={1}".format(i,page_size)

         json_txt=get_html(url,head) # 发送请求

         parser(json_txt) # 解析函数

     # 解析完数据了,然后一次性批量保存到 MySQL 数据库

     parms = {                      # 数据库连接参数

               "host": "--",

               "user": "root",

               "password": "123456",

               "db": "---",

               "charset": "utf8",

             }

     sql = "INSERT into doctorinfo(staff_name,staff_type,remark,\

                 org_name,org_grade_name,good_at)\

                 VALUES(%s,%s,%s,%s,%s,%s)"  # 带占位符的 SQL

     save_mysql(sql, out_list, **parms)  # 调用函数,注意 ** 不能省略


请使用浏览器的分享功能分享到微信等