flask返回中文頁面設置

# -*- coding: utf-8 -*-

import requests
import json
import time
import random
import pandas as pd
from flask import Flask, jsonify
from flask import abort,request
import pymysql
from sqlalchemy import create_engine 
from datetime import datetime, date

app = Flask(__name__)


@app.route('/getdata',methods=['GET'])
def get_data():
    df = save_to_dataframe()
    # force_ascii保證了返回的數據是中文的,不是unicode編碼的   
    return jsonify(df.to_json(orient='records',force_ascii=False))


#下載第一頁數據
def get_one_page(url):
    headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36'
    }
    response = requests.get(url,headers=headers)
    if response.status_code == 200:  #頁面正常響應
        return response.text # 返回頁面源代碼
    return None
 
#解析第一頁數據
def parse_one_page(html):
    data = json.loads(html)['cmts'] #評論以json形式存儲,故以json形式截取
    for item in data:
        yield{ #該方法返回一個字典
            'comment':item['content'],
            'date':item['time'].split(' ')[0],
            'rate':item['score'],
            'city':item['cityName'],
            'nickname':item['nickName']
        }


#保存數據到dataframe
def save_to_dataframe():
    items = []
    for i in range(1, 5):
        url = 'http://m.maoyan.com/mmdb/comments/movie/341516.json?_v_=yes&offset=' + str(i)
        html = get_one_page(url)
        print('正在保存第%d頁.'% i)        
        for item in parse_one_page(html):
            items.append(item)
    data = pd.DataFrame(items)
    data.drop_duplicates(inplace=True) 
    # 保存到數據庫中,設置charset=utf8mb4
    conn = create_engine('mysql+pymysql://root:mysql@127.0.0.1:3306/test?charset=utf8mb4')   
    data.to_sql('test_db', con=conn, if_exists='replace', index=False)
    #反扒
    time.sleep(float(random.randint(1,100)) /20) 
    return data

    
if __name__ =='__main__':
    app.run(host="127.0.0.1", port=8000, debug=True)

get_one_page(url)返回的數據格式為:

{"approve":0,"approved":false,"authInfo":"","avatarurl":"https://img.meituan.net/avatar/1b506b5147bc501e20523ad2801830ad9934.jpg",
"cityName":"招遠","content":"不錯,挺好看的","filmView":false,"id":1035077242,"isMajor":false,"juryLevel":0,
"majorType":0,"movieId":341516,"nick":"nIP482975932","nickName":"nIP482975932","oppose":0,"pro":false,
"reply":0,"score":5,"spoiler":0,"startTime":"2018-08-13 09:08:32","supportComment":true,"supportLike":true,
"sureViewed":0,"tagList":{"fixed":[{"id":1,"name":"好評"},{"id":4,"name":"購票"}]},
"time":"2018-08-13 09:08","userId":503247692,"userLevel":3,"videoDuration":0,"vipInfo":"","vipType":0},

postman返回成功界面:

數據庫成功插入數據界面:

注意點:

  1. to_json()不設置force_ascii=False時,postman返回頁面為unicode格式,不是中文頁面,但是數據庫可以正常插入。

    postman返回unicode界面:

    數據庫插入數據成功:
  2. 數據庫的charset=utf8時,插入數據不成功,數據庫為空。
  3. 數據庫的字符集也要設置為utf8mb4。

總結

  1. pandas.DataFrame.to_json(force_ascii=False)保證了返回的數據是中文的,不是unicode編碼的。
  2. 數據庫的字符集設置為utf8mb4,并且在設置create_engine參數的時候,也要設置字符集charset=utf8mb4,這樣就可保證數據庫的內容都是中文的。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。