整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

用python5分钟搞定精美的PDF文档

用python5分钟搞定精美的PDF文档


Pandas非常善于处理大量数据并在多个文本和可视化表示中对其进行汇总。支持输出到CSV,Excel,HTML,json等。如果想将多个数据组合到一个文档中,那么会有点困难。例如,如果要在一个Excel工作表上放置两个DataFrame,则需要使用Excel库手动构建输出。

5分钟教您用python生成精美的PDF文档

本文将介绍如何将多条信息组合成一个HTML模板,然后使用和将其转换为精美的PDF文档。

下面看看生成的PDF效果吧:

5分钟教您用python生成精美的PDF文档效果

过程

使用Pandas将数据输出到Excel文件中的多个工作表或从pandas DataFrames创建多个Excel文件非常方便。但是,如果您想将多个信息组合到一个文件中,那么直接从Pandas完成它的方法并不多。幸运的是,python有很多工具可以办到。

在本文中,将使用通过以下流程来创建多页PDF 文档。

将使用通过以下流程来创建多页PDF 文档

这种方法的好处在于您可以将自己的工具替换为此工作流程。如果您想在HTML之外使用其他类型的标记,请选择Jinja。

工具

首先,使用HTML作为模板语言,因为它可能是生成结构化数据并允许相对丰富的格式化的最简单方法。每个人都知道(或可以弄清楚)足够的HTML来生成一个简单的报告。最困难的部分是弄清楚如何将HTML呈现为PDF。选择了WeasyPrint,相对而言是最佳解决方案,因为它仍在积极维护,可以相对容易地使用它。另外效果也很好。遗憾的是,此时文档有点缺乏,确实可以从HTML生成PDF。

数据

下面是导入数据并生成数据透视表以及CPU和软件销售的平均数量和价格的一些汇总统计数据。

导入模块,并读入销售渠道信息。

from __future__ import print_function
import pandas as pd
import numpy as np
df=pd.read_excel("sales-funnel.xlsx")
df.head()

透视数据进行总结。

sales_report=pd.pivot_table(df, index=["Manager", "Rep", "Product"], values=["Price", "Quantity"],
 aggfunc=[np.sum, np.mean], fill_value=0)
sales_report.head()

生成有关整个数据集的一些总体描述性统计信息。在这种情况下,我们希望显示CPU和软件销售的平均数量和价格。

print(df[df["Product"]=="CPU"]["Quantity"].mean())
print(df[df["Product"]=="CPU"]["Price"].mean())
print(df[df["Product"]=="Software"]["Quantity"].mean())
print(df[df["Product"]=="Software"]["Price"].mean())
1.88888888889
51666.6666667
1.0
10000.0

理想情况下,现在要做的是通过经理分组汇总数据,并在页面上包含一些摘要统计数据,以帮助理解单个结果与全国平均值的比较。

DataFrame选项

幸运的是,DataFrame有一个 to_clipboard() 将整个DataFrame复制到剪贴板的功能,然后您可以轻松地将其粘贴到Excel中。

稍后将在模板中使用的另一个选项是 to_html() 生成包含一个应用了最小样式的完全组合的HTML表。

模板

Jinja模板功能非常强大,支持许多高级功能,例如沙盒执行和自动转义,这些都不是此应用程序所必需的。但是,随着您的报告变得越来越复杂或您选择将Jinja用于您的网络应用,这些功能将为您提供良好的服务。

Jinja的另一个不错的功能是它包含多个 ,这些允许我们以Pandas中难以做到的方式格式化我们的一些数据。

为了在应用程序中使用Jinja,需要做三件事:

· 创建一个模板

· 将变量添加到模板上下文中

· 将模板渲染为HTML

这是一个非常简单的模板,称之为myreport.html :

<!DOCTYPE html> 
< html > 
< head lang="en" > 
 < meta charset="UTF-8" > 
 < title > {{title}} </ title > 
</ head > 
< body > 
 < h2 >销售漏斗报告 - 国家</ h2 >
 {{national_pivot_table}}
</ body > 
</ html >

这段代码的两个关键部分是 {{ title }} 和 {{ national_pivot_table }} 。它们本质上是我们在呈现文档时将提供的变量的占位符。

要填充这些变量,需要创建一个Jinja环境并读取模板:

from jinja2 import Environment, FileSystemLoader
env=Environment(loader=FileSystemLoader('.'))
template=env.get_template("myreport.html")

在上面的示例中,假设模板位于当前目录中。

另一个关键组件是创建 env 。这个变量是我们将内容传递给模板的方式。我们创建一个名为的字典template_var ,其中包含我们想要传递给模板的所有变量。

请注意变量的名称如何与模板匹配。

template_vars={"title" : "Sales Funnel Report - National",
 "national_pivot_table": sales_report.to_html()}

最后一步是使用输出中包含的变量呈现HTML。这将创建一个我们最终将传递给PDF创建引擎的字符串。

html_out=template.render(template_vars)

为简洁起见,我不会显示完整的HTML,但您应该明白这一点。

生成PDF

该PDF创建部分比较简单为好。我们需要进行一些导入并将字符串传递给PDF 生成器。

from weasyprint import HTML
HTML(string=html_out).write_pdf("report.pdf")

此命令创建一个类似于以下内容的PDF报告:

啊。很酷,它是一个PDF,但它很难看。主要问题是没有加入任何css样式。

对于本文的其余部分,将使用blue print的作为的style.css的基础,如下所示。这个CSS的是:

· 它相对较小且易于理解

· 它可以在PDF引擎中运行而不会抛出错误和警告

· 它包括看起来相当不错的基本表格式

让我们尝试使用我们更新的样式表重新渲染它:

HTML(string=html_out).write_pdf(args.outfile.name, stylesheets=["style.css"])

只需添加一个简单的样式表就会产生巨大的差异!

更复杂的模板

为了生成更有用的报告,将结合上面显示的摘要统计信息以及分析报告,以便为每个经理包含一个自己单独的PDF页面。

让我们从更新的模板(myreport.html)开始:

<!DOCTYPE html> 
< html > 
< head lang="en" > 
 < meta charset="UTF-8" > 
 < title > {{title}} </ title > 
</ head > 
< body > 
< div class="容器" > 
 < h2 >销售漏斗报告 - 国家</ h2 >
 {{national_pivot_table}}
 {%include"summary.html"%}
</ div > 
< div class="container" >
 {%为经理在Manager_Detail%}
 < p style="page-break-before:always" > </ p > 
 < h2 >销售渠道报告 - {{manager.0}} </ h2 >
 {{manager.1}}
 {%include"summary.html"%}
 {%endfor%}
</ div > 
</ body > 
</ html >

你会注意到的第一件事是有一个 include 声明提到了另一个文件。这 include 允许引入一段HTML并在代码的不同部分中重复使用它。在这种情况下,摘要包含希望包含在每个报告中的一些简单的国家级统计数据,以便管理人员可以将其绩效与全国平均水平进行比较。

这是summary.html的样子:

< h3 >国家概要:CPU </ h3 > 
 < ul > 
 < li >平均数量:{{CPU.0 | round(1)}} </ li > 
 < li >平均价格:{{CPU.1 | round( 1)}} </ li > 
 </ ul > 
< h3 >国家摘要:软件</ h3 > 
 < ul > 
 < li >平均数量:{{Software.0 | round(1)}} </ li > 
 < li >平均价格:{{Software.1 | round(1)}} </ li > 
 </ ul >

在此代码段中,您将看到我们可以访问的其他变量: CPU 和 Software 。其中每个都是一个python列表,其中包括CPU和软件销售的平均数量和价格。

您可能还注意到我们使用管道 | 将 round 每个值用于1位小数。这是使用Jinja过滤器的一个具体示例。

还有一个for循环,允许我们在报告中显示每个经理的详细信息。Jinja的模板语言只包含一小部分改变控制流的代码。基本for循环几乎是任何模板的支柱,因此它们应该对大多数人有意义。

我想调出一段看起来有点不合适的最后一段代码:

< p style="page-break-before:always" > </ p >

这是一个简单的CSS指令,我把它放在每个页面上以确保CSS中断。

额外的统计数据

现在已经完成了模板,这里是如何创建模板中使用的其他上下文变量。

这是一个简单的汇总函数:

def get_summary_stats(df,product):
 """
 For certain products we want National Summary level information on the reports
 Return a list of the average quantity and price
 """
 results=[]
 results.append(df[df["Product"]==product]["Quantity"].mean())
 results.append(df[df["Product"]==product]["Price"].mean())
 return results

还需要创建经理详细信息:

manager_df=[]
for manager in sales_report.index.get_level_values(0).unique():
 manager_df.append([manager, sales_report.xs(manager, level=0).to_html()])

最后,使用以下变量调用模板:

template_vars={"title" : "National Sales Funnel Report",
 "CPU" : get_summary_stats(df, "CPU"),
 "Software": get_summary_stats(df, "Software"),
 "national_pivot_table": sales_report.to_html(),
 "Manager_Detail": manager_df}
# Render our file and create the PDF using our css style file
html_out=template.render(template_vars)
HTML(string=html_out).write_pdf("report.pdf",stylesheets=["style.css"])

让python改变生活!如果满意上面的生成PDF讲解,点赞和评论。

获取文中代码请微信关注 "python_dada"公众号,输入“精美PDF”获取。

文概要

Part one: 可视化库cutecharts基本使用介绍

Part two: 爬取中国电竞价值排行榜-外设排行榜,利用cutecharts数据可视化分析

Part three: 总结 抒情

Part one : 可视化库cutecharts基本使用介绍

1.cutecharts 安装

最简单的肯定是 pip? ?安装:

$ pip3 install cutecharts

当然,也可以进行源码安装:

$ git clone https://github.com/chenjiandongx/cutecharts.git
$ cd cutecharts
$ pip3 install -r requirements.txt
$ python3 setup.py install

如果是渲染成html文件,你还需要安装的第三方辅助库? ?jinja2? ?,是基于Python的模板引擎,主要用于渲染可视化后的内容,最终形成可运行的html文件,当然,如果你不感兴趣,你不用过多了解,在安装cutecharts时会自动帮你安装上,但你得知道它是unicode编码,稍不注意,可能模板生成错误。

解决方法其实很简单,我们把渲染页面里的js脚本单独拿出来,放到js文件内,然后再在html页面内加载静态的js文件即可,说白了,就是不要让jinja2直接去渲染‘有问题’的js内容。

如果你嫌这个麻烦,还有一位朋友使用静态加载方法解决了该问题。

<script type="text/javascript" src="{{url_for('static',filename='js/echarts-gl.min.js')}}"></script>

当然,没有遇到问题最好~我是直接用的jupyter notebook,所以没有这个问题。

关于jupyter notebook安装使用,你可以看我之前分享的文章:Windows/Mac 安装、使用 Python 环境 +jupyter notebook

2.基本使用

目前cutecharts支持的可视化图像类型有:柱状图、折线图、饼状图、雷达图、散点图。 我想后续作者还会增加的,比如:词云图、3D柱状图、条形图等等。 另外,项目里已经给我们提供了测试用例,所以我们学习的时候就不用再去自己写测试用例了,直接调用即可。

First : 柱状图

# 导入cutecharts中的Bar
from cutecharts.charts import Bar
# 导入测试用例
from cutecharts.faker import Faker


def bar_base() -> Bar:
    chart=Bar("Bar-基本示例")
    chart.set_options(labels=Faker.choose(), x_label="I'm xlabel", y_label="I'm ylabel")
    chart.add_series("series-A", Faker.values())
    return chart


bar_base().render_notebook()

渲染引擎提供了两个

.render(html_name) :生成一个本地文件,html_name为文件名(html文件),
默认名为:render.html
.render_notebook() :可以在jupyter中直接运行显示,如上文代码
本文案例代码都是在Jupyter Notebook上编写运行

显示情况:

当然,里面的颜色、文字内容我们都是可以更改的。 相关函数参数,作者在Github里写的特别清楚,很方便阅读使用

内容来自:github cutecharts

?

Second : 折线图

from cutecharts.charts import Line
from cutecharts.faker import Faker

def line_base() -> Line:
    chart=Line("Line-基本示例")
    chart.set_options(labels=Faker.choose(), x_label="I'm xlabel", y_label="I'm ylabel", legend_pos="upRight")
    chart.add_series("series-A", Faker.values())
    chart.add_series("series-B", Faker.values())
    return chart


line_base().render_notebook()

显示情况:

当然,里面的颜色、文字内容我们都是可以更改的。 相关函数参数,作者在Github里写的特别清楚,很方便阅读使用

内容来自:github cutecharts

Third : 饼图

from cutecharts.charts import Pie
from cutecharts.faker import Faker


def pie_base() -> Pie:
    chart=Pie("Pie-基本示例")
    chart.set_options(labels=Faker.choose())
    chart.add_series(Faker.values())
    return chart


pie_base().render_notebook()

显示情况:

当然,里面的颜色、文字内容我们都是可以更改的。 相关函数参数,作者在Github里写的特别清楚,很方便阅读使用

内容来自:github cutecharts

Fourth : 雷达图

from cutecharts.charts import Radar
from cutecharts.faker import Faker


def radar_base() -> Radar:
    chart=Radar("Radar-基本示例")
    chart.set_options(labels=Faker.choose())
    chart.add_series("series-A", Faker.values())
    chart.add_series("series-B", Faker.values())
    return chart


radar_base().render_notebook()

显示情况:

当然,里面的颜色、文字内容我们都是可以更改的。 相关函数参数,作者在Github里写的特别清楚,很方便阅读使用

内容来自:github cutecharts

Fifth : 散点图

from cutecharts.charts import Scatter
from cutecharts.faker import Faker


def scatter_base() -> Scatter:
    chart=Scatter("Scatter-基本示例")
    chart.set_options(x_label="I'm xlabel", y_label="I'm ylabel")
    chart.add_series(
        "series-A", [(z[0], z[1]) for z in zip(Faker.values(), Faker.values())]
    )
    chart.add_series(
        "series-B", [(z[0], z[1]) for z in zip(Faker.values(), Faker.values())]
    )
    return chart


scatter_base().render_notebook()

显示情况:

当然,里面的颜色、文字内容我们都是可以更改的。 相关函数参数,作者在Github里写的特别清楚,很方便阅读使用

内容来自:github cutecharts

这里由于篇幅关系,本文只对cutecharts基本图像展现做了介绍,对于以上五个类型的可视化图像的具体参数没有做展开介绍,感兴趣的可以去github查看更详细内容:

地址:? ?https://github.com/chenjiandongx/cutecharts? ?

Part two : 爬取中国电竞价值排行榜-外设排行榜,利用cutecharts数据可视化分析

【注】本文所有代码都是在Jupyter Notebook下运行,理论上移到本地开发工具也是可以运行的,如有问题,请留言评论。

截止到2021.11.24 该网站外设入口已经不在了,但是数据接口还有,所以理论上以下代码大家运行不会有任何问题,当然,大家还可以用来分析其他页面数据,比如中国富豪榜单等,这类榜单数据大多是table标签包裹,且为静态加载,所以直接使用pandas.read_html即可很快获取到数据。

1.爬取数据

"""
爬取中国电竞价值排行榜-外设排行榜
网站:http://djws.uuu9.com/rank/201907/
截止到 2021.11.24 这个数据接口还在哈~
数据类:键盘 鼠标 耳机 显示器 电竞椅 笔记本 显卡 路由器
数据项:排名 型号厂家 天猫指数 京东指数 百度指数 性价指数 科技指数 综合指数
"""

具体实现代码:

# 爬取数据
import pandas as pd
url="http://djws.uuu9.com/rank/201907/"
url_read=pd.read_html(url, header=0)[0]
url_read

比较简单,因为该网站数据存储在表格(table)里,我之前介绍过pandas的read_html函数,可以快速的读取网页中table里的数据。

观察上面获取到的数据,我们发现,奇数行的数据有问题,我看了下网页源码,确实页面的table写的有点问题,表头在重复出现,这个数据处理很简单,我们取出偶数行的正确数据即可。

url_read=url_read[url_read.index%2==0]

我们会发现,数据里的? ?综合指数? ?数值为? ?NaN? ?,这是因为这一栏数据在网站中是以图像条显示的,存储在i标签的width里,这里我们就不获取了,要获取也是有办法的,比如:正则表达式,如果你感兴趣,可以去试试。

电竞与外设-键盘前12名在3-7月的所有的数据。

# 爬取数据
import pandas as pd

def get_data(i):
    url="http://djws.uuu9.com/rank/20190%d/"%i
    url_read=pd.read_html(url, header=0)[0]
    url_read=url_read[url_read.index%2==0]
    return url_read

df_data=[]
# 循环抓取3-7月数据
for i in range(3,8):
    df_data.append(get_data(i))
# axis: 1 表示列拼接,0 表示行拼接
df=pd.concat(df_data, axis=0)

为了后续工作方便,我们最好是跑一次,然后把数据存到本地,方便读取处理。

df.to_csv(r'rich_list.csv', mode='a', encoding='utf_8_sig', header=0, index=False)

2.数据可视化分析

获取了电竞与外设-键盘前12名在3-7月的所有的数据,共60条数据,方便数据读取显示,以下代码是在Pycharm上编写,理论上移植到其他开发工具或平台也可运行,如有问题欢迎留言交流。 Core issues : 键盘品牌分析

读取数据

import os
import pandas as pd

# 数据统计函数
def get_list_num(l):
    name=list(set(l))  # 名字
    value=[]   # 次数
    for item in name:
        value.append(l.count(item))
    return name, value


# 获取当前文件父目录路径
father_path=os.getcwd()
# # 原始数据文件路径
rpath_csv=father_path+r'/rich_list.csv'
# 读取数据
csv_read=pd.read_csv(rpath_csv)

Question one: 对品牌分析

读取数据

manufacturer=list(csv_read["厂家"])
statistical=get_list_num(manufacturer)

可视化

# 导入cutecharts中的Bar
from cutecharts.charts import Bar


def bar_base() -> Bar:
    chart=Bar("3-7月键盘品牌")
    chart.set_options(labels=statistical[0], x_label="品牌名", y_label="出现次数")
    chart.add_series("品牌频数比较", statistical[1])
    return chart


bar_base().render()


从这里看,我们可以发现达尔优、雷蛇、CHERRY、赛睿、海盗船都在排行榜上出现了10次,华硕ROG、雷柏略差一些,只出现了五次。 我们再来结合各个品牌对应的产品排名来分析一下: 数据处理

# 获取每个品牌对应的排名总和
rank_list=[]
for i in statistical[0]:
    table=csv_read.loc[csv_read["厂家"]==i]
    rank_list.append(sum(table["排名"])/5)  # 排名计算总和都除五

可视化分析:

from cutecharts.charts import Line


def line_base() -> Line:
    chart=Line("3-7月键盘品牌")
    chart.set_options(labels=statistical[0], x_label="品牌名", y_label="总数")
    chart.add_series("品牌频数", statistical[1])
    chart.add_series("品牌排名", rank_list)
    return chart
line_base().render()


首先我们要知道,第一次统计的品牌名出现次数,表示品牌旗下产品上榜的数量,可能是有多种产品上榜,也可能是部分产品多次上榜,第二次统计的产品排名数和(为了方便展示,我把数除五了),表示该品牌所有上榜产品的排名和,如果做对比的话,应该是在第一个条件(品牌出现次数)相同情况下做对比。 从图中我们很容易看出,品牌CHERYCHE?Y这个品牌出现次数多,而且排名靠前(因为排名数和低),其次是海盗船,第三可以算赛睿,雷蛇,达尔优,我们还可以看出雷柏和华硕ROG好像差不多。

接下来我们再看看品牌热度,我们直接看综合指数综合指数,当然,如果你在做数据分析工作中,肯定不会这么选择,你应该选择和你目的最贴切的数据项进行分析,甚至进行一些进阶算法,给每个指数项一定权重然后分析。

index_list=[]
# 选取三个比较热门的产品
model=["MX8.0", "K70", "雷柏V500"]
for i in model:
    print(i)
    table=csv_read.loc[csv_read["型号"]==i]
    print(table)  # 显示查询数据


从网页上我们可以轻易看到,七月综合指数最高是的是? ?CHERRY? ??旗下的? ?MX8.0? ?,如果你感兴趣,可以像我什么一样,自己选3-5个热门产品,作出他们3-7月之间的综合指数或其他数据的变化图(一段时间内的变化,折线图会是一种比较好的显示方式)。

对于以上数据,你还有什么其他比较好的分析思路吗?欢迎你留言说说你的看法,由于时间和篇幅关系,我就不过多叙述了。

记住,本文主旨是给大家介绍? ?cutecharts? ?这个新的py可视化库。

cutecharts 项目源码,如果喜欢,请点个赞私信“111”。

Part three : 总结 抒情

哇,终于写完了,虽然本文技术含量不是那么高,但还是有很多地方是大家可以学习的,比如:认识个牛逼的人。 最后,我代替大家,其实也就是我自己想问的,问了大佬三个问题,这里分享给大家:

Q:1. 目前 cutecharts 只支持部分图形,后续还会开发出其他图形支持吗?比如词云图?

A:cutecharts 是基于 chart.xkcd 开发的,目前 100% 支持其所有图形和配置项,如果 chart.xkcd 图表类型更新的话,cutecharts 也会同步更新的。

Q:2. 你觉得 cutecharts 和 pyecharts 的关系是什么?

A:cutecharts 和 pyecharts 属于同一类项目,都是使用 ? ?Python、Notebook+JS? ? 实现数据的可视化,不过 pyecharts 目前有着更丰富的图形种类以及更多的配置项。

cutecharts 可以看做是精简版的 pyecharts,保留着 pyecharts 的所有核心功能,是学习 pyecharts 源码的很好的入手点。

Q:3. 你有没有什么想说的,对 cutecharts 和 pyecharts 的使用者?

A:开发一个类似的库并不难,无非是找到优秀的 JS 库,设计好 Python 接口,并将两者融合在一起。所以也希望有更多 Python 开发者能够参与到这方面的开发中来,为社区贡献出更多优秀的作品。

希望,我们都越来越优秀。

原文链接:https://blog.51cto.com/u_13334898/4674775

探讨Python网络爬虫中如何使用requests库和PyPlaywright库来获取网页内容时,我们需要详细解析这两个库的特点、应用场景、优势,并通过具体的示例代码来展示它们的使用方式。

一、Python网络爬虫基础

网络爬虫是一种自动化程序,用于浏览互联网并抓取信息。Python因其简洁的语法和丰富的库支持,在网络爬虫开发中占据重要地位。网络爬虫的基本流程包括发起请求、获取响应、解析内容、存储数据以及可能的重复请求。

二、requests库介绍与示例

2.1 requests库简介

requests是Python中一个非常流行的HTTP库,用于发送各种HTTP请求。它提供了简单易用的API,使得发送请求和获取响应变得非常简单。requests库自动处理了很多底层细节,如URL编码、重定向、cookies等,让开发者可以专注于业务逻辑的实现。

2.2 安装requests

pip install requests

2.3 示例:使用requests获取网页内容

import requests

def fetch_web_page(url):

"""

使用requests库获取网页内容

:param url: 目标网页的URL

:return: 网页的HTML内容

"""

try:

# 发送GET请求

response=requests.get(url)

# 检查请求是否成功

if response.status_code==200:

# 返回网页内容

return response.text

else:

# 如果请求失败,打印状态码并返回None

print(f"请求失败,状态码:{response.status_code}")

return None

except requests.RequestException as e:

# 处理请求过程中可能发生的异常

print(f"请求异常:{e}")

return None


# 示例URL

url='https://www.example.com'

# 调用函数并打印返回的网页内容

web_content=fetch_web_page(url)

if web_content:

print(web_content[:500] + '...') # 打印前500个字符作为示例

2.4 requests库的进阶使用

POST请求:通过requests.post()发送POST请求,可以携带表单数据或JSON数据。

请求头:通过headers参数设置请求头,如User-Agent、Accept等。

会话(Session):使用requests.Session()对象可以跨请求保持cookies和其他会话信息。

超时设置:通过timeout参数设置请求的超时时间,防止请求过长时间未响应。

三、PyPlaywright库介绍与示例

3.1 PyPlaywright简介

PyPlaywright是基于Playwright的Python库,用于自动化浏览器操作。Playwright是Microsoft开发的一个开源自动化测试和爬虫工具,它支持Chromium、Firefox和WebKit(Safari)等主流浏览器。PyPlaywright通过自动化浏览器来模拟用户的真实操作,非常适合需要处理JavaScript渲染、动态内容加载等复杂网页的爬虫任务。

3.2 安装Playwright

pip install playwright

playwright install

安装playwright库后,还需要通过playwright install命令来下载浏览器二进制文件。

3.3 示例:使用PyPlaywright获取动态加载的网页内容

from playwright.async_api import async_playwright


async def fetch_dynamic_page(url):

async with async_playwright() as p:

# 启动Chromium浏览器

browser=await p.chromium.launch()

# 创建新页面

page=await browser.new_page()

# 导航到目标URL

await page.goto(url)

# 等待页面上的某个元素加载完成(这里以等待页面上的某个特定元素为例)

await page.wait_for_selector('#some-selector')

# 获取并返回页面的HTML内容

content=await page.content()

await browser.close()

return content


# 示例URL(假设该URL页面包含动态加载的内容)

url='https://www.example.com/dynamic-page'

# 注意:由于示例使用async/await语法,需要在一个异步环境中调用该函数

# 例如,在Jupyter Notebook中可以使用await关键字(如果配置了支持),或者在异步函数中调用

import asyncio


async def main():

web_content=await fetch_dynamic_page(url)

print(web_content[:500] + '...') # 打印前500个字符作为示例


# 运行异步主函数

asyncio.run(main())

3.4 PyPlaywright的进阶使用

页面交互:通过page对象,可以模拟点击、输入、滚动等用户操作。

等待条件:使用wait_for_selector、wait_for_function等方法等待页面上的特定条件满足。

网络拦截:拦截并修改网络请求和响应,用于模拟请求、修改数据等。

截图和PDF导出:可以捕获页面的截图或将其导出为PDF文件。

四、requests与PyPlaywright的比较

使用场景:requests适合处理静态网页或简单的API请求;PyPlaywright适合处理需要浏览器渲染、动态内容加载的复杂网页。

性能:requests通常比PyPlaywright更快,因为它不需要启动浏览器;但PyPlaywright能够模拟真实用户的浏览器行为,更适合爬虫任务。

学习曲线:requests的API简单直观,易于上手;而PyPlaywright需要理解浏览器自动化测试的概念和API,学习曲线相对较陡。

五、总结

在Python网络爬虫中,requests和PyPlaywright是两个非常有用的库。requests以其简单易用和高效性成为处理静态网页和简单API请求的首选;而PyPlaywright则凭借其强大的浏览器自动化能力,在处理动态加载、JavaScript渲染等复杂网页时展现出巨大优势。根据具体的需求和场景选择合适的库,可以大大提高爬虫任务的效率和成功率。