网络爬虫反反爬小技巧(二)Pyppeteer

  • Post author:
  • Post category:其他


上一节说到了Selenium,它的功能的确非常强大,但很多时候我们会发现 Selenium 还是有一些不太方便的地方,比如速度太慢、对版本配置要求严苛,最麻烦是经常要更新对应的驱动,还有些网页是可以检测到是否使用了Selenium 。

所以在这里我们就要请出爬虫神器 「Pyppeteer」 了,虽然支持的浏览器比较单一,但在安装配置的便利性和运行效率方面都要远胜 Selenium。Pyppeteer 依赖于 Chromium 这个浏览器来运行的。有了 Pyppeteer 之后,我们就可以免去那些烦琐的环境配置等问题。如果第一次运行的时候,Chromium 没有安装,那么程序会帮我们自动安装和配置。另外 Pyppeteer 是基于 Python 的新特性 async 实现的,所以它的一些执行也支持异步操作,效率相对于 Selenium 来说也提高了。(具体用法移步到:


https://miyakogi.github.io/pyppeteer/reference.html


)。(PyPI地址:


https://pypi.org/project/pyppeteer/


,最近一次更新时间: May 8, 2020)。

这里以一个简单demo展示其用法(以打开CSDN首页为例):

import asyncio
from pyppeteer import launch

async def main():
    browser = await launch(headless=False, args=['--disable-infobars'])
    page = await browser.newPage()
    await page.goto('https://www.csdn.net/')
    await asyncio.sleep(100)
    await browser.close()

asyncio.get_event_loop().run_until_complete(main())

不过在使用 Pyppeteer 仍然会遇到无头浏览器检测,这里安利一个第三方库「pyppeteer-stealth」,这个库是「puppeteer-extra-plugin-stealth」的Python移植版。

「puppeteer-extra-plugin-stealth」引用Github上的说明「Applies various evasion techniques to make detection of headless puppeteer harder.」「A plugin for

puppeteer-extra

to prevent detection.」(Github地址:


https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra-plugin-stealth


)。

可见,「pyppeteer-stealth」也是用于防止机器人检测的。(PyPI地址:


https://pypi.org/project/pyppeteer-stealth/


)。用法也很简单,这里粘上其在PyPI上的demo:

import asyncio
from pyppeteer import launch
from pyppeteer_stealth import stealth

async def main():
    browser = await launch(headless=True)
    page = await browser.newPage()

    await stealth(page)  # <-- Here

    await page.goto("https://bot.sannysoft.com/")
    await browser.close()
asyncio.get_event_loop().run_until_complete(main())

这样就可以省去隐藏WebDriver等操作,可谓省时省力省心。

最后,说下 Pyppeteer 使用带有权限验证的代理的方式,其中关键点有两个:

一个是在 args列表中的 ‘–proxy-server={proxy}’,它的作用是把代理 IP 传入到Pyppeteer 中。

第二个是 awaitpage.authenticate({‘username’:’账号’,’password’:’密码’})用于指定代理 IP 的账号和密码。

import asyncio
from pyppeteer import launch


async def register():
    browser = await launch({
        'headless': True,
        'args': ['--proxy-server={ip:port}']
    })

    page = await browser.newPage()
    # 设置代理ip验证
    await page.authenticate({
        'username': '用户名',
        'password': '密码'
    })
    await page.goto('http://icanhazip.com')
    doc = await page.content()
    print(doc)
    await browser.close()

asyncio.get_event_loop().run_until_complete(register())



版权声明:本文为qq_36957681原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。