動態網頁 —— 逆向分析法 + 案例

專注的阿熊發表於2021-05-12

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("<p>","").replace("</p>","")

         # 去除空白字元

         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='

     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="{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)  # 呼叫函式,注意 ** 不能省略


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2771987/,如需轉載,請註明出處,否則將追究法律責任。

相關文章