Flask框架小程序后端分离开发学习笔记《4》向服务器端发送模拟请求-爬虫

这篇具有很好参考价值的文章主要介绍了Flask框架小程序后端分离开发学习笔记《4》向服务器端发送模拟请求-爬虫。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Flask框架小程序后端分离开发学习笔记《4》向服务器端发送模拟请求-爬虫

Flask是使用python的后端,由于小程序需要后端开发,遂学习一下后端开发。
下面代码,是一个比较老的版本了,可以借鉴一下。

import socket
import ssl


def parsed_url(url):
    #检查协议
    protocol = 'http'
    if url[:7] == 'http://':
        u = url.split('://')[1]
    elif url[:8] == 'https://':
        protocol = 'https'
        u = url.split('://')[1]
    else:
        #':/l '定位然后取第一个/的位置来切片
        u = url
    # 经过这样,url中的协议被切掉了,注意切片后数组下标由0开始
    # 例如 https://www.baidu.com:2024/apple
    # 切除后 www.baidu.com:2024/apple


    # 检查默认path
    i = u.find('/')
    if i == -1:
        host = u
        path ='/'
    else:
        host = u[:i]
        path = u[i:]
    # 这一步处理过后
    # host = www.baidu.com:2024
    # path = apple


    # 检查端口
    # 默认端口
    port_dict = {
        'http': 80,
        'https': 443,
    }
    # 非默认端口
    port = port_dict[protocol]
    if ':' in host:
        h = host.split(':')
        # print(h)  测试用,当控制台说哪有问题,阔以尝试使用打印大法,看看是啥问题
        host = h[0]
        port = int(h[1])
    return protocol, host, port, path


#以下test开头的函数是单元测试
def test_parsed_url():
    #parsed_url函数很容易出错,所以我们写测试函数来运行看检测是否正确运m
    http = 'http'
    https = 'https'
    host = 'g.cn'
    path = '/'
    test_items = [
        ('http://g.cn', (http,host,80,path)),
        ('http://g.cn/', (http,host,80,path)),
        ('http://g.cn:90',(http, host,90,path)),
        ('http://g.cn:90/', (http,host, 90,path)),

        # 这里面的都是典型测试用例即可
        ('https://g.cn', (https,host,443,path)),
        ('https://g.cn:233/',(https,host,233,path)),
    ]

    for t in test_items:
        url, expected = t
        u = parsed_url(url)
        # assert是一个语句,名字叫断言
        # 如果断言成功,条件成立,则通过测试,否则为测试失败,中断程序报错
        e = "parsed_url ERROR,{}{}{}".format(url,u,expected)
        assert u == expected, e    # 如果u == expected为true,就没问题,继续;否则就会中断,然后打印e
        # print("test_parsed_url测试通过!")


def socket_by_protocol(protocol,host):
    # 根据协议返回一个socket实例
    s = socket.socket()
    if protocol == 'https':
        # 创建一个默认的SSL上下文环境
        context = ssl.create_default_context()
        # 使用SSL上下文环境来包装socket对象
        s = context.wrap_socket(s, server_hostname=host)
    return s

def response_by_socket(s):
    # 持续接收响应,返回响应的byte型
    # 参数是一个socket实例
    # 返回这个socket读取的所有数据
    response = b''
    buffer_size = 1024
    while True:
        r = s.recv(buffer_size)
        if len(r) == 0:
            break
        response += r
    return response

def parsed_response(r):
    # 把response解析出状态码headers body返回
    # 状态码是int
    # headers 是dict
    # body是str
    header, body = r.split('\r\n\r\n',1)     # \r\n\r\n是其分界线
    h = header.split('\r\n')   # 就会切分很多行  例如:HTTP/1.1 301 Moved Permanently
    status_code = h[0].split()[1]   # h[0]就是响应行 status_code=301  按照空格切分
    status_code = int(status_code)

    headers = {}
    for line in h[1:]:   # 把响应Header部分每一行都存成字典
        k, v = line.split(': ')
        headers[k] = v
    return status_code, headers, body


def get(url):
    # 用GET请求url并返回响应
    protocol,host,port,path= parsed_url(url)

    # 因为协议不一样,socket实例构建方式不同
    s = socket_by_protocol(protocol,host)
    s.connect((host,port))
    request = 'GET HTTP/1.1\r\nhost: {}\r\nconnectibn: close\r\n\r\n'.format(path,host)
    encoding = 'utf-8'
    s.send(request.encode(encoding))

    response = response_by_socket(s)
    r = response.decode(encoding)

    # 利用parsed_response处理接收到的响应,分别得到想要的东西
    status_code, headers, body = parsed_response(r)
    if status_code in [301, 302]:     # 301、302说明是需要重定向
        url = headers['Location']
        return get(url)

    return status_code, headers, body

def test_get():
    # 测试是否能正确处理HTTP和HTTPS
    urls = [
        'http://movie.douban.com/top250',
        'https://movie.douban.com/top250',
    ]
    # 这里就直接调用了get如果出错就会挂,测试得比较简单
    for u in urls:
        status_code, headers, body = get(u)
        print(status_code,headers,body)


def test():
    # 用于测试的主函数
    test_parsed_url()
    test_get()
    # test_parsed_response()

if __name__ == '__main__':
    test()
    # main()


# 代码注意模块化,写what不写how,不写具体怎么实现,具体怎么实现就封装起来

最后尝试请求豆瓣的网页,并未得到,我怀疑是有反爬手段,我们的请求数据还有很多东西没加进去,所以看起来不像是浏览器发送的请求,后续会继续学习,解决这个问题。

本笔记是学习B站某视频的教程,作为一个自己的学习记录,侵删。文章来源地址https://www.toymoban.com/news/detail-807925.html

到了这里,关于Flask框架小程序后端分离开发学习笔记《4》向服务器端发送模拟请求-爬虫的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python - flask后端开发笔记

    ​ Flask入门 有一篇很全面的博客可以参考:Python Flask Web 框架入门 跨域问题处理 文件发送 ​

    2024年02月07日
    浏览(53)
  • Python前后端分离之Django框架最基本后端CRUD开发

    目录   Django介绍: 开发准备 后端编写Django项目里的app模块 编写models.py文件(写模型):  编写序列化文件(serializers.py) 编写视图(Views) 新建urls.py文件,填写路径 ​编辑 进行迁移: 前端: 编写接口文件api.js 编写CRUD文件 编写index.vue文件 前端界面使用: 运行项目: 提

    2024年01月23日
    浏览(42)
  • flask 后端 + 微信小程序和网页两种前端:调用硬件(相机和录音)和上传至服务器

    选择 flask 作为后端,因为后续还需要深度学习模型,python 语言最适配;而 flask 框架轻、学习成本低,所以选 flask 作为后端框架。 微信小程序封装了调用手机硬件的 api,通过它来调用手机的摄像头、录音机,非常方便。 网页端使用 JavaScript 调用则困难一些,走了很多弯路,

    2024年04月15日
    浏览(26)
  • 深度学习模型部署——Flask框架轻量级部署+阿里云服务器

    ​因为参加一个比赛,需要把训练好的深度学习模型部署到web端,第一次做,在网上也搜索了很多教程,基本上没有适合自己的,只有一个b站up主讲的还不错 https://www.bilibili.com/video/BV1Qv41117SR/?spm_id_from=333.999.0.0vd_source=6ca6a313467efae52a28428a64104c10 https://www.bilibili.com/video/BV1Qv41117

    2024年02月07日
    浏览(61)
  • 聊天机器人开发实战--(微信小程序+SpringCloud+Pytorch+Flask)【后端部分】

    趁着五一有时间,先把大三下个学期的期末作业做了,把微信小程序和Java开发的一起做了。顺便把机器学习的也一起做了。所以的话,我们完整项目的技术体系主要有 微信小程序开发,Java Web开发(因为我喜欢把admin后台管理和用户端服务分开,所有我选择SpringCloud做一个切

    2024年02月03日
    浏览(41)
  • 【后端开发】尚硅谷 SpringCloud 学习笔记

    2.3.1 引入RestTemplate 2.3.2 远程调用支付模块 前面我们没有服务注册中心,也可以服务间调用,为什么还要服务注册? 当服务很多时,单靠代码手动管理是很麻烦的,需要一个公共组件,统一管理多服务,包括服务是否正常运行,等 Eureka用于** 服务注册 ,目前官网 已经停止更新** 创建项目

    2024年02月10日
    浏览(30)
  • 若依框架(前后端分离) 之IDEA中Maven后端打包

    Maven是一个跨平台的项目管理工具。作为Apache组织的一个颇为成功的开源项目,其主要服务于基于Java平台的项目创建,依赖管理和项目信息管理,是一个自动化构建工具。maven是Apache的顶级项目,解释为“专家,内行”,它是一个项目管理的工具,maven自身是纯java开发的(

    2024年02月09日
    浏览(41)
  • 【附源码】基于flask框架基于微信小程序的食疗坊软件开发 (python+mysql+论文)

    本系统(程序 + 源码)带文档 lw 万字以上   文末可获取本课题的源码和程序 选题背景: 随着科技的快速发展和智能手机的普及,微信小程序作为一种轻量级应用,已经渗透到人们日常生活的方方面面。它无需下载安装,即用即走的特点深受用户喜爱。在健康饮食领域,人们

    2024年04月08日
    浏览(61)
  • 前后端分离------后端创建笔记(02)

     本文章转载于【SpringBoot+Vue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论,如有侵权请联系 源码:https://gitee.com/green_vegetables/x-admin-project.git 素材:https://pan.baidu.com/s/1ZZ8c-kRPUxY6FWzsoOOjtA 提取码:up4c 项目概述笔记:https://blog

    2024年02月12日
    浏览(28)
  • flask+Python+Vue实现前后端分离的web项目并部署至云服务器

    1 后台+算法模型 1.1 训练机器学习模型 1.2 基于Flask框架搭建后台接口 注意:前后端跨域问题,可引入CORS解决,具体如代码: 2 前端搭建 3 云服务器部署 详细设置教程可参考linux CentOS 宝塔面板安装设置教程 安装Nginx和python项目管理器,后续可在面板上操作,完成项目打包上传

    2024年02月07日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包