import random
from pyppeteer import launch # 控制模拟浏览器用
from pyppeteer.dialog import Dialog
from retrying import retry # 设置重试次数用的
js1 = '''() =>{Object.defineProperties(navigator,{webdriver:{get: () => undefined} })}'''
js2 = '''() => {alert ( window.navigator.webdriver )}'''
async def close_dialog(page):
# 点击弹窗
# class*= 模糊匹配
await page.evaluate(
'''var temp=document.querySelector('button[class*="infotip__close"]');if(temp){temp.click()}''')
await page.evaluate(
'''var temp=document.querySelector('span[class="step-close"]');if(temp){temp.click()}''')
await page.evaluate(
'''var temp=document.querySelector("a[class*='dialog-close']");if(temp){temp.click()}''')
await page.evaluate('''document.querySelector("div[role='dialog']").remove()''')
await page.evaluate('''var temp=document.querySelector('button[class*="close"]');if(temp){rs.click()}''')
await page.evaluate('''var rs=document.querySelector('a[title="Close"]');if(rs){rs.click()}''')
await page.evaluate(
'''var heddens=document.querySelector("div[style*='overflow:hidden']");if(heddens){heddens.remove()}''')
a_tags = await page.xpath('//button[contains(@class,"close") or contains(@id,"close") or contains(@aria-label,"close")]')
a_tags1 = await page.xpath('//a[contains(@class,"close") or contains(@id,"close") or contains(@aria-label,"close") or contains(@title,"Close")]')
for a in a_tags + a_tags1:
a.click()
except:
async def main(url): # 定义main协程函数,
#插件路径
chrome_extension = r'C:\Users\Administrator.USER-20190313RI\AppData\Local\Chromium\User Data\Default\Extensions\dbclpoekepcmadpkeaelmhiheolhjflj\0.2.7_0'
args = ['--no-sandbox',
'--disable-gpu',
'--log-level=3', #日志等级
'--disable-infobars', # 关闭提示
'--window-size={},{}'.format(1080,950),
# "--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36",
'--load-extension={}'.format(chrome_extension), #加载扩展插件
'--disable-extensions-except={}'.format(chrome_extension),
if proxy:
ip=re.findall('(\d+\.\d+\.\d+\.\d+:\d+)',proxy)
if len(ip)>0:
args.append("--proxy-server=http://{}".format(proxy))
exepath = r'D:\Program_Files\chrome-win32\chrome.exe' #chromium浏览器路径
# dumpio:True 浏览器就不会卡住了
#浏览器启动参数
params={'executablePath': exepath,
"userDataDir": r"F:\temporary",
'headless': False,
'args':args,
'dumpio':True}
browser = await launch(params) # 启动pyppeteer 属于内存中实现交互的模拟器
page = await browser.newPage() # 启动个新的浏览器页面
await page.setUserAgent(
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36')
#设置页面超时
page.setDefaultNavigationTimeout(1000*60) #60s
#启用js
await page.setJavaScriptEnabled(True)
# 启用拦截器
# await page.setRequestInterception(True)
await page.evaluate(js1)
await page.evaluate(js2)
await page.setViewport({'width':1300,'height':868}) #设置界面
page.on('dialog', lambda dialog: asyncio.ensure_future(handle_dialog(page,dialog)))
await page.goto(url) # 访问登录页面
await asyncio.sleep(5)
# 关闭弹窗
await close_dialog(page)
await browser.close()
async def handle_dialog(page,dialog: Dialog):
print(dialog.message)#打印出弹框的信息
print(dialog.type)#打印出弹框的类型,是alert、confirm、prompt哪种
# print(dialog.defaultValue())#打印出默认的值只有prompt弹框才有
await page.waitFor(2000)#特意加两秒等可以看到弹框出现后取消
await dialog.dismiss()
# await dialog.accept(‘000’) #可以给弹窗设置默认值
import asyncioimport timeimport randomfrom pyppeteer import launch # 控制模拟浏览器用from pyppeteer.dialog import Dialogfrom retrying import retry # 设置重试次数用的js1 = '''() =>{ Object.defineProperties(navigator,{ webdriver:{ get: () =&...
import random
from
pyppeteer
import launch # 控制模拟浏览器用
from
pyppeteer
.
dialog
import
Dialog
from retrying import retry # 设置重试次数用的
js1 = '''() =>{Object.defineProperties(navigator,{webdriver:{get: () => undefined} })}'.
Selenium 在被使用的时候有个麻烦事,就是环境的相关配置,得安装好相关浏览器,比如
Chrome
、Firefox 等等,然后还要到官方网站去下载对应的驱动,最重要的还需要安装对应的 Python Selenium 库,确实是不是很方便,另外如果要做大规模部署的话,环境配置的一些问题也是个头疼的事情。那么本节就介绍另一个类似的替代品,叫做
Pyppeteer
。
Pyppeteer
简介
注意,本节讲解的模块叫做
Pyppeteer
,不是 Puppeteer。Puppeteer 是 Google 基于 Node.js 开发的一个工具,有了它我们可以通过
JavaScript
来控制
browser = await launch()
page = await browser.newPage()
res = await page.goto(url, options={'timeout': 30000})
data = await page.content()
title = await page
async def main():
browser = await
pyppeteer
.launch(headless=False, args=['--disable-infobars'])
page = await browser.newPage()
await page.setViewport({'width': 1366, 'height': 768})
await page.evaluateOnNe
async def main():
# 启动一个浏览器
browser = await launch(headless=False,args=['--disable-infobars'])
# 创建一个页面
page = await browser.newPage()
# 跳转到百度
爬虫小白,昨天领导给了个任务要抓一些数据,看了下页面以为是简单页面解析一下就可以,觉着没什么问题,之后发现被打脸了。
页面:http://query.bjeea.cn/queryService/rest/plan/134
要求:按院校查询和按专业查询的数据原样抓下来
1、出现的问题
最初采用requests+BeautifulSoup解析的方式,抓 按院校查询 的数据没有问题(代码在最后),但是在抓 按专业查询 的数据时出现抓到的页面和在浏览器看到不一致的情况,每次抓取都是按院校查询的数据,
最近在使用
pyppeteer
抓淘宝,同事使用
JavaScript
写调用puppeteer能完美运行。但我改成python就一直报这样一个错误:
pyppeteer
.errors.NetworkError: Protocol Error (Page.navigate): Session closed. Most likely the page has been closed
而代码中造成这样一个错误...