上一节说到了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())