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) # 调用函数,注意 ** 不能省略