下载文本中的网页源码,由于需要向下拉动滚动条所以使用pyppeteer渲染网页,并执行js代码,可是发现开启无界面的时候似乎执行不了js代码,还有异步的时候好像也执行不了js代码
import asyncio
from pyppeteer import launch
import re, os,time
async def create_page():
browser = await launch(headless=True, dumpio=True)
return browser
async def close_page(browser):
await browser.close()
async def start(sem, url):
# print(url)
async with sem: #控制协程的并发量
page = await browser.newPage()
await page.goto(url)
# for i in range(10): # 执行js代码向下滚动滚动条
# dimensions = await page.evaluate(f'var q=document.documentElement.scrollTop={i * 1000}')
# await asyncio.sleep(1)
# sn = re.search('sn=(.*?)&', url).group(1)
# with open(os.path.join(r'E:\study\out', f'{sn}.html'), 'ab') as f:
# data = await page.content()
# f.write(data.encode('utf8'))
print(await page.content())
await page.close()
if __name__ == '__main__':
sem = asyncio.Semaphore(5)
fundlist = []
path = r'C:\Users\Admin\Desktop\新建 文本文档.txt'
loop = asyncio.get_event_loop()
browser = loop.run_until_complete(create_page()) #创建一个浏览器对象
for line in open(path, 'r'):
fundlist.append(line)
task = [loop.create_task(start(sem, url)) for url in fundlist]
loop.run_until_complete(asyncio.wait(task))
loop.run_until_complete(close_page(browser))
使用pyppeteer时有个bug会报错,将源码改动下就ok
链接: 这里.
launch_kwargs = {
# 控制是否为无头模式
"headless": False,
# chrome启动命令行参数
"args": [
# 浏览器代理 配合某些中间人代理使用
"--proxy-server=http://127.0.0.1:8008",
# 最大化窗口
"--start-maximized",
# 取消沙盒模式 沙盒模式下权限太小
"--no-sandbox",
# 不显示信息栏 比如 chrome正在受到自动测试软件的控制 ...
"--disable-infobars",
# log等级设置 在某些不是那么完整的系统里 如果使用默认的日志等级 可能会出现一大堆的warning信息
"--log-level=3",
# 设置UA
"--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36",
],
"dumpio":True,
# 当界面开多了时会卡住,设置这个参数就不会了
# 用户数据保存目录 这个最好也自己指定一个目录
# 如果不指定的话,chrome会自动新建一个临时目录使用,在浏览器退出的时候会自动删除临时目录
# 在删除的时候可能会删除失败(不知道为什么会出现权限问题,我用的windows) 导致浏览器退出失败
# 然后chrome进程就会一直没有退出 CPU就会狂飙到99%
"userDataDir": "",
}
设置viewport 自动获取当前屏幕大小并设置viewport
# coding:utf8
import asyncio
from pyppeteer import launch
def screen_size():
"""使用tkinter获取屏幕大小"""
import tkinter
tk = tkinter.Tk()
width = tk.winfo_screenwidth()
height = tk.winfo_screenheight()
tk.quit()
return width, height
async def main():
launch_kwargs = {
"headless": False
}
# 启动浏览器
browser = await launch(launch_kwargs)
# 打开标签页
page = await browser.newPage()
# 默认 800 * 600 一般是不够的
print(page.viewport)
#
width, height = screen_size()
# 设置网页可视区域大小
await page.setViewport({
"width": width,
"height": height
})
await browser.close()
return
asyncio.get_event_loop().run_until_complete(main())
导出或加载cookie
# 取出cookie
cookies = await page.cookies()
# 这里可以做些什么 :)
pass
# 然后导入cookie
await page.setCookie(*cookies)