Python爬虫技术系列-03/4flask结合requests测试静态页面和动态页面抓取

python构建web服务

flask内容参考:Flask框架入门教程(非常详细)

flask安装与运行测试

安装flask

pip install flask

创建一个webapp.py文件,内容如下

from flask import Flask# 用当前脚本名称实例化Flask对象,方便flask从该脚本文件中获取需要的内容
app = Flask(__name__)#程序实例需要知道每个url请求所对应的运行代码是谁。
#所以程序中必须要创建一个url请求地址到python运行函数的一个映射。
#处理url和视图函数之间的关系的程序就是"路由",在Flask中,路由是通过@app.route装饰器(以@开头)来表示的
@app.route("/")
#url映射的函数,要传参则在上述route(路由)中添加参数申明
def index():return "Hello World!"# 直属的第一个作为视图函数被绑定,第二个就是普通函数
# 路由与视图函数需要一一对应
# def not():
#     return "Not Hello World!"# 启动一个本地开发服务器,激活该网页
app.run()

运行代码

 python webapp.py

终端输出如下:

& D:/ProgramData/Anaconda3/envs/py10/python.exe d:/zjdemo/webapp.py* Serving Flask app 'webapp'* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.* Running on http://127.0.0.1:5000
Press CTRL+C to quit
127.0.0.1 - - [20/Nov/2023 08:20:47] "GET / HTTP/1.1" 200 -     
127.0.0.1 - - [20/Nov/2023 08:20:47] "GET /favicon.ico HTTP/1.1" 404 -

在浏览器输入

http://127.0.0.1:5000

返回如下
在这里插入图片描述

flask返回复杂的html字符串

创建webapp_html_str.py文件,代码如下:

from flask import Flask# 用当前脚本名称实例化Flask对象,方便flask从该脚本文件中获取需要的内容
app = Flask(__name__)html_str="""
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><table id="g570b4" border="1"><tr id="g419fe"><th id="g16b02">th标头</th><th id="gaae0b">th标头</th><th id="gd78bc" class=" u5899e">地址</th></tr><tr id="g5af9b"><td id="g920bb">td表格单元</td><td id="g9de93" class=" uab6e6">td表格单元</td><td id="gea8dc">上海浦东虹桥某某小区某某地点</td></tr><tr id="cf47d6" class=" u0cbcd "><td id="c913e3" class=" ud690a ">td表格单元</td><td id="c452e0" class=" uab6e6 ">td表格单元</td><td id="c917b3" class=" u7eb06 ">td表格单元</td></tr><tr id="cba81f" class=" u0cbcd "><td id="c3dae7" class=" ud690a ">td表格单元</td><td id="c7d0f9" class=" uab6e6 ">td表格单元</td><td id="c9fe10" class=" u7eb06 ">td表格单元</td></tr></table><style>.u5899e {width: 162px;}</style>
</body></html>"""#程序实例需要知道每个url请求所对应的运行代码是谁。
#所以程序中必须要创建一个url请求地址到python运行函数的一个映射。
#处理url和视图函数之间的关系的程序就是"路由",在Flask中,路由是通过@app.route装饰器(以@开头)来表示的
@app.route("/")
#url映射的函数,要传参则在上述route(路由)中添加参数申明
def index():return html_str# 直属的第一个作为视图函数被绑定,第二个就是普通函数
# 路由与视图函数需要一一对应
# def not():
#     return "Not Hello World!"# 启动一个本地开发服务器,激活该网页
app.run()

运行
运行代码

 python webapp.py

在浏览器输入

http://127.0.0.1:5000

返回如下
在这里插入图片描述

flask返回html页面

返回一个静态html页面

在工程目录下,创建一个templates目录,在templates目录创建a.html文件,代码如下:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><table id="g570b4" border="1"><tr id="g419fe"><th id="g16b02">th标头</th><th id="gaae0b">th标头</th><th id="gd78bc" class=" u5899e">地址</th></tr><tr id="g5af9b"><td id="g920bb">td表格单元</td><td id="g9de93" class=" uab6e6">td表格单元</td><td id="gea8dc">上海浦东虹桥某某小区某某地点</td></tr><tr id="cf47d6" class=" u0cbcd "><td id="c913e3" class=" ud690a ">td表格单元</td><td id="c452e0" class=" uab6e6 ">td表格单元</td><td id="c917b3" class=" u7eb06 ">td表格单元</td></tr><tr id="cba81f" class=" u0cbcd "><td id="c3dae7" class=" ud690a ">td表格单元</td><td id="c7d0f9" class=" uab6e6 ">td表格单元</td><td id="c9fe10" class=" u7eb06 ">td表格单元</td></tr></table><style>.u5899e {width: 162px;}</style>
</body></html>

此时项目结构如下:
在这里插入图片描述

创建webapp_html.py文件,代码如下:

from flask import Flask, render_templateapp = Flask(__name__)# “show”与函数index对应
# 运行index函数返回templates目录下的index.html页面
@app.route("/show")
def index():return render_template("a.html")if __name__ == '__main__':app.run()

运行代码

python webapp_html.py

输出如下:

(py10) PS D:\zjdemo> & D:/ProgramData/Anaconda3/envs/py10/python.exe d:/zjdemo/webapp_html.py* Serving Flask app 'webapp_html'* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.* Running on http://127.0.0.1:5000
Press CTRL+C to quit
127.0.0.1 - - [20/Nov/2023 08:38:23] "GET / HTTP/1.1" 404 -
127.0.0.1 - - [20/Nov/2023 08:38:28] "GET /show HTTP/1.1" 200 -

浏览器输入:

http://127.0.0.1:5000/show

返回如下:
在这里插入图片描述

返回一个动态html页面

在templates目录下创建一个jsdemo.html,代码如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>fieldset,#d1 {padding: 10px;width: 300px;margin: 0 auto;}</style></head>
<body><form id="form1" name="form1" method="post" action=""><fieldset><legend>按时</legend>输入表格的行数:<input type="text" id="row" value="3" placeholder="请输入表格的行数" required autofocus><br>输入表格的列数:<input type="text" id="col" value="5" placeholder="请输入表格的列数" required autofocus><br><input type="button" id="ok" value="产生表格" onclick="createTable()"/></fieldset></form><div id="d1"></div><script type="text/javascript">function createTable(){n=1;var str="<table width='100%' border='1' cellspacing='0' cellpadding='0'><tbody>";var r1=document.getElementById("row").value;var c1=document.getElementById("col").value;for(i=0;i<r1;i++){str=str+"<tr align='center'>";for(j=0;j<c1;j++){str=str+"<td>"+(n++)+"</td>";}str=str+"</tr>";}var d1=document.getElementById("d1");d1.innerHTML=str+"</tbody></table>";}createTable()</script>
</body>
</html>

在webapp_html.py中添加如下代码

@app.route("/jsdemo")
def jsdemo():return render_template("jsdemo.html")
重新启动web服务,运行代码```python
python webapp_html.py

输出如下:

(py10) PS D:\zjdemo> & D:/ProgramData/Anaconda3/envs/py10/python.exe d:/zjdemo/webapp_html.py* Serving Flask app 'webapp_html'* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.* Running on http://127.0.0.1:5000
Press CTRL+C to quit

在浏览器中输入

http://127.0.0.1:5000/jsdemo

返回为:
在这里插入图片描述
在浏览器中输入

http://127.0.0.1:5000/show

返回为:
在这里插入图片描述

通过requests获取静态和动态html页面

创建requestsdemo.py
内容如下:

import requestsurl_one = "http://127.0.0.1:5000/show"
url_two = "http://127.0.0.1:5000/jsdemo"res_one = requests.get(url_one)
print(res_one.content.decode('utf-8'))
print("--------------------------")
res_two = requests.get(url_two)
print(res_two.content.decode('utf-8'))

运行代码,

python .\requestsdemo.py

输出如下

(py10) PS D:\zjdemo> python .\requestsdemo.py
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><table id="g570b4" border="1"><tr id="g419fe"><th id="g16b02">th标头</th><th id="gaae0b">th标头</th><th id="gd78bc" class=" u5899e">地址</th></tr><tr id="g5af9b"><td id="g920bb">td表格单元</td><td id="g9de93" class=" uab6e6">td表格单元</td><td id="gea8dc">上海浦东虹桥某某小区某某地点        </td></tr><tr id="cf47d6" class=" u0cbcd "><td id="c913e3" class=" ud690a ">td表格单元</td><td id="c452e0" class=" uab6e6 ">td表格单元</td><td id="c917b3" class=" u7eb06 ">td表格单元</td></tr><tr id="cba81f" class=" u0cbcd "><td id="c3dae7" class=" ud690a ">td表格单元</td><td id="c7d0f9" class=" uab6e6 ">td表格单元</td><td id="c9fe10" class=" u7eb06 ">td表格单元</td></tr></table><style>.u5899e {width: 162px;}</style>
</body></html>
--------------------------
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>fieldset,#d1 {padding: 10px;width: 300px;margin: 0 auto;}</style></head>
<body><form id="form1" name="form1" method="post" action="">        <fieldset><legend>按时</legend>输入表格的行数:<input type="text" id="row" value="3" placeholder="请输入表格的行数" required autofocus><br>输入表格的列数:<input type="text" id="col" value="5" placeholder="请输入表格的列数" required autofocus><br><input type="button" id="ok" value="产生表格" onclick="createTable()"/></fieldset></form><div id="d1"></div><script type="text/javascript">function createTable(){n=1;var str="<table width='100%' border='1' cellspacing='0' cellpadding='0'><tbody>";var r1=document.getElementById("row").value;var c1=document.getElementById("col").value;for(i=0;i<r1;i++){str=str+"<tr align='center'>";for(j=0;j<c1;j++){str=str+"<td>"+(n++)+"</td>";}str=str+"</tr>";}var d1=document.getElementById("d1");d1.innerHTML=str+"</tbody></table>";}createTable()</script>
</body>
</html>

可以看见,静态页面的源代码和浏览器渲染后的效果相匹配,但动态页面捕获到的源代码和浏览器渲染后的效果差别较大,无法通过xpath等方法获取数据。

此时工程的完整目录如下:
在这里插入图片描述

备注:html渲染的过程
说说页面渲染的过程
浏览器渲染流程(精讲)

总结

本文主要描述了flask安装与返回静态页面和动态页面的过程,并通过requests库分布爬取静态/动态页面,通过比较可以更清晰的了解页面动态渲染的意义,以及引出selenium库的作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/152681.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenHarmony Axios组件使用过程中,Api9不适配问题

大家好&#xff0c;我是【八戒&#xff0c;你又涨价了哎】 以下是我个人在学习OpenHarmony过程中的分享&#xff0c;请大家多多指教 目录 问题描述 解决方法 问题描述 使用axios组件的时候&#xff0c;把应用部署到开发板&#xff0c;提示Api9不适配 解决方法 对这类版本不…

基于Docker的安装和配置Canal

基本介绍 Canal介绍&#xff1a;Canal 是用 Java 开发的基于数据库增量日志解析&#xff0c;提供增量数据订阅&消费的中间件&#xff08;数据库同步需要阿里的 Otter 中间件&#xff0c;基于 Canal&#xff09;。 Canal背景&#xff1a;阿里巴巴 B2B 公司&#xff0c;因为…

AI绘画使用Stable Diffusion(SDXL)绘制三星堆风格的图片

一、前言 三星堆文化是一种古老的中国文化&#xff0c;它以其精湛的青铜铸造技术闻名&#xff0c;出土文物中最著名的包括青铜面具、青铜人像、金杖、玉器等。这些文物具有独特的艺术风格&#xff0c;显示了高度的工艺水平和复杂的社会结构。 青铜面具的巨大眼睛和突出的颧骨&a…

【Web】Ctfshow Nodejs刷题记录

目录 ①web334 ②web335 ③web336 ④web337 ⑤web338 ⑥web339 ⑦web340 ⑧web341 ⑨web342-343 ⑩web344 ①web334 进来是一个登录界面 下载附件&#xff0c;简单代码审计 表单传ctfshow 123456即可 ②web335 进来提示 get上传eval参数执行nodejs代码 payload: …

【力扣面试经典150题】(链表)K 个一组翻转链表

题目描述 力扣原文链接 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只…

技术分享 | 如何写好测试用例?

对于软件测试工程师来说&#xff0c;设计测试用例和提交缺陷报告是最基本的职业技能。是非常重要的部分。一个好的测试用例能够指示测试人员如何对软件进行测试。在这篇文章中&#xff0c;我们将介绍测试用例设计常用的几种方法&#xff0c;以及如何编写高效的测试用例。 ## 一…

vue和uni-app的递归组件排坑

有这样一个数组数据&#xff0c;实际可能有很多级。 tree: [{id: 1,name: 1,children: [{ id: 2, name: 1-1, children: [{id: 7, name: 1-1-1,children: []}]},{ id: 3, name: 1-2 }]},{id: 4,name: 2,children: [{ id: 5, name: 2-1 },{ id: 6, name: 2-2 }]} ]要渲染为下面…

春秋云境靶场CVE-2022-30887漏洞复现(任意文件上传漏洞)

文章目录 前言一、CVE-2022-30887描述和介绍二、CVE-2021-41402漏洞复现1、信息收集2、找可能可以进行任意php代码执行的地方3、漏洞利用找flag 总结 前言 此文章只用于学习和反思巩固渗透测试知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的平台&#xff0c;不能随…

C语言中的指针(上)

目录 一、基本概念 1.变量的存储空间 2.定义指针 3.引用与解引用 二、指针的算术运算、类型以及通用指针 1.指针的算数运算 2.指针类型以及通用型指针 三、指向指针的指针&#xff08;pointers to pointers&#xff09; 四、函数传值以及传引用 1.局部变量 2.从存储地…

gitlab环境准备

1.准备环境 gitlab只支持linux系统&#xff0c;本人在虚拟机下使用Ubuntu作为操作系统&#xff0c;gitlab镜像要使用和操作系统版本对应的版本&#xff0c;(ubuntu18.04,gitlab-ce_13.2.3-ce.0_amd64 .deb) book100ask:/$ lsb_release -a No LSB modules are available. Dist…

机器学习二元分类 二元交叉熵 二元分类例子

二元交叉熵损失函数 深度学习中的二元分类损失函数通常采用二元交叉熵&#xff08;Binary Cross-Entropy&#xff09;作为损失函数。 二元交叉熵损失函数的基本公式是&#xff1a; L(y, y_pred) -y * log(y_pred) - (1 - y) * log(1 - y_pred)其中&#xff0c;y是真实标签&…

中贝通信-603220 三季报分析(20231120)

中贝通信-603220 基本情况 公司名称&#xff1a;中贝通信集团股份有限公司 A股简称&#xff1a;中贝通信 成立日期&#xff1a;1999-12-29 上市日期&#xff1a;2018-11-15 所属行业&#xff1a;软件和信息技术服务业 周期性&#xff1a;1 主营业务&#xff1a;通信网络技术服务…

通信网络安全防护定级备案流程介绍(附流程图)

通信网络安全防护定级备案是拥有增值电信业务经营许可证并且有开展电信业务的企业要做的一件事情。刚接触这块的家人们在填报操作的时候可能对具体通信网络安全防护定级备案流程还不是很清楚&#xff0c;所以就给大家画张具体的流程图吧&#xff0c;可以更加直观的了解。 通信…

go语言学习-go环境安装

1、安装Go 1.1 下载安装 go官网 找对应电脑的版本进行安装即可。 点击安装包&#xff0c;直接下一步下一步即可&#xff0c;安装目录可以自行设置一下。 1.2 验证 windows通过cmd验证。 linux或者mac可以通过自带终端执行测试。 2、配置环境变量 2.1 windows 找到系统…

HarmonyOS开发(四):UIAbility组件

1、UIAbility概述 UIAbility 一种包含用户界面的应用组件用于与用户进行交互系统调度的单元为应用提供窗口在其中绘制界同 注&#xff1a;每一个UIAbility实例&#xff0c;都对应一个最近任务列表中的任务。 一个应用可以有一个UIAbility也可以有多个UIAbility。 如一般的…

深度学习YOLO安检管制物品识别与检测 - python opencv 计算机竞赛

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络4 Yolov55 模型训练6 实现效果7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习YOLO安检管制误判识别与检测 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&…

【论文阅读】SPARK:针对视觉跟踪的空间感知在线增量攻击

SPARK: Spatial-Aware Online Incremental Attack Against Visual Tracking introduction 在本文中&#xff0c;我们确定了视觉跟踪对抗性攻击的一个新任务&#xff1a;在线生成难以察觉的扰动&#xff0c;误导跟踪器沿着不正确的&#xff08;无目标攻击&#xff0c;UA&#x…

设计模式--模板方法外观模式

模板方法模式 场景&#xff1a;需使用代码方式实现&#xff0c;考完试后&#xff0c;将各个学生的试卷及答案誊抄一份。 假如有两个学生的试卷誊抄完毕. // 学生A public class TestPaperA {// 试题1public void testQuestion1() {System.out.println("问题一:XXXXXXXX…

《opencv实用探索·一》QT+opencv实现图片拼接和Mat转QImage

本文利用opencv实现了几个好用的功能&#xff0c;包含两个文件&#xff0c;如下&#xff1a; 源码放在文章末尾 imageProcessing类包含三个功能&#xff1a; 1、图像拼接 cv::Mat imageMosaic(cv::Mat mat1, cv::Mat mat2, MosaicMode mosaicMode);mat1和mat2为两个待拼接的…

Matplotlib实现Label及Title都在下方的最佳姿势

Matplotlib实现Label及Title都在下方的最佳姿势 1. 问题背景2. 基本思想&#xff08;可以不看&#xff09;3. 方法封装4. 调用实例5. 总结6. 起飞 1. 问题背景 用python绘制下面这种图的时候&#xff0c;一般用xlable作为子图的标题&#xff0c;这是因为plt.title()方法绘制的…