Python使用pyppeteer進(jìn)行網(wǎng)頁(yè)截圖并發(fā)送機(jī)器人實(shí)例
Pyppeteer是對(duì)Puppeteer的一個(gè)Python封裝,常用在爬蟲方面,最近使用它做網(wǎng)頁(yè)巡檢報(bào)告的截圖,記錄一下
腳本截圖
使用pyppeteer其實(shí)和我們自己開瀏覽器的邏輯差不多,同時(shí)要結(jié)合async一起使用,首先要通過lauch函數(shù)啟動(dòng)一個(gè)瀏覽器,啟動(dòng)瀏覽器的時(shí)候可以設(shè)置啟動(dòng)參數(shù),其中包括使用的代理服務(wù)器:
browser = await launch(args=["--no-sandbox", "--proxy-server=http://10.1.1.1:8443"])
啟動(dòng)瀏覽器后我們要開一個(gè)新的標(biāo)簽頁(yè)來(lái)訪問網(wǎng)頁(yè),goto就是用來(lái)訪問對(duì)應(yīng)的網(wǎng)頁(yè)的:
page = await browser.newPage() await page.goto(url)
現(xiàn)在我們就開始訪問對(duì)應(yīng)的網(wǎng)頁(yè)了,根據(jù)經(jīng)驗(yàn)我們都知道有的網(wǎng)頁(yè)剛開啟的時(shí)候不是完全渲染完的,所以可以添加一個(gè)asyncio.sleep(10)來(lái)等待十秒鐘:
await asyncio.sleep(10)
如果需要運(yùn)行一些js腳本語(yǔ)句,可以通過evaluate執(zhí)行:
dimensions = await page.evaluate('''() => {
return {
width: document.documentElement.scrollWidth,
height: document.documentElement.scrollHeight,
}
}''')
然后可以使用字典訪問對(duì)應(yīng)的數(shù)據(jù):
dimensions['height']
接下來(lái)就是截圖的操作了,甚至可以同時(shí)截成pdf,完整代碼如下:
async def main():
browser = await launch(args=["--no-sandbox", "--proxy-server=http://10.1.1.1:8443"])
# 新建選項(xiàng)卡
page = await browser.newPage()
await page.goto(url)
await asyncio.sleep(10)
dimensions = await page.evaluate('''() => {
return {
width: document.documentElement.scrollWidth,
height: document.documentElement.scrollHeight,
}
}''')
await page.setViewport({'width': 1920, 'height': dimensions['height']})
await page.screenshot({'path': "test.png", "clip": {"x": 300, "y": 10, "width": 1320, "height": dimensions['height']}})
await page.pdf({'path': file, 'width': 1920, 'height': dimensions['height']})
await browser.close()
發(fā)送到機(jī)器人
截圖和pdf都生成了,現(xiàn)在都可以發(fā)送給企業(yè)微信機(jī)器人了
發(fā)送圖片
def post_img_to_robot(page):
with open(page, 'rb') as file:
data = file.read()
encodestr = base64.b64encode(data)
image_data = str(encodestr, 'utf-8')
with open(page, 'rb') as file:
md = hashlib.md5()
md.update(file.read())
image_md5 = md.hexdigest()
data = {
"msgtype": "image",
"image": {
"base64": image_data,
"md5": image_md5
}
}
headers = {'content-type': 'application/json;charset=utf-8'}
body = json.dumps(data)
requests.post(qy_ex, data=body, headers=headers)
發(fā)送PDF
發(fā)送PDF按照教程需要先調(diào)用upload_media接口,然后在發(fā)送圖片的時(shí)候把media_id作為參數(shù)傳入
def post_file_to_robot(file):
parsed_url = urlparse(qy_ex)
param = parse_qs(parsed_url.query)
webHookKey = param["key"][0]
upload_url = f'https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?key={webHookKey}&type=file'
headers = {
"Accept": "application/json, text/plain, */*", "Accept-Encoding": "gzip, deflate",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.100 Safari/537.36"
}
data = {'file': open(file, 'rb')}
req = requests.post(url=upload_url, files=data, headers=headers).json()
media_id = req["media_id"]
data = {
"msgtype": "file",
"file": {"media_id": media_id}
}
requests.post(url=qy_ex, json=data)
發(fā)送效果如下:

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python實(shí)現(xiàn)輕松比較兩個(gè)文件夾的多種方法
在處理數(shù)據(jù)集時(shí),我們經(jīng)常會(huì)遇到兩個(gè)文件夾中文件數(shù)目不一致的情況,本文我們就來(lái)使用Python比較一下兩個(gè)文件夾,輕松實(shí)現(xiàn)找出多出的文件,有需要的可以了解下2025-09-09
python進(jìn)程間數(shù)據(jù)交互的幾種實(shí)現(xiàn)方式
本文主要介紹了python進(jìn)程數(shù)據(jù)交互的幾種實(shí)現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
python一鍵升級(jí)所有pip package的方法
下面小編就為大家?guī)?lái)一篇python一鍵升級(jí)所有pip package的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2017-01-01
分享python機(jī)器學(xué)習(xí)中應(yīng)用所產(chǎn)生的聚類數(shù)據(jù)集方法
本文根據(jù) 機(jī)器學(xué)習(xí)中常用的聚類數(shù)據(jù)集生成方法 中的內(nèi)容進(jìn)行編輯實(shí)驗(yàn)和整理而得,有需要的朋友可以參考想,希望可以對(duì)大家在聚類數(shù)據(jù)方面有所幫助2021-08-08

