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: 總結 抒情
最簡單的肯定是 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
目前cutecharts支持的可視化圖像類型有:柱狀圖、折線圖、餅狀圖、雷達圖、散點圖。 我想后續作者還會增加的,比如:詞云圖、3D柱狀圖、條形圖等等。 另外,項目里已經給我們提供了測試用例,所以我們學習的時候就不用再去自己寫測試用例了,直接調用即可。
# 導入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
?
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
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
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
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? ?
【注】本文所有代碼都是在Jupyter Notebook下運行,理論上移到本地開發工具也是可以運行的,如有問題,請留言評論。
截止到2021.11.24 該網站外設入口已經不在了,但是數據接口還有,所以理論上以下代碼大家運行不會有任何問題,當然,大家還可以用來分析其他頁面數據,比如中國富豪榜單等,這類榜單數據大多是table標簽包裹,且為靜態加載,所以直接使用pandas.read_html即可很快獲取到數據。
"""
爬取中國電競價值排行榜-外設排行榜
網站: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)
獲取了電競與外設-鍵盤前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)
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”。
哇,終于寫完了,雖然本文技術含量不是那么高,但還是有很多地方是大家可以學習的,比如:認識個牛逼的人。 最后,我代替大家,其實也就是我自己想問的,問了大佬三個問題,這里分享給大家:
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渲染等復雜網頁時展現出巨大優勢。根據具體的需求和場景選擇合適的庫,可以大大提高爬蟲任務的效率和成功率。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。