自己的web服务器与自定义的web框架

Python111

自定义的web服务器

点击查看代码

import socket
import threading
import sys
import time
import Myframework

class MyHttpWebServer(object):
    def __init__(self,port):
        # 创建http服务器的套接字
        server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        # 设置端口号复用,程序退出之后不需要等待几分钟,直接释放端口
        server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
        server_socket.bind(('',port))
        server_socket.listen(128)
        self.server_socket = server_socket

    # 处理浏览器请求的函数
    @staticmethod
    def handle_browser_request(new_socket):
        # 接受客户端发送过来的数据
        recv_data = new_socket.recv(4096)
        # 如果没有收到数据,那么请求无效,关闭套接字,直接退出
        if len(recv_data) == 0:
            new_socket.close()
            return

        # 对接受的字节数据,转换成字符
        request_data = recv_data.decode('utf-8')
        print('浏览器请求的数据:',request_data)
        request_array = request_data.split(' ',maxsplit=2)
        # 得到请求的路径
        request_path = request_array[1]
        print('请求的路径是:',request_path)

        if request_path == '/': # 如果请求的路径为根目录,自动设置为/index.html
            request_path = '/index.html'

        if request_path.endswith('.html'):
            '''动态资源的请求'''
            # 动态资源的处理交给web框架来处理,需要把请求参数传给web框架,可能会有多个参数,所有采用字典结构
            params = {
                'request_path':request_path
            }
            response = Myframework.handle_request(params)
            new_socket.send(response)
            new_socket.close()

        else:
            '''静态资源的请求'''
            # 其实就是:根据请求路径读取/static目录中静态的文件数据,响应给客户端
            response_first = None  # 响应头的第一行
            response_header = None  # 响应头
            response_body = None # 响应主体

            try:
                # 读取static文件中对应的文件数据,rb模式:是一种兼容模式,可以打开图片,也可以打开js
                with open('static'+request_path,'rb') as f:
                    response_body = f.read()
                response_first = 'HTTP/1.1 200 OK\r\n'
                response_header = 'Server: myserver\r\n'

            except Exception as e: # 浏览器想读取的文件可能不存在
                with open('static/404.html','rb') as f:
                    response_body = f.read()  # 响应的主体页面内容(字节)
                # 响应头
                response_first = 'HTTP/1.1 404 Not Found\r\n'
                response_header = 'Server: myserver\r\n'

            finally: # 不管if和else有没有执行finally最后都会执行
                # 组成响应数据,发送给客户端(浏览器)
                response_data = (response_first + response_header + '\r\n').encode('utf-8') + response_body
                new_socket.send(response_data)
                new_socket.close()  # 关闭套接字

    # 启动服务器,并且接受客户端的请求
    def start(self):
        # 循环并且多线程来接受客户端请求
        while True:
            new_socket,ip_port = self.server_socket.accept()
            print('客户端的ip和端口',ip_port)
            # 一个客户端请求交给一个线程处理
            sub_thread = threading.Thread(target=self.handle_browser_request,args=(new_socket,))
            sub_thread.setDaemon(True)  # 设置当前线程为守护线程
            sub_thread.start()  # 子线程启动

def main():
    web_server = MyHttpWebServer(8080)
    web_server.start()

if __name__ == '__main__':
    main()

自定义的web框架

点击查看代码

import time
from functools import wraps
import pymysql

route_lst = []

# 定义路由装饰器
def route(request_path):  # 参数就是url请求
    def add_route(func):
        # 添加路由到路由表
        route_lst.append((request_path, func))
        @wraps(func)
        def invoke():
            # 调用我们指定的处理函数,并且返回结果
            return func()
        return invoke
    return add_route

# 我们自定义的web框架
def handle_request(params):
    request_path = params['request_path']  # 这里的路径是url上面输入的路径名
    for path, func in route_lst:
        if request_path == path:
            return func()
    else:  # 没有动态资源的数据 返回404
        return page_not_found()
    # 如果是index页面 就返回index页面的数据
    # if request_path == '/index.html':
    #     return index()
    # # 如果是userinfo页面就返回userinfo页面的数据
    # elif request_path == '/userinfo.html':  # request_path是url上面输入的路径名
    #     return user_info()
    # # 如果请求的动态资源没有,就返回404
    # else:
    #     return page_not_found()

# 动态资源页面
@route('/index.html')
def index():
    conn = pymysql.connect(host='localhost', port=3306, user='root', password='root', database='test', charset='utf8')
    cursor = conn.cursor()
    sql = 'select * from t_movies'
    cursor.execute(sql)
    result = cursor.fetchall()
    datas = ''
    for row in result:
        datas += '''<tr>
                <td>%s</td>
                <td>%s</td>
                <td>%s</td>
                <td>%s</td>
                <td>%s &#x4EBF;&#x4EBA;&#x540D;&#x5E01;</td>
                <td>%s</td>
                <td>%s</td>
                <td>%s</td>
                <td><input type="button" value="&#x5220;&#x9664;"></td>
                </tr>
                ''' % row

    # date = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
    # response_body = data   # &#x54CD;&#x5E94;&#x7684;&#x4E3B;&#x4F53;&#x5185;&#x5BB9;
    with open('template/index.html', 'r', encoding='utf-8') as f:
        response_body = f.read()
    response_body = response_body.replace('{%dates%}', datas)
    # &#x54CD;&#x5E94;&#x5934;
    response_first = 'HTTP/1.1 200 OK\r\n'
    response_header = 'Server: myserver\r\n'

    response_data = (response_first + response_header + '\r\n' + response_body).encode('utf-8')
    return response_data

# &#x4E13;&#x95E8;&#x5904;&#x7406;user_info.html&#x7684;&#x52A8;&#x6001;&#x8BF7;&#x6C42;&#x7684;&#x51FD;&#x6570;
@route('/userinfo.html')
def user_info():
    date = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
    # response_body = data   # &#x54CD;&#x5E94;&#x7684;&#x4E3B;&#x4F53;&#x5185;&#x5BB9;
    with open('template/user_info.html', 'r', encoding='utf-8') as f:  # &#x8FD9;&#x91CC;&#x7684;user_info.html&#x6307;&#x7684;&#x662F;&#x6587;&#x4EF6;&#x540D;
        response_body = f.read()
    response_body = response_body.replace('{%dates%}', date)
    # &#x54CD;&#x5E94;&#x5934;
    response_first = 'HTTP/1.1 200 OK\r\n'
    response_header = 'Server: myserver\r\n'

    response_data = (response_first + response_header + '\r\n' + response_body).encode('utf-8')
    return response_data

def page_not_found():
    with open('static/404.html', 'rb') as f:
        response_body = f.read()  # &#x54CD;&#x5E94;&#x7684;&#x4E3B;&#x4F53;&#x9875;&#x9762;&#x5185;&#x5BB9;(&#x5B57;&#x8282;)
    # &#x54CD;&#x5E94;&#x5934;
    response_first = 'HTTP/1.1 404 Not Found\r\n'
    response_header = 'Server: myserver\r\n'

    response_data = (response_first + response_header + '\r\n').encode('utf-8') + response_body
    return response_data

Original: https://www.cnblogs.com/libonizhenshuai/p/15551839.html
Author: libonizhenshuai
Title: 自己的web服务器与自定义的web框架



相关阅读

Title: 女朋友股票亏惨了,我一怒之下用Python爬取了证券最新数据...

兄弟们,最近女朋友迷上了这玩意,结果化身败家子,她家里给她准备的嫁妆都给贴进去了,这我能忍?

自己的web服务器与自定义的web框架

我国股票投资者数量为15975.24万户,如此多的股民热衷于炒股,首先抛开炒股技术不说,那么多股票数据也非常难找,密密麻麻的数据会让你看着头都大了。

; 一、准备前奏

1、开发环境 & 第三方模块

解释器版本:      python  3.8
代码编辑器:      pycharm 2021.2
requests
csv

不会安装软件看这篇:Python入门到精通最全最详细合集
不会安装模块看这篇:如何安装python模块, python模块安装失败的原因以及解决办法

2、抓取目标

目标地址

https://xueqiu.com/hq

二、爬虫部分

1、爬虫步骤

1.确定url地址(链接地址)
2.发送网络请求
3.数据解析(筛选数据)
4.数据的保存(数据库(mysql\mongodb\redis), 本地文件)

2、爬虫代码

import requests     # 发送网络请求
import csv

file = open('data2.csv', mode='a', encoding='utf-8', newline='')
csv_write = csv.DictWriter(file, fieldnames=['股票代码','股票名称','当前价','涨跌额','涨跌幅','年初至今','成交量','成交额','换手率','市盈率(TTM)','股息率','市值'])
csv_write.writeheader()
# 1.确定url地址(链接地址)
for page in range(1, 56):
    url = f'https://xueqiu.com/service/v5/stock/screener/quote/list?page={page}&size=30&order=desc&order_by=amount&exchange=CN&market=CN&type=sha&_=1637908787379'
    # 2.发送网络请求
    # 伪装
    headers = {
        # 浏览器伪装
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36'
    }
    response = requests.get(url, headers=headers)
    json_data = response.json()
    # print(json_data)
    # 3.数据解析(筛选数据)
    data_list = json_data['data']['list']
    for data in data_list:
        data1 = data['symbol']
        data2 = data['name']
        data3 = data['current']
        data4 = data['chg']
        data5 = data['percent']
        data6 = data['current_year_percent']
        data7 = data['volume']
        data8 = data['amount']
        data9 = data['turnover_rate']
        data10 = data['pe_ttm']
        data11 = data['dividend_yield']
        data12 = data['market_capital']
        print(data1, data2, data3, data4, data5, data6, data7, data8, data9, data10, data11, data12)
        data_dict = {
            '股票代码': data1,
            '股票名称': data2,
            '当前价': data3,
            '涨跌额': data4,
            '涨跌幅': data5,
            '年初至今': data6,
            '成交量': data7,
            '成交额': data8,
            '换手率': data9,
            '市盈率(TTM)': data10,
            '股息率': data11,
            '市值': data12,
        }
        csv_write.writerow(data_dict)
file.close()
#我还给大家准备了这些资料,直接在群里就可以免费领取了。
#一群:872937351 (群满了的话加二群)
#二群:924040232
#python学习路线汇总
#精品Python学习书籍100本
#Python入门视频合集
#Python实战案例
#Python面试题
#Python相关软件工具/pycharm永久激活

3、效果

数据有点多,展示部分,这是数据已经保存到Excel了。
自己的web服务器与自定义的web框架

; 三、数据分析部分

1、代码

import pandas as pd     # 做表格处理

data_df = pd.read_csv('data2.csv')
print(data_df)

2、效果展示

自己的web服务器与自定义的web框架
可以看到现在高居不下的依然是白酒、高科技、药业这几类,但是股票有风险,投资需谨慎,大家不是家里有矿,不建议买。

Original: https://www.cnblogs.com/hahaa/p/15728767.html
Author: 轻松学Python
Title: 女朋友股票亏惨了,我一怒之下用Python爬取了证券最新数据...