Pyppeteer爬虫神器详解( 二 )


Pyppeteer爬虫神器详解

文章插图
 
  • 防止检测
现在很多网站的反爬已经可以检测自动化操作浏览器的爬虫了 , 主要就是检测webdriver , 因为我们使用的是selenium+webdriver的方式去驱动浏览器 , 所以都会留下webdriver的痕迹 , 会被平台识别 。那么如何规避呢?就要通过将webdriver隐藏来达到防止检测的目的 。Pyppeteer为我们提供了一个方法叫做evaluateOnnewDocument , 意思就是在每次加载页面的时候执行某个语句 , 所以我们可以在这里执行以下隐藏webdriver的命令 。
async def main():browser = await launch(headless=False, args=['--disable-infobars'])page = await browser.newPage()await page.evaluateOnNewDocument('Object.defineProperty(navigator, "webdriver", {get: () => undefined})')await page.goto('https://movie.douban.com/chart')await asyncio.sleep(100)
  • 页面大小设置
在之前的显示窗口中 , 我们会发现窗口显示并不完全 , 在某些页面会出现BUG , 因此我们应该尽量保证窗口完全显示 。这个时候就用到了设置窗口大小的方法 , 通过Page对象的setViewport方法设置就可以了 。
async def main():width = 1366height = 768browser = await launch(headless=False, args=['--disable-infobars'])page = await browser.newPage()await page.setViewport({'width': width, 'height': height})await page.goto('https://movie.douban.com/chart')await asyncio.sleep(100)
  • 用户数据持久化
通过前面的例子 , 我们发现一个问题 , 每次使用Pyppeteer打开浏览器的时候都是一个空白页 , 这样会有什么问题呢?如果遇到一个需要登录的网页 , 这次我们登录了 , 下一次启动又得登录一次 , 这就是一个问题 。
比如淘宝 , 平时我们浏览完淘宝后 , 关闭浏览器再打开 , 依然还是登录状态 。大家都知道 , 这是因为浏览器本地保存了Cookies的缘故 , 下次打开可以直接读取并保持登录状态 。这些信息一般保存在我们的用户目录下 , 如果我们能在浏览器启动的时候读取这些信息 , 那么启动的时候就可以恢复一些历史记录甚至是登录状态信息了 。
我们在使用Selenium或者Pyppeteer的时候 , 每次打开都是一个全新的浏览器 , 原因就是我们没有设置用户目录 , 如果设置了 , 那就可以读取一些信息在启动的时候加载上来 。Pyppeteer为我们提供了一个userDataDir参数来设置用户目录 , 这样就可以保持我们的访问状态了 。
async def main():width = 1366height = 768browser = await launch(headless=False, userDataDir='userdata', args=['--disable-infobars'])page = await browser.newPage()await page.setViewport({'width': width, 'height': height})await page.goto('https://mp.weixin.qq.com/')await asyncio.sleep(100)这里我们用微信公众号进行测试 , 首先运行一下 , 登陆一次公众号 , 然后我们可以打开当前目录下生成的userdata文件夹 , 里面内容如下:
Pyppeteer爬虫神器详解

文章插图
 
在此运行一下上面的代码 , 就直接进入我们的公众号管理界面 , 已经是登录状态了 , 就跳过了登录的流程 。当然了 , 我们知道Cookies基本都是有期限的 , 如果过期了就需要再次登录 。
Browser上面我们介绍了launch方法 , 它会返回一个Browser对象 , 我们来看看Browser类的定义:
class pyppeteer.browser.Browser(connection: pyppeteer.connection.Connection, contextIds: List[str], ignoreHTTPSErrors: bool, setDefaultViewport: bool, process: Optional[subprocess.Popen]=None, closeCallback: Callable[[], Awaitable[None]]=None, **kwargs)我们看到这个类的初始化参数有很多 , 但是我们上面基本上都是使用launch方法直接创建使用 。但是Browser类还是用于很多操作浏览器本身的方法 , 下面我们来介绍一些常用的 。
  • 开启无痕模式
Chrome浏览器本身是有一个无痕模式的 , 它的好处就是干净 , 不加载Cache、Cookies等内容 , 可以通过方法createIncogniteBrowserContext来开启:
async def main():width = 1366height = 768browser = await launch(headless=False, args=['--disable-infobars', f'--window-size={width}, {height}'])context = await browser.createIncogniteBrowserContext()page = await context.newPage()await page.setViewport({'width': width, 'height': height})await page.goto('https://mp.weixin.qq.com/')await asyncio.sleep(100)


推荐阅读